Отладка VBA при подсчете пустых ячеек в отфильтрованном списке с помощью кода VBA

Отладка VBA при подсчете пустых ячеек в отфильтрованном списке с помощью кода VBA

Извините, если ответ очевиден, использую VBA всего неделю. Хочу отфильтровать ячейки на отдельном листе, а затем посчитать оставшиеся пробелы в отфильтрованном списке. Я получил основы кода из существующих ответов, поэтому не придумывал сам, и это почти работает, но подумал, что спрошу после того, как пялился на это 3 часа и пробовал разные вещи.

Код выдает результат, он просто на 1 больше, чем правильно каждый раз, поэтому в отфильтрованном списке есть два пробела, но на выходе получается 3. Пробовал всевозможные корректировки списка, но он всегда на 1 больше, чем ожидалось. Попробую прикрепить фотографии списка, который я фильтрую.

У меня также есть код для динамического поиска конца диапазона и применения фильтра. Я добавлю строку кода 'unfilter', как только заставлю этот кусок работать.

Sub BlankCheck()
    ' Find last free row
    Dim lRow As Long
        lRow = Worksheets(2).Cells.Find(What:="*", _
            After:=Range("A1"), _
            LookAt:=xlPart, _
            LookIn:=xlFormulas, _
            SearchOrder:=xlByRows, _
            SearchDirection:=xlPrevious, _
            MatchCase:=False).Row
    
    ' Filter
    Worksheets(2).UsedRange.AutoFilter Field:=1, Criteria1:="test"
    
    ' Count visible blanks
    Worksheets(1).Cells(1, 1) = Range(Worksheets(2).Cells(1, 2), Worksheets(2).Cells(lRow, 2)). _
    SpecialCells(xlCellTypeVisible).SpecialCells(xlCellTypeConstants).Count
    
End Sub

Заранее благодарю за любую помощь.

изображение неотфильтрованного списка

решение1

Чтобы вы знали, почему это возвращает 3, это то, что вы в настоящее время ищете видимые ячейки, которые имеют содержимое в Bстолбце. Поэтому он включает заголовок И две ячейки, которые имеют содержимое после применения фильтра.


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

Sub Test()

With ThisWorkbook.Worksheets("Sheet1")
    Debug.Print Application.WorksheetFunction.CountIfs(.Range("A:A"), "test", .Range("B:B"), "")
End With

End Sub

На ваших данных это возвращает 2.

Связанный контент