亞寵展、全球寵物產業風向標——亞洲寵物展覽會深度解析
730
2025-04-02
如何按指定個數在Excel中獲得一列數據的所有可能組合?
Q:數據放置在列A中,我要得到這些數據中任意3個數據的所有可能組合。如下圖1所示,列A中存放了5個數據,要得到這5個數據中任意3個數據的所有可能組合,如列B中所示。如何實現?
圖1
(注:這是無意中看到的一個問題,我覺得程序編寫得很巧妙,使用了遞歸的方法來解決,非常簡潔,特將該解答稍作整理后輯錄于此與大家分享!)
A:VBA代碼如下:
Sub Combinations()
Dim rng As Range
Dim n AsLong
Dim vElements As Variant
Dim lRow As Long
Dim vResult As Variant
‘要組合的數據在當前工作表的列A
Set rng =Range(“A1”, Range(“A1”).End(xlDown))
‘設置每個組合需要的數據個數
n = 3
‘在數組中存儲要組合的數據
vElements =Application.Index(Application.Transpose(rng), 1, 0)
‘重定義進行組合的數組大小
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
代碼的關鍵在于遞歸調用的實現,有興趣的朋友可以使用F8鍵逐語句運行代碼觀察代碼效果,來理解實現過程。
代碼的圖片版如下:
如果將代碼中注釋掉的代碼恢復,也就是將組合結果放置在多列中,運行后的結果如下圖2所示。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。