Количество строк по отфильтрованным данным

Я использую приведенный ниже код, чтобы получить количество фильтрованных строк данных в 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.