Количество строк по отфильтрованным данным
Я использую приведенный ниже код, чтобы получить количество фильтрованных строк данных в VBA, но, получая счет, он дает ошибку времени выполнения:
"Требуется объект".
Может кто-нибудь, пожалуйста, дайте мне знать, какие изменения необходимы?
Set rnData = .UsedRange
With rnData
.AutoFilter Field:=327, Criteria1:=Mid(provarr(q), 1, 2)
.Select
.AutoFilter Field:=328, Criteria1:=Mid(provarr(q), 3, 7)
.Select
.AutoFilter Field:=330, Criteria1:=Mid(provarr(q), 10, 2)
.Select
.AutoFilter Field:=331, Criteria1:=Mid(provarr(q), 12, 2)
.Select
Rowz = .AutoFilter.Range.SpecialCells(xlCellTypeVisible).Rows.count
....
End With
Ответы
Ответ 1
Если вы попытаетесь подсчитать количество строк в уже автофильтрованном диапазоне, например:
Rowz = rnData.SpecialCells(xlCellTypeVisible).Rows.Count
Он будет считать только количество строк в первой смежной видимой области автофильтра. Например. если диапазон автофильтра - это строки с 1 по 10, а строки 3, 5, 6, 7 и 9 отфильтрованы, четыре строки видны (строки 2, 4, 8 и 10), но он вернет 2, потому что первый смежный видимый диапазон - это строки 1 (строка заголовка) и 2.
Более точной альтернативой является это (предполагая, что ws
содержит рабочий лист с отфильтрованными данными):
Rowz = ws.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1
Мы должны вычесть 1 для удаления строки заголовка. Нам нужно включить строку заголовка в наш подсчитанный диапазон, потому что SpecialCells выдаст ошибку, если не обнаружено никаких ячеек, чего мы хотим избежать.
Свойство Cells
даст вам точный счет, даже если Range имеет несколько областей, в отличие от свойства Rows
. Поэтому мы просто берем первый столбец диапазона автофильтра и подсчитываем количество видимых ячеек.
Ответ 2
Просто введите это в свой код:
Application.WorksheetFunction.Subtotal(3, Range("A2:A500000"))
Убедитесь, что вы применили правильный диапазон, но просто держите его в столбце ОДИН
Ответ 3
Пока я согласен с приведенными результатами, они не работают для меня. Если ваша таблица имеет имя, это будет работать:
Public Sub GetCountOfResults(WorkSheetName As String, TableName As String)
Dim rnData As Range
Dim rngArea As Range
Dim lCount As Long
Set rnData = ThisWorkbook.Worksheets(WorkSheetName).ListObjects(TableName).Range
With rnData
For Each rngArea In .SpecialCells(xlCellTypeVisible).Areas
lCount = lCount + rngArea.Rows.Count
Next
MsgBox "Autofilter " & lCount - 1 & " records"
End With
Set rnData = Nothing
lCount = Empty
End Sub
Это изменено для работы с ListObjects из исходной версии, которую я нашел здесь:
http://www.ozgrid.com/forum/showthread.php?t=81858
Ответ 4
Я знаю, что это старый поток, но я узнал, что метод Subtotal в VBA также точно отображает количество строк. Формула, найденная мной, находится в в этой статье и выглядит следующим образом:
Application.WorksheetFunction.Subtotal(2, .Range("A2:A" & .Rows(.Rows.Count).End(xlUp).Row))
Я тестировал его, и он выдавался точно каждый раз, отображая правильное количество видимых строк в столбце A.
Надеюсь, это поможет некоторым другим путникам "Сети, как я".
Ответ 5
Я нашел способ сделать это, чтобы он требовал 2 шага, но он работает
' to copy out a filtered selection into a different sheet
number_of_dinosaurs = WorksheetFunction.Count(Worksheets("Dinosaurs").Range("A2", "A3000"))
With Worksheets("Dinosaurs")
.AutoFilterMode = False
With .Range("$A$4:$E$" & number_of_dinosaurs)
.AutoFilter Field:=2, Criteria1:="*teeth*" ' change your criteria to whatever you like
.SpecialCells(xlCellTypeVisible).Copy Destination:=Worksheets("Bad_Dinosaurs").Range("A1")
End With
End With
' then do a normal count on the secondary sheet
number_of_dinosaurs_that_eat_humans = WorksheetFunction.Count(Worksheets("Bad_Dinosaurs").Range("A2", "A30000"))
Ответ 6
Я бы подумал, что теперь у вас есть диапазон для каждой строки, вы можете легко манипулировать этим диапазоном с помощью действия offset (row, column)?
Какова точка подсчета фильтрованных записей (если вам не нужен этот счетчик в переменной)?
Поэтому вместо (или так же, как и в том же блоке) напишите действие вашего кода, чтобы переместить каждую строку на пустой скрытый лист, и как только все это будет сделано, вы можете сделать любую работу, которая вам нравится, из перенесенных данных диапазона.
Ответ 7
=COUNTIF(H2:H5000,"Your value to be count")
Например:
=COUNTIF(H2:H5000,"FALSE")
Это вычислит полное значение false в столбце H.