🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Advanced Filter in Excel — Eindeutige Werte extrahieren und in einen neuen Bereich filtern (ohne Schleife)

|

VBA Advanced Filter in Excel — Eindeutige Werte extrahieren und in einen neuen Bereich filtern (ohne Schleife)

Kurz gesagtRange.AdvancedFilter ist 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ählt Action zwischen xlFilterInPlace (blendet Zeilen aus, wie AutoFilter) und xlFilterCopy (kopiert die Ergebnisse in einen CopyToRange — 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 Sie Unique:=True hinzu, 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 — xlFilterInPlace gegenüber xlFilterCopy
  • 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
  • AdvancedFilter vs AutoFilter vs RemoveDuplicates

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:

  • xlFilterInPlace blendet die nicht passenden Zeilen direkt im Quellbereich aus, genau wie AutoFilter. Die Daten bewegen sich nicht; Sie erhalten eine gefilterte Ansicht. Um sie danach zu räumen, rufen Sie ws.ShowAllData auf.
  • xlFilterCopy lässt die Quelle in Ruhe und kopiert die passenden Zeilen in CopyToRange. Das ist der Modus, der AdvancedFilter besonders 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 AdvancedFilter will den CopyToRange auf 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