Я бы предложил вам попробовать следующий подход. В любом случае, для большого диапазона данных потребуется много времени ...
Предлагается использовать второй массив для загрузки, если общее количество комбинаций превысит максимально допустимое. Он мог бы использовать тот же массив, отбрасывая данные с максимальным пределом и равный Redim
для новых измерений, но я боялся, что смысл идеи может быть упущен ...
Sub testCombinations_()
'.......
Dim out2 As Range, outBis As Variant, acceptR As Double
Const maxR As Long = 1048574
acceptR = UBound(c1) * UBound(c2) * UBound(c3) * UBound(c4) * UBound(c5) * UBound(c6) * UBound(c7) * UBound(c8)
If acceptR > maxR Then
Set out1 = Range("J2", Range("Q2").Offset(maxR))
Set out2 = Range("T2", Range("AA2").Offset(acceptR - maxR))
out = out1.value
outBis = out2.value ' only for easy array dimensioning
Else
Set out1 = Range("J2", Range("Q2").Offset(acceptR))
out = out1.value
End If
'follow your code...
'..........
Do While q <= UBound(c8)
If r <= maxR Then
out(r, 1) = c1(j, 1)
out(r, 2) = c2(k, 1)
out(r, 3) = c3(L, 1)
out(r, 4) = c4(m, 1)
out(r, 5) = c5(n, 1)
out(r, 6) = c6(o, 1)
out(r, 7) = c7(p, 1)
out(r, 8) = c8(q, 1)
r = r + 1
q = q + 1
If r = maxR Then r = 1
Else
outBis(r, 1) = c1(j, 1)
outBis(r, 2) = c2(k, 1)
outBis(r, 3) = c3(L, 1)
outBis(r, 4) = c4(m, 1)
outBis(r, 5) = c5(n, 1)
outBis(r, 6) = c6(o, 1)
outBis(r, 7) = c7(p, 1)
outBis(r, 8) = c8(q, 1)
r = r + 1
q = q + 1
End If
Loop
'.........
out1.value = out
If UBound(outBis) > 1 Then out2.value = outBis
End Sub
Нравится общее замечание: Dim j, k, l, m, n, o, p, q, r As Long
затемнит все перечисления As Variant
и только последнее As Long
. И трудно следовать такому длинному вертикальному коду ... Я бы использовал: j = 1: k = 1: l = 1:...
и так далее для всех вертикальных «расположений». Вертикальный способ хорош и делает код более понятным только для небольшого числа переменных. Конечно, это не обязательно ...
Код, конечно, не проверен, и, возможно, его необходимо улучшить или исправить ...