VBA Excel中的排列组合

我正在试图产生一个字符数组的所有可能的组合。 input数组有n个字符,5 <= n <= 7,我想生成包含所有C(n,5)组合的第二个数组A(C(n,5),5)。 数组中字符的顺序并不重要。

这里是一个例子:input数组:{A,B,C,D,E,F},所以n = 6的输出数组应该是:

{ABCDE}, {ABCDF}, {ABCFE}, {ABFDE}, {AFCDE}, {FBCDE}, 

对于n = 5和n = 6,这是相当简单的,但对于n = 7变得非常复杂。 有谁知道我应该如何做到这一点?

谢谢

解决recursion。

例如,你的n = 7的情况。 在外层,你从{A,B,C,D,E,F,G}开始。 从这里,你拿出一封信, 一个不同的7次。 所以你在这个输出数组集中有7个元素,每个元素都有6个字母:{A,B,C,D,E,F},{A,B,C,D,E,G}等

对于这些输出中的每一个 ,然后使用相同的algorithm进一步减less。 你已经知道如何处理{A,B,C,D,E,F}。

这只是Bathsheba的build议的执行,将会产生所有的五分之一。 首先将以下UDF插入标准模块中:

 Public Function DropCH(sIn As String, L As Long) As String If L = 1 Then DropCH = Mid(sIn, 2) Exit Function End If ll = Len(sIn) If ll = L Then DropCH = Left(sIn, L - 1) Exit Function End If If L > ll Then DropCH = "" Exit Function End If DropCH = Mid(sIn, 1, L - 1) & Mid(sIn, L + 1) End Function 

然后在A1中放置7个字符的string。 然后在C1中input:

 =DropCH($A$1,COLUMNS($A:A)) 

并通过I1C1复制到D1

C2中input:

 =DropCH(C$1,ROW()-1) 

并通过I2D2复制C2

然后删除重复运行这个macros:

 Sub DropDuplicates() Dim c As Collection, K As Long Set c = New Collection On Error Resume Next K = 1 For Each r In Range("C2:I7") If r.Value <> "" Then c.Add r.Value, CStr(r.Value) If Err.Number = 0 Then Cells(K, "J").Value = r.Value K = K + 1 Else Err.Number = 0 End If End If Next r On Error GoTo 0 End Sub 

这将把结果放在J栏中

在这里输入图像说明

只是find了一个recursion的方法,避免了双重结果。 代码是非常丑陋的,因为我没有时间思考如何在这里使用循环。

