2016-08-03 3 views
-1

Ich habe eine Excel ws "Monatliche Daten". Ich versuche, einen automatischen Filter (xlFilterLastMonth) anzuwenden und die Anzahl der gefilterten Zeilen zu zählen.Falsche Anzahl von gefilterten Zeilen VBA

With Sheets("Monthly Data")      
    .Range("A1:BB" & lastrow1).AutoFilter Field:=21, Criteria1:=xlFilterLastMonth, Operator:=xlFilterDynamic 

MsgBox ws2.UsedRange.SpecialCells(xlCellTypeVisible).Rows.Count 

End With 
+0

ich nicht denke, es wird das Ergebnis beeinflussen, aber Sie verwenden "Monatliche Daten" in Ihrem 'Mit' Zeile und referenzieren 'ws2' in der Message-Box. –

+0

Wenn die sichtbaren Zellen nicht zusammenhängend sind, müssen Sie die Zeilen in jedem "Bereich" separat zählen. (Oder Sie könnten die Funktion "SubTotal" versuchen, wie von J. B. vorgeschlagen) –

+0

@ J.B "Objektvariable oder Mit Blockvariable nicht gesetzt" – Tanmoy

Antwort

0

Basierend auf JBs Antwort:

With Sheets("Monthly Data") 
    .Range("A1:BB" & lastrow1).AutoFilter Field:=21, Criteria1:=xlFilterLastMonth, Operator:=xlFilterDynamic 

    Set r = Intersect(.AutoFilter.Range, .Range("A:A")) 
    Filtred_Rows_Count = Application.WorksheetFunction.Subtotal(103, r) - 1 

    MsgBox Filtred_Rows_Count 
End With 
+0

Um 2 separate Filter auf 2 separate Spalten anzuwenden, zählen Sie die Anzahl der Zeilen. Mit Sheets ("LifeTimeData") .Range ("A1: BB" & Lastrow) .AutoFilter Feld: = 21, Kriterien1: = xlFilterLastMonth, Operator: = xlAnd .Range ("A1: BB" & Lastrow) .AutoFilter Feld : = 16, Criteria1: = "*" & "Deposit", Operator: = xlFilterDynamic Setzen Sie r = Schnittmenge (.AutoFilter.Range, .Range ("A: A")) Filtred_Rows_Count = Application.WorksheetFunction.Subtotal (103, r) - 1 'Arbeitsblätter ("LifeTimeData"). AutoFilterMode = False ' Sheets ("Übersicht"). Bereich ("G16") = Filtred_Rows_Count MsgBox Filtred_Rows_Count En – Tanmoy

1

Try this:

With Sheets("Monthly Data") 
    .Range("A1:BB" & lastrow1).AutoFilter Field:=21, Criteria1:=xlFilterLastMonth, Operator:=xlFilterDynamic 

    Set r = Intersect(ActiveSheet.AutoFilter.Range, Range("A:A")) 
    Filtred_Rows_Count = Application.WorksheetFunction.Subtotal(103, r) - 1 

    MsgBox Filtred_Rows_Count 
End With 
+0

ws2 ist nicht das aktive Blatt, in dem die Daten gefiltert werden. – Tanmoy

+0

@Tanmoy so ändern Sie es im Code dann? –

+0

getan, dass. keine Freude. anwendungsdefinierter oder objektdefinierter Fehler. – Tanmoy

0

gibt es Angenommen Header für jede Spalte, dann versuchen Sie diese

Dim Data1 As Range, Data2 As Range 


Set Data1 = Sheets("Monthly Data").Range("A1:BB" & LastRow1) 

Data1.AutoFilter Field:=21, Criteria1:=xlFilterLastMonth, Operator:=xlFilterDynamic 

Set Data2 = Range(Cells(2, 21), Cells(LastRow1, 21)).SpecialCells(xlCellTypeVisible) 

For Each cell In Data2 
    i = i + 1 
Next 

Worksheets("Monthly Data").AutoFilterMode = False 
MsgBox "The number of filtered rows is " & i 
+0

Scheint nicht zu funktionieren. Gibt das Ergebnis als lastrow1 zurück. – Tanmoy

+0

@ Tanmoy Es funktioniert. Ich versuche meinen gesamten Code, bevor ich ihn als Antwort schreibe. Was ist deine Aussage für 'LastRow1'? Ich habe 'LastRow1 = Cells (Rows.Count," A ") verwendet. End (xlUp) .Row" vorausgesetzt, Ihr Datenbereich ist ein gut formatiertes Datenblatt. Was ich mit einem "gut formatierten Datenblatt" meine, ist ein Arbeitsblatt mit Daten, die in Zelle A1 beginnen und die Anzahl der Zeilen in Spalte A und Spalten in Zeile 1 muss gleich der Reichweite aller Daten sein. –

+0

@Tanmoy Siehe [Screenshot meines Arbeitsblatts] (http://i.stack.imgur.com/k4SPS.png). Ich habe den obigen Code so modifiziert, dass er zu den Dummy-Daten passt. Schau dir das ganze Bild an. Siehe auch in der linken unteren Ecke. –