Все возможные комбинации — ошибка времени выполнения 6 в VBA Excel

#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. Спасибо, Скотт.