Public Function Permutacao(card1 As String,card2 As String,card3 As String,card4 As String,card5 As String,Optional card6 As String,Optional card7 As String)

 Dim A(1 To 7) As String Dim aux_A(1 To 7, 1 To 6) As String Dim aux2_A(1 To 6, 1 To 5) As String Dim final_A(1 To 42, 1 To 6) As String n = 5 A(1) = card1 A(2) = card2 A(3) = card3 A(4) = card4 A(5) = card5 If Not IsMissing(card6) Then A(6) = card6 n = 6 End If If Not IsMissing(card7) Then A(7) = card7 n = 7 End If If n = 5 Then final_A(1, 1) = A(1) final_A(1, 2) = A(2) final_A(1, 3) = A(3) final_A(1, 4) = A(4) final_A(1, 5) = A(5) ElseIf n = 6 Then k = 1 final_A(k, 1) = A(1) final_A(k, 2) = A(2) final_A(k, 3) = A(3) final_A(k, 4) = A(4) final_A(k, 5) = A(5) k = 2 final_A(k, 1) = A(1) final_A(k, 2) = A(2) final_A(k, 3) = A(3) final_A(k, 4) = A(4) final_A(k, 5) = A(6) k = 3 final_A(k, 1) = A(1) final_A(k, 2) = A(2) final_A(k, 3) = A(3) final_A(k, 4) = A(6) final_A(k, 5) = A(5) k = 4 final_A(k, 1) = A(1) final_A(k, 2) = A(2) final_A(k, 3) = A(6) final_A(k, 4) = A(4) final_A(k, 5) = A(5) k = 5 final_A(k, 1) = A(1) final_A(k, 2) = A(6) final_A(k, 3) = A(3) final_A(k, 4) = A(4) final_A(k, 5) = A(5) k = 6 final_A(k, 1) = A(6) final_A(k, 2) = A(2) final_A(k, 3) = A(3) final_A(k, 4) = A(4) final_A(k, 5) = A(5) ElseIf n = 7 Then k = 1 aux_A(k, 1) = A(1) aux_A(k, 2) = A(2) aux_A(k, 3) = A(3) aux_A(k, 4) = A(4) aux_A(k, 5) = A(5) aux_A(k, 6) = A(6) k = 2 aux_A(k, 1) = A(1) aux_A(k, 2) = A(2) aux_A(k, 3) = A(3) aux_A(k, 4) = A(4) aux_A(k, 5) = A(5) aux_A(k, 6) = A(7) k = 3 aux_A(k, 1) = A(1) aux_A(k, 2) = A(2) aux_A(k, 3) = A(3) aux_A(k, 4) = A(4) aux_A(k, 5) = A(7) aux_A(k, 6) = A(6) k = 4 aux_A(k, 1) = A(1) aux_A(k, 2) = A(2) aux_A(k, 3) = A(3) aux_A(k, 4) = A(7) aux_A(k, 5) = A(5) aux_A(k, 6) = A(6) k = 5 aux_A(k, 1) = A(1) aux_A(k, 2) = A(2) aux_A(k, 3) = A(7) aux_A(k, 4) = A(4) aux_A(k, 5) = A(5) aux_A(k, 6) = A(6) k = 6 aux_A(k, 1) = A(1) aux_A(k, 2) = A(7) aux_A(k, 3) = A(3) aux_A(k, 4) = A(4) aux_A(k, 5) = A(5) aux_A(k, 6) = A(6) k = 7 aux_A(k, 1) = A(7) aux_A(k, 2) = A(2) aux_A(k, 3) = A(3) aux_A(k, 4) = A(4) aux_A(k, 5) = A(5) aux_A(k, 6) = A(6) c = 1 k = 1 While k <= 7 If k < 2 Then final_A(c, 1) = aux_A(k, 1) final_A(c, 2) = aux_A(k, 2) final_A(c, 3) = aux_A(k, 3) final_A(c, 4) = aux_A(k, 4) final_A(c, 5) = aux_A(k, 5) c = c + 1 End If If k < 3 Then final_A(c, 1) = aux_A(k, 1) final_A(c, 2) = aux_A(k, 2) final_A(c, 3) = aux_A(k, 3) final_A(c, 4) = aux_A(k, 4) final_A(c, 5) = aux_A(k, 6) c = c + 1 End If If k < 4 Then final_A(c, 1) = aux_A(k, 1) final_A(c, 2) = aux_A(k, 2) final_A(c, 3) = aux_A(k, 3) final_A(c, 4) = aux_A(k, 6) final_A(c, 5) = aux_A(k, 5) c = c + 1 End If If k < 5 Then final_A(c, 1) = aux_A(k, 1) final_A(c, 2) = aux_A(k, 2) final_A(c, 3) = aux_A(k, 6) final_A(c, 4) = aux_A(k, 4) final_A(c, 5) = aux_A(k, 5) c = c + 1 End If If k < 6 Then final_A(c, 1) = aux_A(k, 1) final_A(c, 2) = aux_A(k, 6) final_A(c, 3) = aux_A(k, 3) final_A(c, 4) = aux_A(k, 4) final_A(c, 5) = aux_A(k, 5) c = c + 1 End If If k < 7 Then final_A(c, 1) = aux_A(k, 6) final_A(c, 2) = aux_A(k, 2) final_A(c, 3) = aux_A(k, 3) final_A(c, 4) = aux_A(k, 4) final_A(c, 5) = aux_A(k, 5) c = c + 1 End If k = k + 1 Wend End If Permutacao = final_A 

结束function