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.
_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 (11891) áp dụng cho Microsoft Excel 2007, 2010, 2013, 2016, 2019 và Excel trong Office 365. Bạn có thể tìm thấy phiên bản của mẹo này cho giao diện menu cũ hơn của Excel tại đây: