Q:數(shù)據(jù)放置在列A中,我要得到這些數(shù)據(jù)中任意3個數(shù)據(jù)的所有可能組合。如下圖1所示,列A中存放了5個數(shù)據(jù),要得到這5個數(shù)據(jù)中任意3個數(shù)據(jù)的所有可能組合,如列B中所示。如何實現(xiàn)?
圖1
(注:這是無意中看到的一個問題,我覺得程序編寫得很巧妙,使用了遞歸的方法來解決,非常簡潔,特將該解答稍作整理后輯錄于此與大家分享!)
A:VBA代碼如下:
Sub Combinations()
Dim rng As Range
Dim n AsLong
Dim vElements As Variant
Dim lRow As Long
Dim vResult As Variant
‘要組合的數(shù)據(jù)在當前工作表的列A
Set rng =Range(“A1”, Range(“A1”).End(xlDown))
‘設置每個組合需要的數(shù)據(jù)個數(shù)
n = 3
‘在數(shù)組中存儲要組合的數(shù)據(jù)
vElements =Application.Index(Application.Transpose(rng), 1, 0)
‘重定義進行組合的數(shù)組大小
ReDim vResult(1 To n)
Call CombinationsREC(vElements, CInt(n), vResult, lRow, 1, 1)
End Sub
Sub CombinationsREC(vElements As Variant, _
p As Integer,_
vResult AsVariant, _
lRow As Long,_
iElement AsInteger, _
iIndex AsInteger)
Dim i AsInteger
For i =iElement To UBound(vElements)
vResult(iIndex)= vElements(i)
IfiIndex = p Then
lRow = lRow + 1
Range(“B” & lRow) = Join(vResult, “, “)
‘每組組合放置在多列中
Range(“C” &lRow).Resize(, p) = vResult
Else
‘遞歸調用
Call CombinationsREC(vElements, p, vResult, lRow, i + 1, iIndex + 1)
End If
Next i
End Sub
代碼的關鍵在于遞歸調用的實現(xiàn),有興趣的朋友可以使用F8鍵逐語句運行代碼觀察代碼效果,來理解實現(xiàn)過程。
代碼的圖片版如下: