Цикл перезаписи Array работает только за одну итерацию - PullRequest
1 голос
/ 21 марта 2019

Я запускаю несколько вложенных циклов, например:

Worksheet Loop
    Apply AutoFilter to all unique values in COLUMN C
        Apply AutoFilter to all unique values in COLUMN D
            'Do some stuff

Моя цель состояла в том, чтобы создать двумерный массив уникальных значений из Column A & Column B, скопировав видимые ячейки столбца.удалите дубликаты и присвойте оставшиеся строки массиву.Затем я мог бы просто проходить через каждый массив, фильтровать по мере необходимости и делать какие-то вещи с видимыми ячейками.


По какой-то причине второй раз я пытаюсь назначить свойColumn B массив, я получаю ошибку несоответствия типов в этой строке при попытке назначить мой временный массив (Get_Params).Когда это происходит, значение LR2 = 2, так что это не проблема.

Вот главный цикл, и происходит ошибка в функции Get_Params в отмеченной строке

For Each ws In Worksheets
UnFilter ws
    If ws.Name <> "Temp" Then

        LR = ws.Range("C" & ws.Rows.Count).End(xlUp).Row
        Set Target = ws.Range("A1:P" & LR)
        Batches = Get_Batches(ws, LR)

        For b = LBound(Batches, 1) To UBound(Batches, 1)
        UnFilter ws

          Target.AutoFilter 3, Batches(b, 1)
          Params = Get_Params(ws, LR, Target)

              For p = LBound(Params, 1) To UBound(Params, 1)
                Target.AutoFilter 4, Params(p, 1)

                  'MsgBox TenPer(Target)

              Next p
        Next b

        LR = 0
        Set Target = Nothing
        UnFilter ws

    End If
Next ws

Function Get_Params(ws As Worksheet, LR As Long, Target As Range) As Variant()

Dim Temp As Worksheet: Set Temp = ThisWorkbook.Sheets("Temp")
Dim LR2 As Long

ws.Range("D1:D" & LR).SpecialCells(xlCellTypeVisible).Copy
Temp.Range("U1").PasteSpecial xlPasteValues

Temp.Range("U1").RemoveDuplicates 1, xlYes
    LR2 = Temp.Range("U" & Temp.Rows.Count).End(xlUp).Row

    Get_Params = Temp.Range("U2:U" & LR2).Value '<--- ERROR HERE (LR2 = 2)

    Temp.Range("U1").EntireColumn.ClearContents

End Function

1 Ответ

1 голос
/ 21 марта 2019

Ваша функция объявлена ​​как массив, см. As Variant()

Function Get_Params(ws As Worksheet, LR As Long, Target As Range) As Variant()

, но Range("U2:U2").Value не возвращает массив, а просто нормальное значение, потому что это только одна ячейка.Поэтому вы получаете ошибку несоответствия типов.

Решение

Объявите вашу функцию только As Variant:

Function Get_Params(ws As Worksheet, LR As Long, Target As Range) As Variant

Для вашего variabe Params вы можете затем проверить If VarType(params) = vbArray Then чтобы перехватывать как массив, так и не массив, и обрабатывать их по мере необходимости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...