VBA für Spalten filtern
Ich habe eine große Datenbank-Blatt, erste Zeile enthält überschriften. Ich möchte eine Teilmenge von Zeilen dieser Tabelle, basierend auf Werte in der Spalte. Zwei Fragen:
1) VBA-wise würde ich gerne eine Schleife durch die Spalten, wenn die Werte für alle erforderlichen Spalten alle identisch sind, kopieren Sie die gesamte Zeile in ein neues Blatt.
2) Die Teilmenge von Zeilen basiert auf einer Liste. Ich habe gerade gelesen, kann ich Autofilter für ein array. Ist es möglich den input dieses array aus einer Spalte statt der manuellen Eingabe im VBA-code? Die Liste, die ich verwende besteht aus 200 verschiedenen Saiten und werden regelmäßig aktualisiert.
Wo CritList ist die Liste von strings. Ich muss noch herausfinden wie, aber jetzt habe ich das Büro verlassen, also morgen mehr.
EDIT1 Dank @DougGlancy; die autofiltering funktioniert jetzt. Hier ist seine schöne code (ich habe nur Hinzugefügt das array-filter).
EDIT2 Enthalten eine ausführlichere array-filter, wo NameList ist die Liste, die ich möchte zu filtern. Nun es funktioniert alles!
Sub FilterAndCopy()
Dim LastRow As Long
Dim vName As Variant
Dim rngName As Range
Set rngName = Sheets("Sheet3").Range("NameList")
vName = rngName.Value
Sheets("Sheet2").UsedRange.Offset(0).ClearContents
With Worksheets("Sheet1")
.Range("A:E").AutoFilter
'Array filter from NameList
.Range("A:J").AutoFilter Field:=3, Criteria1:=Application.Transpose(vName), _
Operator:=xlFilterValues
.Range("A:E").AutoFilter field:=2, Criteria1:="=String1" _
, Operator:=xlOr, Criteria2:="=string2"
.Range("A:E").AutoFilter field:=3, Criteria1:=">0", _
.Range("A:E").AutoFilter field:=5, Criteria1:="Number"
LastRow = .Range("A" & .Rows.Count).End(xlUp).Row
.Range("A1:A" & LastRow).SpecialCells(xlCellTypeVisible).EntireRow.Copy _
Destination:=Sheets("Sheet2").Range("A1")
End With
End Sub
Ich bin mit Excel 2011 auf Mac. Ja. mal sehen, wenn ich den autofilter arbeiten..
InformationsquelleAutor Ampi Severe | 2012-12-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier ist ein anderer Ansatz. Das Herz der es erstellt wurde, indem Sie auf den Makro-Recorder und Filterung der Spalten nach Ihren Vorgaben. Dann gibt es ein Stück code, um die Ergebnisse kopieren. Es wird schneller sein als die Schleife durch jede Zeile und Spalte:
Als seitliche Anmerkung, dein code hat mehr Schleifen und Zähler-Variablen als nötig. Sie würden nicht brauchen, um eine Schleife durch die Spalten, die gerade durch die Reihen. Sie würden dann prüfen, die verschiedenen Zellen von Interesse in dieser Zeile, so wie Sie es Tat.
Du hast Recht, es ist wichtig. Es ist immer ein wenig verwirrend für mich, aber meine Theorie ist, dass der filter ermöglicht es alle arbeiten, wenn Sie beginnen, mit oder ohne filter, in diesen Spalten oder anderswo. Es sollte eigentlich "A:A", nur für bessere Sicht, und ich werde es Bearbeiten, so zu sein.
OK, das scheint zu funktionieren, ob ich beginnen mit dem richtigen filter schon vorhanden, keine filter oder ein filter irgendwo sonst auf dem Blatt.
Nur eine kleine alternative: anstelle von speichern der Filter in VBA, setzen Sie in Spalte F die Verwendung von und-UND ODER-Funktionen. Dann filter nur für WAHR in dieser Spalte mit VBA. Diese Art der Filterung Logik, die ist wahrscheinlich, die einige Art von business-Logik verstanden werden kann, auch ohne Blick auf den VBA-code...
Sicher: In Zelle F2 die folgende Formel verwenden:
=AND(ISNA(A2),OR(B2="String1",B2="String2"),C2>=0,E2="Number")*1
und kopiere es in Spalte F. Dann passen Sie den VBA-code oben, um alle Zeilen, beginnend mit.Range("$A:$E").AutoFilter
zu.Range("$A:$F").AutoFilter .Range("$A:$F").AutoFilter Field:=6, Criteria1:="1"
InformationsquelleAutor Doug Glancy