TL;DR —
Filter(sourceArray, match)liefert ein neues, nullbasiertes Array, das nur die Elemente enthält, die den Teilstringmatchenthalten. Es ist eine Suche über ein Array im Speicher, kein Blatt — nichts mitAutoFilterzu tun. Drei Dinge beißen: Es trifft einen Teilstring (also behält"AB"auch"CAB"), es beachtet standardmäßig die Groß-/Kleinschreibung (übergeben SievbTextCompare, um sie zu ignorieren), und ein Ergebnis ohne Treffer ist ein leeres Array mitUBound = -1, kein Fehler. Das optionale dritte ArgumentIncludekehrt es um:Filter(a, "x", False)behält alles, was"x"nicht enthält.
Sub FilterDemo()
Dim names As Variant, hits As Variant
names = Array("Smith", "Jones", "Smithson", "Adams")
hits = Filter(names, "Smith") ' Elemente behalten, die "Smith" enthalten
Debug.Print hits(0) ' Smith <- Index 0, immer nullbasiert
Debug.Print hits(1) ' Smithson <- Teilstring-Treffer, kein ganzes Wort
Debug.Print UBound(hits) ' 1 <- zwei Treffer: Index 0 und 1
hits = Filter(names, "smith") ' kleingeschrieben -> standardmaessig KEIN Treffer
Debug.Print UBound(hits) ' -1 <- leeres Array, kein Fehler
End Sub
Die vollständige Signatur, samt der beiden Argumente, über die Leute stolpern:
Filter(sourceArray, match, [include], [compare])
' 1-D-Array Text True/False vbTextCompare = Gross-/Kleinschreibung egal
Was Sie lernen
- Das mentale Modell — Filter durchsucht ein Array und gibt die Treffer zurück
- Warum
FilternichtAutoFilterist und wann Sie tatsächlich welches wollen - Die Teilstring-Falle:
Filtertrifft innerhalb von Wörtern, nicht ganze Werte - Die Groß-/Kleinschreibung und die
vbTextCompare-Lösung - Die Leerergebnis-Falle (
UBound = -1) und wie Sie sie absichern Include:=False, um den Filter umzukehren, und der Rundlauf mit Split und Join
Das mentale Modell: Filter durchsucht ein Array, kein Blatt
Filter ist der Array-Vetter von InStr. Wo InStr
fragt „steckt dieser Text in einem String, und wo?", fragt Filter „welche dieser Strings
enthalten diesen Text?" und reicht Ihnen ein brandneues Array zurück, das nur die enthält, die es tun.
Sie geben ihm eine Liste; es gibt Ihnen die kürzere Liste.
Dieser Blickwinkel sagt Ihnen genau, wann Sie danach greifen: Sie haben bereits ein eindimensionales String-Array im Speicher — die Stücke aus einem Split, die Schlüssel aus einem Dictionary, eine Liste von Dateinamen aus Dir — und Sie wollen die Teilmenge, die etwas erwähnt. Es ist ein einzeiliger Ersatz für die Schleife, die jeder schreibt:
' Der lange Weg, den jeder zuerst schreibt
Dim i As Long, n As Long
ReDim keep(UBound(names)) As String
For i = 0 To UBound(names)
If InStr(1, names(i), "Smith") > 0 Then
keep(n) = names(i): n = n + 1
End If
Next i
ReDim Preserve keep(n - 1)
' Dasselbe in einem Aufruf
keep = Filter(names, "Smith")
Die Verwechslung, die weg muss: Filter ist nicht AutoFilter
Das ist die mit Abstand größte Quelle der Frage „warum will Filter auf meinem Blatt nicht funktionieren", und die Antwort ist, dass Sie zwei unverwandte Werkzeuge in der Hand halten, die zufällig ein Wort teilen. Sie sind keine Varianten voneinander:
Filter() — die Funktion |
AutoFilter — die Methode |
|
|---|---|---|
| Arbeitet auf | einem 1-D-Array im Speicher | einem Arbeitsblatt-Range |
| Liefert | ein neues, kleineres Array | nichts — sie blendet Zeilen aus in der Oberfläche |
| Berührt Zellen? | nie | ja, es ist ein sichtbarer Blattzustand |
| Trefferart | Teilstring, Groß-/Kleinschreibung beachtend | gleich / enthält / größer-als, über Kriterien |
| Sie wollen sie, wenn | Sie schon ein Array haben | Sie einem Nutzer gefilterte Zeilen zeigen wollen |
Liegen Ihre Daten in Zellen und Sie wollen sie eingrenzen, dann wollen Sie
AutoFilter oder, für Kopien mit mehreren Kriterien,
Spezialfilter — nicht diese Funktion. Filter() verdient seinen Platz
nachdem Sie Daten in ein Array gezogen haben. Eine gängige, korrekte Pipeline ist: eine Spalte
lesen, sie zu einem 1-D-Array flach machen (eine Aufgabe für Transpose),
dann im Speicher Filtern, ganz ohne das Blatt anzurühren.
Falle 1: Filter trifft einen Teilstring, keinen ganzen Wert
Filter behält jedes Element, in dem der Trefftext irgendwo darin auftaucht. Das ist ein Feature
für „enthält"-Suchen und ein Fußschuss für „gleich"-Suchen:
Dim codes As Variant, r As Variant
codes = Array("AB", "ABC", "CAB", "XY")
r = Filter(codes, "AB")
' r haelt "AB", "ABC" UND "CAB" - jedes Element, das "AB" ENTHAELT
Wollten Sie nur die Elemente, die gleich "AB" sind, ist Filter das falsche Werkzeug — es kann
keinen exakten Abgleich. Für einen Test auf exakte Mitgliedschaft greifen Sie zu einem
Dictionary (dict.Exists(key)) oder Application.Match. Nutzen Sie
Filter, wenn „enthält" wirklich das ist, was Sie meinen.
Falle 2: Filter beachtet standardmäßig die Groß-/Kleinschreibung
Ab Werk nutzt Filter einen binären Vergleich — "smith" trifft nicht "Smith". Das ist das
Gegenteil des mentalen Standards der meisten Leute und liefert stillschweigend ein leeres Array. Das
vierte Argument behebt es:
r = Filter(names, "smith") ' binaer -> verfehlt "Smith"
r = Filter(names, "smith", True, vbTextCompare) ' Text -> trifft "Smith", "SMITH", "smith"
Beachten Sie, dass Sie das dritte Argument (Include, hier True) angeben müssen, um das vierte zu
erreichen. Als Alternative macht Option Compare Text am Kopf des Moduls jeden Stringvergleich in
diesem Modul unabhängig von der Groß-/Kleinschreibung, Filter eingeschlossen — praktisch, aber es
ändert das Verhalten modulweit, übergeben Sie also vbTextCompare pro Aufruf, wenn Sie den Effekt
lokal wollen.
Falle 3: kein Treffer liefert ein leeres Array, und Include kehrt um
Ein Filter, der nichts trifft, wirft keinen Fehler — er liefert ein gültiges Array der Länge null,
dessen UBound -1 ist. Eine Schleife For i = 0 To UBound(r) darüber tut harmlos nichts, aber
der Griff nach r(0) fliegt Ihnen mit „Index außerhalb des gültigen Bereichs" um die Ohren. Sichern
Sie über UBound ab, bevor Sie indizieren:
r = Filter(names, "Zzz")
If UBound(r) < 0 Then
MsgBox "No matches."
Else
MsgBox (UBound(r) + 1) & " match(es) found." ' Anzahl = UBound + 1
End If
Und das Argument, an das sich fast niemand erinnert: Include. Es steht standardmäßig auf True (die
Treffer behalten). Übergeben Sie False, und Filter kehrt um — es behält jedes Element, das den
Treffer nicht enthält. So streichen Sie Elemente in einer Zeile aus einer Liste:
' Jeden Pfad verwerfen, der "temp" erwaehnt
clean = Filter(paths, "temp", False)
Die Meinung: Filter ist für Arrays, die Sie schon halten — und die Split-Filter-Join-Zeile
Filter ist hervorragender Kleber und ein schwacher Motor. Es glänzt auf Daten, die bereits ein
1-D-String-Array sind und wo „enthält" die echte Frage ist — eine Ordnerauflistung trimmen, Tokens aus
einem Split eingrenzen, die Fehlerzeilen aus einem Log-Array behalten. Es ist die falsche Antwort in
dem Moment, in dem Sie exakte Treffer wollen (nehmen Sie ein Dictionary), in dem Ihre Daten noch in
Zellen stecken (nehmen Sie AutoFilter), oder in dem die Elemente keine Strings sind (Filter zwingt zu
String und vergleicht Text, was bei Zahlen still in die Irre führt).
Sein bester Trick ist, die Mitte einer Drei-Funktionen-Pipeline zu sein. Split zerlegt, Filter behält, Join fügt zusammen — ein Ausdruck, der eine fünfzehnzeilige Schleife ersetzt:
' Aus einer CSV-Zeile nur die Felder mit "2026" behalten und neu zusammenfuegen
result = Join(Filter(Split(line, ","), "2026"), ", ")
Diese Zeile ist der ganze Cluster in Miniatur: Split macht aus dem String ein
Array, Filter grenzt es ein, Join fasst es wieder zusammen — keine Schleife,
keine Indexrechnerei, kein Off-by-One.
Wie ExcelMaster hilft
Filtern ist selten das Ziel. Das Ziel ist „zieh die überfälligen Rechnungen aus diesem Export, wirf die Testzeilen raus, und gib mir die Kundencodes." Bis Sie die Spalte in ein Array gelesen, es flach gemacht, die Groß-/Kleinschreibung abgesichert, das leere Ergebnis behandelt und die Überlebenden wieder zusammengefügt haben, erschlägt die Verkabelung die eine Antwort, die Sie wollten. ExcelMaster lässt Sie dieses Ziel in normaler Sprache formulieren — „liste die Kundencodes für jede überfällige Nicht-Test-Rechnung" — und erzeugt Python, das die Daten liest, die echte Trefferlogik anwendet und zuerst Ihre Datei sichert — Sie beschreiben das gewünschte Ergebnis, und es kümmert sich um die Groß-/Kleinschreibung, die leeren Fälle und die Ränder.
Häufig gestellte Fragen
Was macht die Filter-Funktion in VBA?
Filter(sourceArray, match) liefert ein neues Array, das nur die Elemente von sourceArray enthält,
die den Teilstring match enthalten. Die Quelle muss ein eindimensionales Array sein, und das Ergebnis
ist immer nullbasiert. Es durchsucht ein Array im Speicher und liefert ein kleineres Array — es ändert
keine Zellen.
Ist VBA Filter dasselbe wie AutoFilter?
Nein. Filter() ist eine Funktion, die ein eindimensionales Array im Speicher eingrenzt und ein neues
Array liefert. AutoFilter ist eine Arbeitsblattmethode, die anhand von Kriterien Zeilen im sichtbaren
Blatt ausblendet. Sie teilen einen Namen und sonst nichts — stecken Ihre Daten in Zellen, wollen Sie
AutoFilter; sind sie schon ein Array, wollen Sie Filter().
Warum liefert VBA Filter nichts, obwohl der Text eindeutig passt?
Fast immer die Groß-/Kleinschreibung. Filter nutzt standardmäßig einen binären Vergleich, also trifft
"smith" nicht "Smith". Übergeben Sie vbTextCompare als viertes Argument —
Filter(a, "smith", True, vbTextCompare) — oder setzen Sie Option Compare Text an den Kopf des
Moduls.
Wie schließe ich mit VBA Filter Elemente aus?
Übergeben Sie False als drittes Argument, Include. Filter(paths, "temp", False) liefert jedes
Element, das "temp" nicht enthält. Ist Include weggelassen oder True, behält Filter die
Treffer; mit False behält es die Nicht-Treffer.
Wie prüfe ich, ob VBA Filter Treffer gefunden hat?
Prüfen Sie den UBound des Ergebnisses. Ein Filter ohne Treffer liefert ein leeres Array, dessen
UBound -1 ist, keinen Fehler, also bedeutet If UBound(result) < 0 Then, dass nichts passte. Die
Anzahl der Treffer ist UBound(result) + 1, da das Array nullbasiert ist.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 03.09.2026.
Verwandte Anleitungen: VBA Join · VBA Transpose · VBA Split · VBA AutoFilter · VBA Dictionary
