Kurz gesagt —
Range.AdvancedFilterist der einzige Filter, der Ihnen Daten reicht, keine Ansicht. In einem Aufruf kann er eine eindeutige Liste oder eine per Kriterien gefilterte Zeilenmenge an einen anderen Ort kopieren, ohne Schleife und ohne etwas zu löschen. Zwei Ideen schließen ihn auf. Erstens wähltActionzwischenxlFilterInPlace(blendet Zeilen aus, wie AutoFilter) undxlFilterCopy(kopiert die Ergebnisse in einenCopyToRange— der mächtige Modus). Zweitens ist seine „WHERE-Klausel“ kein Code — sie ist ein Kriterienbereich, ein kleiner Block aus Zellen, dessen Kopfzeile exakt zur Quellkopfzeile passen muss. Fügen SieUnique:=Truehinzu, und Sie erhalten eine eindeutige Liste in einer Zeile, das Original bleibt unangetastet.
' Eine eindeutige Liste der Region-Werte aus Spalte B in Spalte E extrahieren. Zerstoerungsfrei.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sales")
ws.Range("B1:B1000").AdvancedFilter _
Action:=xlFilterCopy, _
CopyToRange:=ws.Range("E1"), _ ' E1 muss dieselbe Kopfzeile wie B1 enthalten
Unique:=True ' je ein Wert, Quelle unveraendert
AdvancedFilter ist das Werkzeug, zu dem die Leute zuletzt greifen und zu dem sie zuerst greifen
sollten. Wenn Sie ein Ergebnis als Daten brauchen — eine eindeutige Liste, einen Export der Zeilen,
die eine Bedingung erfüllen, eine entdoppelte Kopie, die das Original intakt lässt —, ist der
Instinkt, eine For Each-Schleife mit einem If und einem Dictionary zu schreiben. Excel hat für
genau das bereits eine Abfrage-Engine. Diese Anleitung dreht sich um seine zwei prägenden Ideen: es
kann kopieren statt verbergen, und seine Kriterien leben in Zellen.
Was Sie lernen
- Das mentale Modell — SQL-light für einen Bereich: extrahieren, nicht nur ansehen
- An Ort und Stelle vs kopieren —
xlFilterInPlacegegenüberxlFilterCopy - Der Kriterienbereich — Ihre WHERE-Klausel lebt in Zellen, nicht im Code
Unique:=True— eine eindeutige Liste, ohne etwas zu löschen- Die Kopfzeilen-Falle, die leere Ausgabe liefert
AdvancedFiltervsAutoFiltervsRemoveDuplicates
Das mentale Modell: SQL-light für einen Bereich
Stellen Sie sich AdvancedFilter als winzige Abfrage-Engine vor, die an einen Bereich geschraubt
ist. AutoFilter beantwortet „welche Zeilen will ich sehen?“ und blendet den Rest an Ort und Stelle
aus. AdvancedFilter beantwortet eine größere Frage: „gib mir die passenden Zeilen — als neuen
Datensatz, den ich irgendwohin legen und nutzen kann.“ Es kann auch an Ort und Stelle filtern, aber
sein Daseinsgrund ist der Kopiermodus: Es nimmt einen Quellbereich, einen optionalen Satz von
Bedingungen und schreibt die passenden (oder eindeutigen) Zeilen an ein Ziel Ihrer Wahl.
Diese Umdeutung ist wichtig, weil sie eine ganze Kategorie von Schleifen ersetzt. „Hol die eindeutigen Kunden“, „zieh jede Bestellung über 1000 auf ein Berichtsblatt“, „liste die eindeutigen Produktcodes“ — das sind Extraktionen in einem Aufruf, keine Iteration. Behalten Sie das Bild im Kopf — AdvancedFilter erzeugt Daten, AutoFilter erzeugt eine Ansicht — und Sie wissen, welches eine Aufgabe braucht.
An Ort und Stelle vs kopieren: xlFilterInPlace vs xlFilterCopy
Das Action-Argument ist die Weggabelung:
xlFilterInPlaceblendet die nicht passenden Zeilen direkt im Quellbereich aus, genau wieAutoFilter. Die Daten bewegen sich nicht; Sie erhalten eine gefilterte Ansicht. Um sie danach zu räumen, rufen Siews.ShowAllDataauf.xlFilterCopylässt die Quelle in Ruhe und kopiert die passenden Zeilen inCopyToRange. Das ist der Modus, derAdvancedFilterbesonders macht — er ist zerstörungsfrei und erzeugt einen separaten, nutzbaren Datenblock.
' Kopiermodus - der, den Sie meist wollen.
ws.Range("A1").CurrentRegion.AdvancedFilter _
Action:=xlFilterCopy, _
CriteriaRange:=ws.Range("H1:H2"), _ ' die WHERE-Klausel (siehe unten)
CopyToRange:=ws.Range("K1"), _ ' wo die Ergebnisse landen
Unique:=False
Übergeben Sie xlFilterCopy, müssen Sie CopyToRange angeben; übergeben Sie xlFilterInPlace,
dürfen Sie es nicht (Excel wirft so oder so einen Fehler, wenn Sie beides vermischen). Im Zweifel
kopieren — das rührt Ihr Original nie an.
Der Kriterienbereich: Ihre WHERE-Klausel lebt in Zellen
Das ist der Teil, der fremd wirkt, wenn man aus anderen Sprachen kommt: AdvancedFilter nimmt eine
Bedingung nicht als String oder Ausdruck. Seine Bedingungen leben in einem Kriterienbereich —
einem kleinen Block aus Arbeitsblattzellen. Die oberste Zeile enthält Spaltenkopfzeilen, die zur
Quelle passen, und die Zeilen darunter enthalten die Bedingungen.
H I
1 Region Amount
2 West >1000
Dieser Kriterienbereich sagt „Region ist West UND Amount > 1000“. Bedingungen in derselben Zeile
sind AND; Bedingungen, gestapelt in getrennten Zeilen, sind OR. Zwei Zeilen —
H
1 Region
2 West
3 East
— bedeuten also „Region ist West ODER East“. Sie können diesen Block in Zellen bauen, die Ihrem Makro
gehören (ein Notizbereich oder ein verstecktes Blatt), und CriteriaRange darauf zeigen lassen:
ws.Range("A1").CurrentRegion.AdvancedFilter _
Action:=xlFilterCopy, _
CriteriaRange:=ws.Range("H1:I2"), _
CopyToRange:=ws.Range("K1")
Lassen Sie CriteriaRange ganz weg, wird keine Bedingung angewendet — was, kombiniert mit
Unique:=True, genau der Weg ist, eine schlichte eindeutige Liste zu bekommen.
Unique:=True — eine eindeutige Liste, ohne etwas zu löschen
Setzen Sie Unique:=True, und AdvancedFilter gibt je eine eindeutige Zeile zurück (oder einen
Wert, bei einer einzelnen Spalte) — dasselbe Ergebnis wie Duplikate entfernen, nur dass es die
eindeutigen Werte herauskopiert und die Quelle intakt lässt. Genau diese eine Eigenschaft ist
der Grund, warum AdvancedFilter der sichere Weg zum Entdoppeln ist:
' Eindeutige Kundennamen in Spalte K, urspruengliche Liste unangetastet.
ws.Range("C1:C5000").AdvancedFilter _
Action:=xlFilterCopy, _
CopyToRange:=ws.Range("K1"), _
Unique:=True
Wo RemoveDuplicates an Ort und Stelle löscht, ohne Rückgängig, reicht Ihnen dies eine frische,
entdoppelte Liste und riskiert das Original nie. Wenn jemand fragt „wie hole ich in VBA eindeutige
Werte, ohne die Daten zu zerstören?“, ist das die Antwort.
Die Kopfzeilen-Falle, die leere Ausgabe liefert
Der Grund Nummer eins, aus dem AdvancedFilter „nichts zurückgibt“, ist eine nicht passende
Kopfzeile. Sowohl die CriteriaRange-Kopfzeile als auch die CopyToRange-Kopfzeile müssen
exakt zu den Quellkopfzeilen passen — gleiche Schreibweise, gleiche Abstände, gleicher Text ohne
Rücksicht auf Groß-/Kleinschreibung. Eine Kriterienkopfzeile „Reigon“ (Tippfehler) oder ein
CopyToRange, dessen oberste Zelle leer oder falsch beschriftet ist, erzeugt leere oder falsche
Ausgabe ohne einen Fehler zu werfen.
Zwei Gewohnheiten verhindern das:
- Bauen Sie die Kriterien- und Zielkopfzeilen, indem Sie die echten Kopfzeilenzellen kopieren, nie durch Abtippen.
- Filtern Sie auf ein anderes Blatt, denken Sie an eine alte Regel: Der klassische
AdvancedFilterwill denCopyToRangeauf dem aktiven Blatt. Das robuste Muster ist, den Filter von dem Blatt aus laufen zu lassen, auf dem die Ergebnisse landen, oder in einen Notizbereich auf dem Quellblatt zu filtern und das Ergebnis danach zu verschieben.
Kommt die Ausgabe leer zurück, prüfen Sie die Kopfzeilen, bevor Sie irgendetwas anderes prüfen.
AdvancedFilter vs AutoFilter vs RemoveDuplicates
Sie überschneiden sich genug, um zu verwirren, und unterscheiden sich genug, um zu zählen:
AutoFilter— eine Ansicht. Blendet Zeilen an Ort und Stelle aus, sodass der Nutzer eine Teilmenge sieht; nichts wird kopiert oder entfernt. Greifen Sie dazu, um einen gefilterten Bereich zu zeigen.AdvancedFilter(Kopiermodus) — eine Abfrage. Extrahiert passende oder eindeutige Zeilen zerstörungsfrei an einen neuen Ort. Greifen Sie dazu, wenn Sie das Ergebnis als Daten brauchen.RemoveDuplicates— ein Löschen. Schrumpft die Daten an Ort und Stelle, behält jeweils die erste, kein Rückgängig. Greifen Sie nur dazu, wenn Sie die Quelle selbst wirklich kleiner haben wollen und eine Sicherung besitzen.
Der Satz, den man sich merken sollte: AutoFilter zeigt, RemoveDuplicates zerstört, und
AdvancedFilter ist das, was extrahiert — eine eindeutige Liste oder eine per Kriterien passende
Kopie —, ohne das Original anzufassen. Ertappen Sie sich beim Schreiben einer Schleife, um eine
gefilterte oder eindeutige Liste aufzubauen, ist das AdvancedFilter.
Wie ExcelMaster hilft
AdvancedFilter ist genau deshalb mächtig, weil es fummelig ist: die Gabelung aus
An-Ort-und-Stelle gegenüber Kopieren, der Kriterienbereich, der buchstabengetreu passende Kopfzeilen
in Zellen haben muss, das Kopierziel und seine Aktives-Blatt-Regel, das Unique-Flag. Machen Sie
irgendeine Kopfzeile falsch, gibt es nichts zurück, lautlos.
ExcelMaster lässt Sie
stattdessen die Abfrage beschreiben. Sagen Sie „zieh jede Bestellung über 1000 aus der Region West
auf ein neues Blatt“ oder „gib mir die eindeutige Liste der Produktcodes“, und es legt den
Kriterienbereich mit aus der Quelle kopierten Kopfzeilen an, wählt den Kopiermodus mit einem gültigen
CopyToRange, setzt Unique, wenn Sie eindeutige Werte wollen, und lässt die ursprünglichen Daten
intakt. Sie behalten die Arbeitsmappe und den Code; Sie sparen sich die halbe Stunde des Rätselns,
warum eine vertippte Kriterienkopfzeile ein leeres Ergebnis lieferte.
Häufig gestellte Fragen
Wie nutze ich Advanced Filter in VBA?
Rufen Sie AdvancedFilter auf dem Quellbereich auf: Wählen Sie Action:=xlFilterCopy, um Ergebnisse
woandershin zu kopieren (mit einem CopyToRange), oder xlFilterInPlace, um nicht passende Zeilen
auszublenden. Geben Sie einen CriteriaRange für Bedingungen an, oder setzen Sie Unique:=True ohne
Kriterien, um eine eindeutige Liste zu extrahieren. Im Kopiermodus bleiben die Quelldaten unverändert.
Wie extrahiere ich mit VBA Advanced Filter eindeutige Werte?
Nutzen Sie den Kopiermodus mit Unique:=True und ohne Kriterien: rng.AdvancedFilter Action:=xlFilterCopy, CopyToRange:=ws.Range("E1"), Unique:=True. Es schreibt je einen eindeutigen
Wert ans Ziel und lässt die Quelle intakt — anders als RemoveDuplicates, das an Ort und Stelle
löscht. Die CopyToRange-Kopfzeile muss zur Quellkopfzeile passen.
Warum gibt VBA Advanced Filter nichts zurück?
Fast immer wegen einer nicht passenden Kopfzeile. Die Kopfzeilen der obersten Zeile von
CriteriaRange und CopyToRange müssen exakt zu den Quellkopfzeilen passen (ein Tippfehler oder eine
leere Kopfzeile liefert leere Ausgabe ohne Fehler). Kopieren Sie die echten Kopfzeilenzellen, statt
sie abzutippen, und stellen Sie sicher, dass ein Filter im Kopiermodus einen gültigen CopyToRange
hat.
Was ist der Unterschied zwischen AutoFilter und Advanced Filter in VBA?
AutoFilter erzeugt eine Ansicht — es blendet nicht passende Zeilen an Ort und Stelle aus und
kopiert nichts. AdvancedFilter erzeugt Daten — im Kopiermodus extrahiert es passende oder
eindeutige Zeilen an einen neuen Ort, ohne die Quelle zu verändern, und es unterstützt komplexe
AND/OR-Kriterien und eine eindeutige Extraktion, die AutoFilter nicht kann.
Wie funktionieren Kriterien in VBA Advanced Filter?
Kriterien leben in einem Bereich aus Zellen, nicht im Code. Die oberste Zeile enthält Kopfzeilen, die
zur Quelle passen; Bedingungen in derselben Zeile werden mit AND verknüpft, Bedingungen in getrennten
Zeilen mit OR. Zeigen Sie CriteriaRange auf diesen Block. Lassen Sie ihn weg, um keine Bedingung
anzuwenden (nützlich mit Unique:=True).
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 10.08.2026.
Verwandte Anleitungen: VBA AutoFilter · VBA Remove Duplicates · VBA Sort · VBA Find · VBA Range
