#excel #vba #overflow
#excel #vba #переполнение
Вопрос:
У меня есть этот код, целью которого является получение всех возможных комбинаций в зависимости от фильтров, выбранных пользователем. Столбцы от L до P — это места, где находятся выбранные фильтры (в зависимости от фильтра они могут варьироваться от 1 до 12), а диапазон от V7 до Z7 — это то место, где я хочу отобразить комбинации.
По другим подобным вопросам с той же ошибкой основной причиной является переменный тип «long», но я уже использую его, как они предложили.
Columns("V:Z").Select
Selection.ClearContents
Dim c1() As Variant
Dim c2() As Variant
Dim c3() As Variant
Dim c4() As Variant
Dim c5() As Variant
Dim out() As Variant
Dim l As Long, m As Long, n As Long, o As Long, p As Long, q As Long
Dim col1 As Range
Dim col2 As Range
Dim col3 As Range
Dim col4 As Range
Dim col5 As Range
Dim out1 As Range
Set col1 = Range("L7", Range("L7").End(xlDown))
Set col2 = Range("M7", Range("M7").End(xlDown))
Set col3 = Range("N7", Range("N7").End(xlDown))
Set col4 = Range("O7", Range("O7").End(xlDown))
Set col5 = Range("P7", Range("P7").End(xlDown))
c1 = col1
c2 = col2
c3 = col3
c4 = col4
c5 = col5
'Here is where I get the error
Set out1 = Range("V7", Range("Z7").Offset(UBound(c1) * UBound(c2) * UBound(c3) * UBound(c4) * UBound(c5)))
out = out1
l = 1
m = 1
n = 1
o = 1
p = 1
q = 1
Do While l <= UBound(c1)
Do While m <= UBound(c2)
Do While n <= UBound(c3)
Do While o <= UBound(c4)
Do While p <= UBound(c5)
out(q, 1) = c1(l, 1)
out(q, 2) = c2(m, 1)
out(q, 3) = c3(n, 1)
out(q, 4) = c4(o, 1)
out(q, 5) = c5(p, 1)
q = 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
out1.Value = out
Комментарии:
1. Я уверен
UBound(c1) * UBound(c2) * UBound(c3) * UBound(c4) * UBound(c5)
, что больше, чем 1048569.2. Я вычисляю максимальное количество комбинаций, которые могут существовать, и общее количество равно 608304. Может ли быть так, что я написал код, который дает большее число, чем это?
Ответ №1:
Найдено решение после проверки строки за строкой кода. Собираюсь оставить это здесь на случай, если кому-то это понадобится в будущем. В принципе, если в качестве фильтра было выбрано только одно значение (столбцы от L до P), чем диапазоны
Set col1 = Range("L6", Range("L6").End(xlDown))
Set col2 = Range("M6", Range("M6").End(xlDown))
Set col3 = Range("N6", Range("N6").End(xlDown))
Set col4 = Range("O6", Range("O6").End(xlDown))
Set col5 = Range("P6", Range("P6").End(xlDown))
было бы 1048569. Поэтому мне просто нужно было убедиться, что существует как минимум 2 значения.
Комментарии:
1. Вот почему безопаснее использовать xlUp
2. На данный момент мне это не приходило в голову, но да, это работает, если вы используете Xlup. Спасибо, Скотт.