Excel VBA: Tabellen mit ODER-Kriterien filtern

Melden

Dieses Tutorial zeigt dir, wie du mithilfe von VBA (Visual Basic for Applications) Daten in einer Excel-Tabelle (einem sogenannten ListObject) mit ODER-Verknüpfungen filtern kannst.

In Excel VBA ist die Handhabung von ODER-Filtern unterschiedlich, je nachdem, ob du innerhalb derselben Spalte oder über verschiedene Spalten hinweg filtern möchtest.


Voraussetzungen

Stelle sicher, dass deine Daten als Tabelle formatiert sind (Einfügen > Tabelle) und gib ihr einen Namen (z. B. "MeineTabelle").


Szenario 1: Mehrere Werte in derselben Spalte filtern

Dies ist der häufigste Fall. Du möchtest eine Spalte nach "Wert A" ODER "Wert B" filtern.

Der VBA-Code

Hier nutzen wir ein Array und den Operator xlFilterValues.

Sub FilterGleicheSpalteODER()
    Dim lo As ListObject
    Dim SpaltenIndex As Integer

    ' Tabelle referenzieren
    Set lo = ActiveSheet.ListObjects("MeineTabelle")

    ' Index der Spalte, die gefiltert werden soll (z.B. Spalte 2: "Region")
    SpaltenIndex = 2

    ' Filter setzen: Filtert nach "Nord" ODER "Süd"
    lo.Range.AutoFilter Field:=SpaltenIndex, _
        Criteria1:=Array("Nord", "Süd", "West"), _
        Operator:=xlFilterValues

End Sub

Erklärung:

  • Criteria1:=Array(...): Hier listest du alle Werte auf, die angezeigt werden sollen.
  • Operator:=xlFilterValues: Dies ist entscheidend, damit Excel weiß, dass es sich um eine Liste von Werten handelt.

Szenario 2: ODER-Logik über verschiedene Spalten hinweg

Das ist mit dem Standard-AutoFilter in VBA schwierig, da dieser mehrere Spalten normalerweise mit UND verknüpft (z.B. Region="Nord" UND Umsatz > 1000).

Um eine echte ODER-Logik über Spalten hinweg zu realisieren (z.B. Region="Nord" ODER Umsatz > 1000), gibt es zwei gängige Wege:

Methode A: Der Spezialfilter (AdvancedFilter)

Dies ist die sauberste Methode für komplexe Logik. Du benötigst einen Kriterienbereich im Arbeitsblatt.

Sub FilterMehrereSpaltenODER()
    Dim lo As ListObject
    Dim bereichKriterien As Range

    Set lo = ActiveSheet.ListObjects("MeineTabelle")

    ' Definiere den Kriterienbereich (z.B. Zellen E1:F3)
    ' E1: "Region", F1: "Umsatz"
    ' E2: "Nord", F2: (leer)
    ' E3: (leer), F3: ">1000"
    ' (Werte in verschiedenen Zeilen bedeuten ODER)
    Set bereichKriterien = ActiveSheet.Range("E1:F3")

    ' Spezialfilter anwenden
    lo.Range.AdvancedFilter Action:=xlFilterInPlace, _
        CriteriaRange:=bereichKriterien

End Sub

Methode B: Die Hilfsspalten-Methode (Empfohlen für VBA-Anfänger)

Du erstellst per VBA eine temporäre Spalte, die eine Formel berechnet (WAHR/FALSCH), und filterst dann nur diese Spalte.

Sub FilterMitHilfsspalte()
    Dim lo As ListObject
    Set lo = ActiveSheet.ListObjects("MeineTabelle")

    ' 1. Hilfsspalte hinzufügen (falls nicht vorhanden)
    On Error Resume Next
    lo.ListColumns.Add Name:="FilterCheck"
    On Error GoTo 0

    ' 2. ODER-Formel in die Hilfsspalte schreiben
    ' Beispiel: Region (Spalte 2) = "Nord" ODER Umsatz (Spalte 3) > 1000
    lo.ListColumns("FilterCheck").DataBodyRange.Formula2R1C1 = _
        "=OR([@Region]=""Nord"", [@Umsatz]>1000)"

    ' 3. Nach "TRUE" (WAHR) filtern
    lo.Range.AutoFilter Field:=lo.ListColumns("FilterCheck").Index, Criteria1:="TRUE"
End Sub

Filter wieder aufheben

Um alle Filter zu löschen und wieder alle Daten anzuzeigen, nutzt du diesen kurzen Befehl:

Sub FilterLoeschen()
    Dim lo As ListObject
    Set lo = ActiveSheet.ListObjects("MeineTabelle")

    ' Prüfen, ob ein Filter aktiv ist, dann zeigen
    If lo.ShowAutoFilter Then
        lo.AutoFilter.ShowAllData
    End If
End Sub

Zusammenfassung: Welchen Operator brauche ich?

  1. Gleiche Spalte, zwei Werte: Criteria1:="A", Operator:=xlOr, Criteria2:="B"
  2. Gleiche Spalte, mehr als zwei Werte: Criteria1:=Array("A", "B", "C"), Operator:=xlFilterValues
  3. Verschiedene Spalten: Nutze AdvancedFilter oder eine Hilfsspalte mit einer ODER()-Formel.

Profi-Tipp:

Wenn du mit Datumsangaben in Arrays arbeitest, achte darauf, dass Excel VBA Daten oft im US-Format (mm/dd/yyyy) erwartet, wenn sie gefiltert werden sollen. Konvertiere die Array-Elemente im Zweifelsfall mit CStr(deinDatum).

0