Conteggio delle righe sui dati filtrati

Sto usando il codice qui sotto per ottenere il conteggio delle righe di dati filtrate in VBA, ma mentre ottengo il conteggio, si dà l’errore di run time che mostra:

“Oggetto necessario”.

Alcuni potrebbero per favore farmi sapere quali modifiche sono necessarie?

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 

Se provi a contare il numero di righe nell’intervallo già autofiltrato in questo modo:

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

Conta solo il numero di righe nella prima area visibile contigua dell’intervallo automatico. Ad esempio, se l’intervallo del filtro automatico è dalle righe 1 a 10 e le righe 3, 5, 6, 7 e 9 vengono filtrate, sono visibili quattro righe (righe 2, 4, 8 e 10), ma restituisce 2 perché il primo è contiguo l’intervallo visibile è le righe 1 (la riga dell’intestazione) e 2.

Un’alternativa più accurata è questa (assumendo che ws contenga il foglio di lavoro con i dati filtrati):

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

Dobbiamo sottrarre 1 per rimuovere la riga dell’intestazione. Dobbiamo includere la riga di intestazione nel nostro campo di conteggio perché SpecialCells genererà un errore se non viene trovata alcuna cella, che vogliamo evitare.

La proprietà Cells ti darà un conteggio accurato anche se il Range ha più Aree, a differenza della proprietà Rows . Quindi prendiamo semplicemente la prima colonna dell’intervallo del filtro automatico e contiamo il numero di celle visibili.

Inserisci semplicemente questo nel tuo codice:

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

Assicurati di applicare l’intervallo corretto, ma tienilo semplicemente su UNA colonna

Mentre sono d’accordo con i risultati forniti, non hanno funzionato per me. Se la tua tabella ha un nome questo funzionerà:

 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 

Questo è modificato per funzionare con ListObjects da una versione originale che ho trovato qui:

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

So che questo è un thread vecchio, ma ho scoperto che l’utilizzo del metodo Subtotal in VBA rende anche accuratamente un conteggio delle righe. La formula che ho trovato è in questo articolo , e assomiglia a questo:

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

L’ho testato e ne è venuto fuori ogni volta con precisione, rendendo il numero corretto di righe visibili nella colonna A.

Spero che questo possa aiutare qualche altro viandante della ‘Rete come me.

Ho trovato un modo per farlo che richiede 2 passaggi, ma funziona

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

Penserei che ora hai l’intervallo per ciascuna riga, puoi facilmente manipolare quell’intervallo con l’azione offset (riga, colonna)? Qual è il punto di contare i record filtrati (a meno che non sia necessario il conteggio in una variabile)? Quindi, anziché (o nello stesso blocco) scrivere l’azione del codice per spostare ogni riga su un foglio nascosto vuoto e, una volta terminato, è ansible eseguire qualsiasi lavoro desiderato dai dati dell’intervallo trasferito?

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

Per esempio:

 =COUNTIF(H2:H5000,"FALSE") 

Questo calcolerà il totale falso nella colonna H.