VBA количество видимых строк после фильтра - PullRequest
1 голос
/ 19 февраля 2020

У меня продолжают появляться проблемы с видимыми строками после фильтрации. У меня есть таблица, которая выглядит следующим образом: enter image description here

Имя таблицы - tstTBL. Я применяю 2 фильтра: фильтрация для случая 3 и Filed = Yes, что не дает результатов. Однако, когда я подсчитываю видимые строки, это считается 1, хотя я использую только область данных таблицы. Я ожидаю, что numRows = 0. Как мне изменить код?

Sub tstFilter()
    Dim filterredRange As Range
    Dim tbl As ListObject
    Dim caseCol As Integer
    Dim trCol As Integer
    Dim numRows As Integer

    Set tbl = Sheet1.ListObjects("tstTbl")
    caseCol = Sheet1.Rows("1:1").Find(What:="Case ID", LookAt:=xlWhole).Column
    tbl.Range.AutoFilter Field:=caseCol, Criteria1:=3

    'check first filter
    On Error Resume Next
        Set filterredRange = tbl.ListColumns("Case ID").DataBodyRange.SpecialCells(xlVisible)
    On Error GoTo 0
    If filterredRange Is Nothing Then
        Debug.Print "no such case"
    End If

    trCol = ActiveSheet.Rows("1:1").Find(What:="Filed", LookAt:=xlWhole).Column
    tbl.Range.AutoFilter Field:=trCol, Criteria1:="Yes"

    'check second filter
    On Error Resume Next
            Set filterredRange = tbl.ListColumns("Filed").DataBodyRange.SpecialCells(xlVisible)
    On Error GoTo 0
    If filterredRange Is Nothing Then
        numRows = 0
    Else
        numRows = filterredRange.Rows.Count
    End If

    Debug.Print numRows

End Sub

1 Ответ

0 голосов
/ 19 февраля 2020

Проблема заключается в том, что если первый набор фильтров имеет правильный диапазон Set filterredRange, тогда переменная содержит диапазон.

Если вы теперь повторно используете ту же переменную для второго фильтра

'check second filter
On Error Resume Next
    Set filterredRange = tbl.ListColumns("Filed").DataBodyRange.SpecialCells(xlVisible)
On Error GoTo 0

и нет видимых ячеек, ваш код ошибки (но не показывает сообщение, потому что вы подавили его с помощью On Error Resume Next) и ваш filterredRange не сбрасывается (эта строка с ошибкой и, следовательно, filterredRange по-прежнему имеет его первоначальная стоимость). Если строка содержит ошибку, эта строка вообще ничего не делает (так, как она никогда не выполнялась).

Чтобы предотвратить это, вы должны заново инициализировать переменную с помощью Set filterredRange = Nothing, прежде чем использовать ее для второго фильтра.

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