it-swarm.com.de

Zeilenanzahl für die gefilterten Daten

Ich verwende den folgenden Code, um die Anzahl der gefilterten Datenzeilen in VBA abzurufen. Beim Abrufen der Zählung wird jedoch der Laufzeitfehler angezeigt, der Folgendes anzeigt:

"Objekt benötigt". 

Könnten Sie mir bitte mitteilen, welche Änderungen erforderlich sind?

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
12
user2300403

Wenn Sie versuchen, die Anzahl der Zeilen im bereits automatisch gefilterten Bereich wie folgt zu zählen:

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

Es zählt nur die Anzahl der Zeilen im ersten zusammenhängenden sichtbaren Bereich des automatisch gefilterten Bereichs. Z.B. Wenn der Autofilterbereich die Zeilen 1 bis 10 enthält und die Zeilen 3, 5, 6, 7 und 9 gefiltert werden, sind vier Zeilen sichtbar (Zeilen 2, 4, 8 und 10), aber es würde 2 zurückgeben, da das erste zusammenhängende sichtbar ist Bereich ist Zeilen 1 (die Kopfzeile) und 2.

Eine genauere Alternative ist folgende (vorausgesetzt, dass ws das Arbeitsblatt mit den gefilterten Daten enthält):

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

Wir müssen 1 subtrahieren, um die Kopfzeile zu entfernen. Wir müssen die Kopfzeile in unseren gezählten Bereich aufnehmen, da SpecialCells einen Fehler ausgibt, wenn keine Zellen gefunden werden, die wir vermeiden möchten.

Die Cells-Eigenschaft liefert Ihnen eine genaue Zählung, auch wenn der Bereich mehrere Bereiche hat, im Gegensatz zur Rows-Eigenschaft. Also nehmen wir einfach die erste Spalte des Autofilterbereichs und zählen die Anzahl der sichtbaren Zellen.

38
Jon Crowell

Geben Sie dies einfach in Ihren Code ein:

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

Vergewissern Sie sich, dass Sie den richtigen Bereich anwenden, aber belassen Sie ihn nur in einer Spalte

19
Frank

Obwohl ich mit den Ergebnissen einverstanden bin, haben sie für mich nicht funktioniert. Wenn Ihre Tabelle einen Namen hat, funktioniert dies:

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

Dies wurde geändert, um mit ListObjects aus einer Originalversion zusammenzuarbeiten, die ich hier gefunden habe:

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

2
Joe Stellato

Ich habe einen Weg gefunden, dass dies 2 Schritte erfordert, aber es funktioniert

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

Ich weiß, dass dies ein alter Thread ist, aber ich habe herausgefunden, dass bei Verwendung der Subtotal-Methode in VBA auch die Anzahl der Zeilen genau ausgegeben wird. Die Formel, die ich gefunden habe, ist in diesem Artikel und sieht folgendermaßen aus:

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

Ich habe es getestet und es wurde jedes Mal genau ausgegeben, wobei die korrekte Anzahl der sichtbaren Zeilen in Spalte A dargestellt wurde.

Hoffentlich hilft dies einem anderen Wanderer des Netzes wie mir.

1
Josh

Ich würde denken, dass Sie jetzt den Bereich für jede Zeile haben. Sie können diesen Bereich leicht mit der Versatzaktion (Zeile, Spalte) bearbeiten. Was ist der Punkt, an dem die gefilterten Datensätze gezählt werden (es sei denn, Sie benötigen diese Anzahl in einer Variablen)? Schreiben Sie also anstelle von (oder in demselben Block) Ihre Code-Aktion, um jede Zeile in ein leeres Feld zu verschieben verborgenes Blatt und wenn alles fertig ist, können Sie aus den übertragenen Bereichsdaten beliebige Arbeit erledigen?

0
Marc Quattrini