'排列或者组合算法
Public ResultArr() As String, SorceArr, SumN As Currency '结果数组,源数组,结果总数
Sub CombinAll(ByVal m As Byte, ByVal N As Byte, Optional types As Byte = 0) 'types=0为排列 types=1 为组合
Dim num As Long, i As Integer, k As Integer, L%, a(), s() As String
SumN = Application.Combin(m, N) '计算组合数量
If types = 0 Then SumN = SumN * Application.Fact(N) '计算排列数量
ReDim a(1 To N) '临时数组
ReDim ResultArr(1 To SumN, 0) '结果数组
k = 1
Do
a(k) = a(k) + 1
If a(k) > m Then
k = k - 1
Else
For i = 1 To k - 1
If a(k) = a(i) Then Exit For
Next
If i = k Then
If k = N Then
num = num + 1
For L = 1 To N
ResultArr(num, 0) = ResultArr(num, 0) & " " & SorceArr(a(L), 1)
Next
End If
If k < N Then k = k + 1: a(k) = a(k - 1) * types
End If
End If
Loop Until k = 0
End Sub
Function 排列组合(rng As Range, N)
SorceArr = rng.Value
Call CombinAll(UBound(SorceArr), N)
排列组合 = ResultArr
End Function