之前的文章《Excel·VBA數(shù)組組合函數(shù)、組合求和》和《Excel·VBA數(shù)組排列函數(shù)》,都是針對一維數(shù)組的組合和排列
- 二維數(shù)組組合:對一個(gè)
m行*n列
的二維數(shù)組,每行抽取1個(gè)元素進(jìn)行組合,則共有n ^ m
個(gè)組合
1,二維數(shù)組組合函數(shù)
代碼思路,類似之前的文章“VBA排列函數(shù)”尾數(shù)循環(huán)的方式
Function combin_arr2d(arr)
'arr二維數(shù)組,內(nèi)含m行*n列元素,每行抽取1個(gè)進(jìn)行組合,返回一維嵌套數(shù)組,每行為一個(gè)組合(數(shù)組從1開始計(jì)數(shù))
Dim i&, j&, m&, n&, kk&, result, k&, x&, r&
If LBound(arr) = 0 Or LBound(arr, 2) = 0 Then '轉(zhuǎn)為從1開始計(jì)數(shù)
arr = WorksheetFunction.Transpose(WorksheetFunction.Transpose(arr))
End If
m = UBound(arr): n = UBound(arr, 2): ReDim b&(1 To m - 1)
kk = n ^ m: ReDim result(1 To kk): ReDim res(1 To m): k = 1
For i = 1 To m - 1 '非尾數(shù)部分初始值
b(i) = 1
Next
Do
For i = k To m - 1 '非尾數(shù)部分
res(i) = arr(i, b(i))
Next
For j = 1 To n '僅修改尾數(shù)
res(m) = arr(m, j): r = r + 1: result(r) = res
Next
x = m - 1: b(x) = b(x) + 1 '尾數(shù)循環(huán)結(jié)束后,m-1位進(jìn)位
Do While b(x) > n '循環(huán)進(jìn)位,原位重新為1
If x > 1 Then b(x) = 1: x = x - 1: b(x) = b(x) + 1 Else Exit Do
Loop
k = x '非尾數(shù)部分,需要重新賦值的開始位置
If b(1) > n Then Exit Do '所有組合完成
Loop Until r = kk
combin_arr2d = result
End Function
舉例
組合結(jié)果為一維嵌套數(shù)組,寫入表格需轉(zhuǎn)為二維數(shù)組,以下代碼調(diào)用了《Excel·VBA數(shù)組行列轉(zhuǎn)換函數(shù)》TransposeArr
函數(shù)(如需使用代碼需復(fù)制)
Sub combin_arr2d組合輸出()
Dim arr, brr, crr
arr = [a1].CurrentRegion
brr = combin_arr2d(arr) '調(diào)用函數(shù)返回組合,一維嵌套數(shù)組
crr = TransposeArr(brr, 2) '轉(zhuǎn)為二維數(shù)組
Cells(1, "e").Resize(UBound(crr), UBound(crr, 2)) = crr
End Sub
對表格中A1:C5區(qū)域共5行3列,每行抽取每行抽取1個(gè)元素進(jìn)行組合,共有3 ^ 5 = 243個(gè)組合,如圖(部分截圖)文章來源:http://www.zghlxwxcb.cn/news/detail-678695.html
2,組合求和
Sub combin_arr2d組合求和()
Dim arr, brr, b, h, h2, i&, temp_sum, write_col$, w&
'--------------------參數(shù)填寫:arr二維數(shù)組,h和值下限,h2和值上限,write_col結(jié)果寫入列號
arr = [a1:c14]: h = 36: h2 = 43
write_col = "e": w = 1: Cells(w, write_col).Resize(1, 2) = Array("和值", "組合")
tm = Timer: brr = combin_arr2d(arr) '調(diào)用函數(shù)返回組合,一維嵌套數(shù)組
For Each b In brr
temp_sum = WorksheetFunction.sum(b)
If Abs(Round(temp_sum - h, 6)) < (0.1 ^ 6) Or Abs(Round(temp_sum - h2, 6)) < (0.1 ^ 6) _
Or (temp_sum >= h And temp_sum <= h2) Then
w = w + 1: Cells(w, write_col).Resize(1, 2) = Array(temp_sum, Join(b, "+"))
End If
Next
Debug.Print "組合求和完成,累計(jì)用時(shí):" & Format(Timer - tm, "0.00") '耗時(shí)
End Sub
《excel吧-從每一行中選一個(gè)數(shù),最后總和范圍是36~43的所有可能情況列出來怎么弄?》對表格中A1:C14區(qū)域共14行3列,進(jìn)行組合共有3 ^ 14 = 4,782,969個(gè)組合,求和值范圍為36-43的所有組合,共有525,087個(gè)組合符合要求,如圖(部分截圖)
測試耗時(shí)秒數(shù)
二維數(shù)組組合求和的代碼運(yùn)行速度較《Excel·VBA數(shù)組組合函數(shù)、組合求和》的例子慢了很多文章來源地址http://www.zghlxwxcb.cn/news/detail-678695.html
組合類型 | 一維數(shù)組組合 | 二維數(shù)組組合 |
---|---|---|
組合個(gè)數(shù) | 5,242,887 | 4,782,969 |
耗時(shí)秒數(shù) | 2.67 | 60.61 |
到了這里,關(guān)于Excel·VBA二維數(shù)組組合函數(shù)、組合求和的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!