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

VBA Filter in Excel — ein Array in einem Aufruf eingrenzen, und warum es nicht AutoFilter ist

|

VBA Filter in Excel — ein Array in einem Aufruf eingrenzen, und warum es nicht AutoFilter ist

TL;DRFilter(sourceArray, match) liefert ein neues, nullbasiertes Array, das nur die Elemente enthält, die den Teilstring match enthalten. Es ist eine Suche über ein Array im Speicher, kein Blatt — nichts mit AutoFilter zu tun. Drei Dinge beißen: Es trifft einen Teilstring (also behält "AB" auch "CAB"), es beachtet standardmäßig die Groß-/Kleinschreibung (übergeben Sie vbTextCompare, um sie zu ignorieren), und ein Ergebnis ohne Treffer ist ein leeres Array mit UBound = -1, kein Fehler. Das optionale dritte Argument Include kehrt 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 Filter nicht AutoFilter ist und wann Sie tatsächlich welches wollen
  • Die Teilstring-Falle: Filter trifft 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 Filterwelche 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