【发布时间】:2016-07-13 16:22:43
【问题描述】:
这里有几个关于 VBA 代码的对话,用于在 Excel 中查找具有不同数据长度的多列之间的所有可能组合。对话包括 3、4 和 5 列,但我需要用 14 列来执行此操作。这次对话中给出的 5 列代码是我使用的: VBA - Write all possible combinations of 4 columns of data 但是我收到以下错误:“运行时错误'6':溢出”,当我去调试时它会突出显示这一行:
Set out1 = Range("G2", Range("K2").Offset(UBound(c1) * UBound(c2) * UBound(c3) * UBound(c4) * UBound(c5) * UBound(c6) * UBound(c7) * UBound(c8) * UBound(c9) * UBound(c10) * UBound(c11) * UBound(c12) * UBound(c13) * UBound(c14)))
这是我从我找到的 5 列示例中调整的完整代码:
Sub combinations()
Dim c1() As Variant
Dim c2() As Variant
Dim c3() As Variant
Dim c4() As Variant
Dim c5() As Variant
Dim c6() As Variant
Dim c7() As Variant
Dim c8() As Variant
Dim c9() As Variant
Dim c10() As Variant
Dim c11() As Variant
Dim c12() As Variant
Dim c13() As Variant
Dim c14() As Variant
Dim out() As Variant
Dim j, k, l, m, n, o, p, q, r, s, t, u, v, w, x As Long
Dim col1 As Range
Dim col2 As Range
Dim col3 As Range
Dim col4 As Range
Dim col5 As Range
Dim col6 As Range
Dim col7 As Range
Dim col8 As Range
Dim col9 As Range
Dim col10 As Range
Dim col11 As Range
Dim col12 As Range
Dim col13 As Range
Dim col14 As Range
Dim out1 As Range
Set col1 = Range("A66", Range("A66").End(xlDown))
Set col2 = Range("B66", Range("B66").End(xlDown))
Set col3 = Range("C66", Range("C66").End(xlDown))
Set col4 = Range("D66", Range("D66").End(xlDown))
Set col5 = Range("E66", Range("E66").End(xlDown))
Set col6 = Range("F66", Range("F66").End(xlDown))
Set col7 = Range("G66", Range("G66").End(xlDown))
Set col8 = Range("H66", Range("H66").End(xlDown))
Set col9 = Range("I66", Range("I66").End(xlDown))
Set col10 = Range("J66", Range("J66").End(xlDown))
Set col11 = Range("K66", Range("K66").End(xlDown))
Set col12 = Range("L66", Range("L66").End(xlDown))
Set col13 = Range("M66", Range("M66").End(xlDown))
Set col14 = Range("N66", Range("N66").End(xlDown))
c1 = col1
c2 = col2
c3 = col3
c4 = col4
c5 = col5
c6 = col6
c7 = col7
c8 = col8
c9 = col9
c10 = col10
c11 = col11
c12 = col12
c13 = col13
c14 = col14
Set out1 = Range("P66", Range("AC66").Offset(UBound(c1) * UBound(c2) * UBound(c3) * UBound(c4) * UBound(c5) * UBound(c6) * UBound(c7) * UBound(c8) * UBound(c9) * UBound(c10) * UBound(c11) * UBound(c12) * UBound(c13) * UBound(c14)))
out = out1
j = 1
k = 1
l = 1
m = 1
n = 1
o = 1
p = 1
q = 1
r = 1
s = 1
t = 1
u = 1
v = 1
w = 1
x = 1
Do While j <= UBound(c1)
Do While k <= UBound(c2)
Do While l <= UBound(c3)
Do While m <= UBound(c4)
Do While n <= UBound(c5)
Do While o <= UBound(c6)
Do While p <= UBound(c7)
Do While q <= UBound(c8)
Do While r <= UBound(c9)
Do While s <= UBound(c10)
Do While t <= UBound(c11)
Do While u <= UBound(c12)
Do While v <= UBound(c13)
Do While w <= UBound(c14)
out(o, 1) = c1(j, 1)
out(o, 2) = c2(k, 1)
out(o, 3) = c3(l, 1)
out(o, 4) = c4(m, 1)
out(o, 5) = c5(n, 1)
out(o, 6) = c6(o, 1)
out(o, 7) = c7(p, 1)
out(o, 8) = c8(q, 1)
out(o, 9) = c9(r, 1)
out(o, 10) = c10(s, 1)
out(o, 11) = c11(t, 1)
out(o, 12) = c12(u, 1)
out(o, 13) = c13(v, 1)
out(o, 14) = c14(w, 1)
x = x + 1
w = w + 1
Loop
w = 1
v = v + 1
Loop
v = 1
u = u + 1
Loop
u = 1
t = t + 1
Loop
t = 1
s = s + 1
Loop
s = 1
r = r + 1
Loop
r = 1
q = q + 1
Loop
q = 1
p = p + 1
Loop
p = 1
o = o + 1
Loop
o = 1
n = n + 1
Loop
n = 1
m = m + 1
Loop
m = 1
l = l + 1
Loop
l = 1
k = k + 1
Loop
k = 1
j = j + 1
Loop
out1.Value = out
结束子
另外,作为说明,我尝试调整代码,以便我的输入从电子表格的顶部开始(A1 和我目前拥有的 A66),但这并没有帮助。此外,我知道在我用作参考的原始代码中,它列出了“Dim j As Long、k As Long、l As Long 等)并且我缩短了它,但我最初使用的是长格式,但仍然出现错误. 任何帮助将不胜感激。我是 VBA 的完全业余爱好者,所以如果错误很明显,我深表歉意。我试图研究错误代码,但我找不到我的具体为什么搞砸了。非常感谢你的时间。
非常尊重, T.
【问题讨论】:
-
十四栏?每列有多少个值?我怀疑这将是大量的组合...编辑:每列中只有 3 个值,您将拥有大约 470 万个组合
-
我想通过
UBound(c1) * UBound(c2) * UBound(c3) * UBound(c4) * UBound(c5) * UBound(c6) * UBound(c7) * UBound(c8) * UBound(c9) * UBound(c10) * UBound(c11) * UBound(c12) * UBound(c13) * UBound(c14)行数偏移的结果将超过工作表上的行数! -
@TimWilliams,七列只有一个值,而最大的列有 8 个值。你认为尺寸是我收到错误的原因吗?因为如果 10 列是一个更合理的数字,我可以尝试组合属性。我的最终目标是根据我拥有的项目的调查数据创建一个仪表板,所以我需要这些组合来填充它。每一列都有不同的独立属性和分数,我想创建一个仪表板,我可以在其中使用切片器选择各种所需的属性,并将填充符合这些属性的项目。
-
将所有 14 列中的所有项目数相乘 - 结果是什么?
-
@TimWilliams 是 235,200