Kết hợp danh sách (Microsoft Excel)
Ron biết anh ấy có thể sử dụng hàm COMBIN để xác định số lượng các tổ hợp có thể được tạo ra từ một số chữ số. Tuy nhiên, anh ấy đang tự hỏi liệu có cách nào để liệt kê ra tất cả các cách kết hợp.
Không có cách tích hợp nào để liệt kê các kết hợp trong Excel. Tuy nhiên, bạn có thể tạo macro để thực hiện việc liệt kê cho bạn. Nếu bạn muốn tìm các kết hợp duy nhất trong tập hợp các số liên tiếp bắt đầu từ 1, thì tập hợp macro sau sẽ thực hiện thủ thuật. Tất cả những gì bạn cần làm là chạy hàm TestCNR và bạn sẽ nhận được một “ma trận” các ô đại diện cho số lượng tổ hợp 4 chữ số trong bộ giá trị tuần tự từ 1 đến 10.
Sub TestCNR() Cnr 10, 4 End Sub
Sub Cnr(n, r) i = 1 For j = 1 To r Cells(i, j).Value = j Next Do Until Finished(n, r, i) j = FindFirstSmall(n, r, i) For k = 1 To j — 1 Cells(i + 1, k).Value = Cells(i, k).Value Next Cells(i + 1, j).Value = Cells(i, j).Value + 1 For k = j + 1 To r Cells(i + 1, k).Value = Cells(i + 1, k - 1).Value + 1 Next i = i + 1 Loop End Sub
Function Finished(n, r, i) Temp = True For j = r To 1 Step -1 If Cells(i, j).Value <> j + (n - r) Then Temp = False End If Next Finished = Temp End Function Function FindFirstSmall(n, r, i) j = r Do Until Cells(i, j).Value <> j + (n - r) j = j - 1 Loop FindFirstSmall = j End Function
Macro ghi đè bất kỳ thứ gì có trong trang tính của bạn, vì vậy hãy đảm bảo rằng bạn chạy thử nghiệm với một trang tính trống được hiển thị. Nếu bạn muốn thay đổi kích thước của tập hợp hoặc số phần tử trong tập hợp con, chỉ cần thay đổi các giá trị được truyền trong quy trình TestCNR.
Nếu bạn muốn kéo các kết hợp duy nhất từ một chuỗi ký tự (ví dụ: các chữ cái trong bảng chữ cái), thì bạn cần sử dụng một bộ macro khác. Sau đây sẽ hoạt động tốt; nó giả định rằng các ký tự bạn muốn sử dụng làm “vũ trụ” của mình nằm trong ô A1 và số bạn muốn trong mỗi kết hợp duy nhất nằm trong ô A2.
Sub FindSets() Dim iA() As Integer Dim sUniv As String Dim iWanted As Integer Dim j As Integer Dim k As Integer sUniv = Cells(1, 1).Value iWanted = Cells(2, 1).Value ReDim iA(iWanted) For j = 1 To iWanted iA(j) = j Next j iRow = PutRow(iA, sUniv, 1) Do Until DoneYet(iA, Len(sUniv)) j = WorkHere(iA, Len(sUniv)) iA(j) = iA(j) + 1 For k = j + 1 To iWanted iA(k) = iA(k - 1) + 1 Next k iRow = PutRow(iA, sUniv, iRow) Loop End Sub
Function DoneYet(iB, n) As Boolean iMax = UBound(iB) Temp = True For j = iMax To 1 Step -1 If iB(j) <> j + (n - iMax) Then Temp = False End If Next DoneYet = Temp End Function
Function WorkHere(iB, n) As Integer iMax = UBound(iB) j = iMax Do Until iB(j) <> j + (n - iMax) j = j - 1 Loop WorkHere = j End Function
Function PutRow(iB, sUniv, i) iMax = UBound(iB) sTemp = "" For j = 1 To iMax sTemp = sTemp & Mid(sUniv, iB(j), 1) Next j Cells(i, 2).Value = sTemp PutRow = i + 1 End Function
Chạy macro FindSets và các kết hợp khác nhau mong muốn kết thúc trong cột 2. Tuy nhiên, hãy cẩn thận khi chạy macro. Số lượng kết hợp có thể rất lớn rất nhanh chóng. Ví dụ: nếu bạn đặt 26 chữ cái (A đến Z) vào ô A1 và giá trị 5 trong ô A2, macro sẽ bị lỗi. Tại sao? Bởi vì có 65.780 kết hợp năm ký tự có thể có và chỉ có 65.536 hàng để đặt chúng.
_Lưu ý: _
Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên trang ExcelTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.
ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.
Mẹo này (6766) áp dụng cho Microsoft Excel 97, 2000, 2002 và 2003. Bạn có thể tìm thấy phiên bản của mẹo này cho giao diện ribbon của Excel (Excel 2007 trở lên) tại đây: