Recuento de filas en los datos filtrados

Estoy usando el código siguiente para obtener el recuento de las filas de datos filtrados en VBA, pero al obtener el conteo, se muestra el siguiente error de tiempo de ejecución:

“Objeto requerido”.

¿Podrían algunos decirme qué cambios se necesitan?

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 

Si intenta contar el número de filas en el rango de autofiltrado como este:

 Rowz = rnData.SpecialCells(xlCellTypeVisible).Rows.Count 

Solo contará el número de filas en el primer área visible contigua del rango de autofiltrado. Por ejemplo, si el rango de autofiltro está en las filas 1 a 10 y las filas 3, 5, 6, 7 y 9 están filtradas, cuatro filas son visibles (filas 2, 4, 8 y 10), pero devolvería 2 porque la primera contigua rango visible son las filas 1 (la fila del encabezado) y 2.

Una alternativa más precisa es esta (suponiendo que ws contiene la hoja de trabajo con los datos filtrados):

 Rowz = ws.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1 

Tenemos que restar 1 para eliminar la fila del encabezado. Necesitamos incluir la fila de encabezado en nuestro rango contado porque SpecialCells emitirá un error si no se encuentran celdas, lo cual queremos evitar.

La propiedad de las Cells le dará un conteo exacto incluso si el rango tiene múltiples áreas, a diferencia de la propiedad Rows . Así que solo tomamos la primera columna del rango de autofiltro y contamos el número de celdas visibles.

Simplemente ponga esto en su código:

 Application.WorksheetFunction.Subtotal(3, Range("A2:A500000")) 

Asegúrate de aplicar el rango correcto, pero solo mantenlo en UNA columna

Si bien estoy de acuerdo con los resultados dados, no funcionaron para mí. Si su tabla tiene un nombre, esto funcionará:

 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 

Esto se modifica para que funcione con ListObjects desde una versión original que encontré aquí:

http://www.ozgrid.com/forum/showthread.php?t=81858

Sé que este es un hilo antiguo, pero descubrí que al usar el método Subtotal en VBA también se realiza un recuento preciso de las filas. La fórmula que encontré está en este artículo , y se ve así:

 Application.WorksheetFunction.Subtotal(2, .Range("A2:A" & .Rows(.Rows.Count).End(xlUp).Row)) 

Lo probé y salió con precisión cada vez, representando el número correcto de filas visibles en la columna A.

Espero que esto ayude a otros caminantes de la ‘Red como yo.

He encontrado una manera de hacer esto que requiere 2 pasos, pero funciona

 ' 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")) 

¿Pensaría que ahora tienes el rango para cada fila, puedes manipular fácilmente ese rango con la acción de desplazamiento (fila, columna)? ¿Cuál es el punto de contar los registros filtrados (a menos que necesite ese conteo en una variable)? Entonces, en lugar de (o en el mismo bloque), escriba la acción del código para mover cada fila a una hoja oculta oculta y, una vez hecho todo, ¿puede hacer el trabajo que desee de los datos del rango transferido?

 =COUNTIF(H2:H5000,"Your value to be count") 

Por ejemplo:

 =COUNTIF(H2:H5000,"FALSE") 

Esto calculará el total falso en la columna H.