2015-09-29 49 views
0

我在想,如果有一個函數或函數組合創建組合(也許它需要VBA)在Excel中,這將有助於我解決以下問題:使用Excel

有8人在一組。我需要弄清楚並顯示從8中選出4個人時創建的所有可能的非重複組合。所選個人的順序並不重要。我只需要找到所有的獨特組合。

例如: 8個人是Bob,Carol,Ted,Alice,Reed,Sue,Johnny,Ben(單元格A1到A8每個都包含一個名稱)。

一個組合是鮑勃,特德,裏德,約翰尼。對於我的問題,名字的順序並不重要,這就意味着鮑勃,泰德,裏德,約翰尼和泰德,鮑勃,約翰尼,裏德一樣。所以這四個人的任何組合都算作一個實例。我不只是想弄清楚有多少種組合可能。我需要真正看到可能的組合。

+0

我想有沒有爲特定的東西預建功能。你在問代碼嗎?你有嘗試過嗎? – AndrewB

+0

也許類似[this](http://stackoverflow.com/questions/31454110/the-brute-force-method-using-vba-for-solving-an-equation-with-nine-unknown-varia?s= 3 | 0.0454)? – findwindow

+0

AndrewB - 我還沒有嘗試過任何代碼。部分原因是我希望可能有一些內置的函數會使編碼不必要,部分原因是由於我的VBA技能有限,我不知道從編碼開始到哪裏開始。我花了一些時間在紙上手工嘗試,看看編碼想法是否會變得明顯。沒有運氣。 – user3574547

回答

2

我建了一個二元評價:

Public Sub DebugAllCombinations(lPickSize As Long, sPossibilities As String, Optional sDelimiter As String = ";") 

    Dim i     As Long 
    Dim j     As Long 
    Dim sBIN    As String 
    Dim aPossibilities() As String 
    Dim lSum    As Long 
    Dim lHitCount   As Long 

    aPossibilities = Split(sPossibilities, sDelimiter) 

    For i = 1 To 2^(UBound(aPossibilities) + 1) - 1 
     lSum = 0 
     sBIN = WorksheetFunction.Dec2Bin(i) 
     For j = 1 To Len(sBIN) 
      lSum = lSum + CLng(Mid(sBIN, j, 1)) 
     Next j 
     If lSum = lPickSize Then 
      For j = 1 To Len(sBIN) 
       If Mid(sBIN, j, 1) = "1" Then Debug.Print aPossibilities(Len(sBIN) - j) & sDelimiter; 
      Next j 
      Debug.Print 
      lHitCount = lHitCount + 1 
     End If 
    Next i 

    Debug.Print lHitCount & " possibilities found" 

End Sub 

您可以使用它像這樣

DebugAllCombinations 4, "Person1;Person2;Person3;Person4;Person5;Person6;Person7;Person8" 

它將在即時窗口

0

沒有測試調試,但如果我理解你的問題對,我認爲這應該這樣做:

Sub combinationEnumeration(pool As String, elements As Integer, Optional delim As String) 
Dim poolArray() As String, result As String 

If delim = "" Then delim = ";" 
poolArray = Split(pool, delim) 

result = "Selection pool: " & pool & vbCr & "Number of selected elements: " & elements & vbCr & vbCr & "Result:" & vbCr 

For i = 0 To UBound(poolArray) - 3 
    For j = i + 1 To UBound(poolArray) - 2 
     For k = j + 1 To UBound(poolArray)) - 1 
      For l = k + 1 To UBound(poolArray) 
       result = result & poolArray(i) & poolArray(j) & poolArray(k) & poolArray(l) & ";" & vbCr 
      Next l 
     Next k 
    Next j 
Next i 

Debug.Print result 
End Sub 

用法:Call combinationEnumeration("A;B;C;D;E;F;G;H", 4)

編輯:修正小錯誤。代碼現在正確並輸出預期的結果數量。您將獲得70行,您可以通過解決二項式C(8,4)http://www.wolframalpha.com/input/?i=c%288%2C4%29進行仔細檢查。