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: