Использование переменного диапазона Excel для использования в автофильтре VBA - PullRequest
0 голосов
/ 21 ноября 2018

Я много искал и пробовал много разных вещей, но не могу заставить работать следующее:

У меня есть ряд идентификаторов, которые я генерирую.Затем я хочу отфильтровать диапазон данных, чтобы получить отфильтрованный вывод только указанных идентификаторов.Однако, что бы я ни пытался, мой отфильтрованный вывод просто возвращает пустой диапазон.

Обратите внимание: мой диапазон идентификаторов изменяется по размеру при каждом запуске этого процесса.Я включил очень упрощенный набор данных, чтобы проиллюстрировать мою точку зрения - мои реальные данные намного сложнее, чем мой пример.

Код, который у меня есть на данный момент:

Sub Test()

    Dim Template As Workbook
    Set Template = ThisWorkbook
    Dim IDs, Report As Worksheet
    Set IDs = Template.Worksheets("IDs")
    Set Report = Template.Worksheets("Report")

    Dim LastRowIDs As Long
    LastRowIDs = IDs.Range("A" & IDs.Rows.Count).End(xlUp).Row

    Dim IDsArray As Variant

    IDsArray = IDs.Range("A2:A" & LastRowIDs)

    Dim LastRowReport As Long
    LastRowReport = Report.Range("A" & Report.Rows.Count).End(xlUp).Row

    Report.AutoFilterMode = False
    Report.Range("A1:C" & LastRowReport).AutoFilter Field:=1, Criteria1:=Application.Transpose(IDsArray), Operator:=xlFilterValues

End Sub

IЯ бы сказал, что я являюсь средним пользователем VBA, поэтому, пожалуйста, объясните любые ответы.

Диапазон для фильтрации

Данные для фильтрации

Желаемый выход

1 Ответ

0 голосов
/ 21 ноября 2018

Excel любит массивы автофильтрации в виде строк.Поэтому вам нужно преобразовать массив в строковые значения.Тогда это работает.

Sub Test()

    Dim Template As Workbook
    Set Template = ThisWorkbook
    Dim IDs, Report As Worksheet
    Set IDs = Template.Worksheets("IDs")
    Set Report = Template.Worksheets("Report")

    Dim LastRowIDs As Long
    LastRowIDs = IDs.Range("A" & IDs.Rows.Count).End(xlUp).Row

    Dim IDsArray As Variant
    Dim sTemp As String, i As Integer
    IDsArray = Application.Transpose(IDs.Range("A2:A" & LastRowIDs))
    For i = LBound(IDsArray) To UBound(IDsArray)
        sTemp = "," & IDsArray(i) & sTemp
    Next i
    IDsArray = Split(Mid(sTemp, 2), ",")

    Dim LastRowReport As Long
    LastRowReport = Report.Range("A" & Report.Rows.Count).End(xlUp).Row

    Report.AutoFilterMode = False
    Report.Range("A1:C" & LastRowReport).AutoFilter Field:=1, Criteria1:=IDsArray, Operator:=xlFilterValues

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