VBA не проверяет результаты после фильтрации таблицы - PullRequest
0 голосов
/ 05 мая 2020

У меня есть следующая таблица:

enter image description here

И следующий код (который фильтрует эту таблицу):

Sub testFilter()
    Dim tbl As ListObject
    Dim filteredRange As Range

    Set tbl = Sheet1.ListObjects("testTbl")
    tbl.Range.AutoFilter Field:=2, Criteria1:=Array("a", "b")

    On Error Resume Next
        Set filteredRange = tbl.ListColumns("status").DataBodyRange.SpecialCells(xlVisible)
    On Error GoTo 0

    If filteredRange Is Nothing Then
        'do something
    Else
        Debug.Print filteredRange.Address
    End If
End Sub

Я ожидаю, что filterRange ничего не будет. Но это не пустяк, и адрес, который он печатает, выглядит следующим образом: $ 1: $ 1, $ 3: $ 1048576, что по сути представляет собой весь лист рядом с одной строкой, которая у меня есть в таблице.

Что я делаю не так? Мне нужна возможность определить, что фильтр не дал результатов.

1 Ответ

0 голосов
/ 05 мая 2020

Я могу воспроизвести это поведение, но только если в таблице есть только одна строка данных. Как только добавляется вторая строка, она ведет себя должным образом. Я не могу найти этому объяснения, это может быть одна из причуд Excel.

Если это действительно может случиться с вашими данными, что таблица имеет только одну строку, вы можете использовать обходной путь

If filteredRange Is Nothing Or (tbl.Range.Rows.Count = 2 And tbl.Range.Rows(2).Hidden) Then

Одно замечание: я думаю, что вашему оператору-фильтру нужен параметр Operator:=xlFilterValues, если вы передаете массив значений:

tbl.Range.AutoFilter Field:=2, Criteria1:=Array("a", "b"), Operator:=xlFilterValues
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...