Извините, если ответ очевиден, использую 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
.