Excel VBA - использовать массив в качестве критериев в автофильтре, а не ожидаемые результаты

Конечная цель этой процедуры — удалить все строки в таблице «TestData», в которых есть пользователь, указанный в таблице «SysAccts» (на листе «Lists»).

Я использую автофильтр, чтобы найти эти строки, чтобы выбрать их и удалить.

Это мой код:

Sub ClearSystemAccts()
    Dim wksData As Worksheet
    Dim objDataTable As ListObject
    Dim varSysAccts As Variant

    Set wksData = ActiveWorkbook.Sheets("Test Data")
    Set objDataTable = wksData.ListObjects("TestData")
    varSysAccts = Worksheets("Lists").Range("SystemAccts")

    With objDataTable.Range
        'turn off the autofilters as a reset
        .AutoFilter
        'set the autofilter with the criteria;
        .AutoFilter field:=2, Criteria1:=varSysAccts, Operator:=xlFilterValues
        'Delete the entire row for the visible cells; _
        'skips the header but also deletes the blank row below the table.
        .CurrentRegion.Offset(1).EntireRow.Delete
        'turn off autofilter
        .AutoFilter
    End With

End Sub

Когда я запускаю код, автофильтр не отображает строки в таблице.

Я проверил правильность заполнения переменной varSysAccts.

При наведении курсора на критерии в строке автофильтра я получаю следующее: Уведомление о несоответствии типов

Я думаю, проблема в том, что когда таблица читается в массив, это всегда динамический массив. Но в таблице только один столбец. Как это исправить?

ОТРЕДАКТИРОВАНО: в комментарии ниже я удалил массив из критериев. Теперь я не получаю несоответствие типов, но фильтр по-прежнему не выбирает строки.


person DeNaeL    schedule 20.01.2017    source источник
comment
Попробуйте без оболочки Array(), так как это уже массив. Просто используйте varSysAccts   -  person Scott Craner    schedule 20.01.2017
comment
Предполагая, что SystemAccts является столбцом, попробуйте varSysAccts = Application.Transpose(Worksheets("Lists").Range("SystemAccts")) (чтобы сделать массив одномерным), а затем Criteria1:=varSysAccts.   -  person YowE3K    schedule 20.01.2017
comment
YowE3K, это решило это! Не могли бы вы опубликовать это как ответ, чтобы я мог отдать вам должное? Благодарю вас!   -  person DeNaeL    schedule 20.01.2017


Ответы (1)


Предполагая, что SystemAccts является столбцом, используйте

varSysAccts = Application.Transpose(Worksheets("Lists").Range("SystemAccts‌​")) 

Это сделает массив одномерным, а не двумерным (строки x столбцы).

И затем, поскольку у вас уже есть массив, вам нужно использовать только Criteria1:=varSysAccts вместо Criteria1:=Array(varSysAccts).

person YowE3K    schedule 20.01.2017