Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Sortieren und Filtern von Daten | Tabellen und Berichte Automatisieren
Excel VBA für Geschäftsautomatisierung

Sortieren und Filtern von Daten

Swipe um das Menü anzuzeigen

Filtern schränkt die sichtbaren Daten ein, ohne die zugrunde liegenden Daten zu verändern – unerlässlich für Berichte, die jeweils nur einen Monat oder eine Region anzeigen sollen.

Abbildung 4.2

Grundlegender AutoFilter

tbl.Range.AutoFilter Field:=1, Criteria1:="January"
' Field:=1 means the 1st column of the table (Month)

AutoFilter löscht oder verschiebt keine Daten – es blendet die Zeilen aus, die nicht übereinstimmen, genau so, als hätte man im Dropdown-Pfeil alles außer January manuell abgewählt. Field:=1 zählt die Spalten ab 1 innerhalb der Tabelle selbst (Month, Region, Sales, Expenses, Profit, Target – daher wäre Region Field:=2, Profit Field:=5), weshalb diese Angabe angepasst werden muss, falls die Spaltenreihenfolge geändert wird.

Filter mit mehreren Bedingungen

Das Filtern nach mehr als einem Wert in derselben Spalte erfordert xlFilterValues und ein Array von Kriterien:

tbl.Range.AutoFilter Field:=2, _
    Criteria1:=Array("North", "Central"), _
    Operator:=xlFilterValues

Im Vergleich zum Einzelwert-Filter oben: Criteria1 enthält jetzt ein Array(...) zulässiger Werte statt nur einen einfachen String, und Operator:=xlFilterValues weist AutoFilter an, dieses Array als Liste von Treffern zu behandeln, anstatt es als einzelne Kriterienausdruck zu interpretieren. Wird Operator:=xlFilterValues weggelassen, führt diese Zeile entweder zu einem Fehler oder zu unerwartetem Verhalten – das ist leicht zu übersehen und sollte immer überprüft werden, wenn Criteria1 eine Liste ist.

Das Filtern nach einer numerischen Bedingung – zum Beispiel nur Zeilen, bei denen Profit das Target deutlich übersteigt – verwendet stattdessen Vergleichsoperatoren:

tbl.Range.AutoFilter Field:=5, Criteria1:=">15000"

Beachte, dass ">15000" als Text in Anführungszeichen geschrieben wird, obwohl es sich um einen numerischen Vergleich handelt – AutoFilter erwartet Criteria1 immer als String und analysiert das führende > selbst. Wird Criteria1:=15000 ohne das > geschrieben, werden nur Zeilen mit genau 15000 gefiltert, nicht aber größere Werte – ein häufiger und leicht zu machender Fehler.

Sortieren

Das Sort-Objekt unterstützt mehrere Schlüssel, genau wie der Dialog Daten → Sortieren:

With tbl.Sort
    .SortFields.Clear
    .SortFields.Add2 Key:=tbl.ListColumns("Month").Range, _
        SortOn:=xlSortOnValues, Order:=xlAscending
    .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
        SortOn:=xlSortOnValues, Order:=xlDescending
    .Header = xlYes
    .Apply
End With

.SortFields.Clear wird zuerst ausgeführt, damit übrig gebliebene Sortierschlüssel aus einem vorherigen Makro-Lauf (oder durch manuelles Sortieren der Tabelle) nicht unbemerkt mit den neuen kombiniert werden – immer vor dem Hinzufügen löschen. Die Reihenfolge der beiden .Add2-Aufrufe ist genauso wichtig wie deren Order:=xlAscending/xlDescending-Einstellungen: Der zuerst hinzugefügte Schlüssel wird zum primären Sortierschlüssel (Month), der zweite dient als Tiebreaker innerhalb jeder Gruppe (Profit, jeweils höchster Wert zuerst innerhalb eines Monats). .Header = xlYes teilt Excel mit, dass Zeile 1 eine Kopfzeile ist und nicht verschoben werden darf; .Apply löst die Sortierung tatsächlich aus – alles davor baut nur die Anweisungen auf.

Filter zurücksetzen

Filter sollten immer zu Beginn eines Berichts-Makros zurückgesetzt werden, damit jeder Durchlauf von einem bekannten, ungefilterten Zustand startet:

If tbl.AutoFilter.FilterMode Then
    tbl.AutoFilter.ShowAllData
End If

FilterMode ist ein Boolean, der True ist, sobald irgendein Filter die sichtbaren Zeilen der Tabelle einschränkt – die Abfrage verhindert einen Laufzeitfehler, da ein Aufruf von ShowAllData ohne aktiven Filter einen Fehler auslöst, anstatt einfach nichts zu tun.

Aufgabe

  1. Makro schreiben, das tblReports nur auf Februar filtert, mit AutoFilter Field:=1.
  2. Erweiterung: Filter für Region (Field:=2) auf „East“ und „West“ gleichzeitig setzen, mit xlFilterValues.
  3. Beide Filter löschen, dann die Tabelle zuerst nach Region aufsteigend, dann nach Profit absteigend sortieren, mit dem oben gezeigten Sort-Objekt.
Hinweis
expand arrow

1. Filterung auf Februar

  • Field:=1 bezieht sich auf die erste Spalte der Tabelle, nicht auf das Arbeitsblatt — Monat ist Spalte 1 innerhalb von tblReports, unabhängig davon, in welcher Arbeitsblattspalte sie tatsächlich steht.
  • Criteria1 erwartet den exakten Text, nach dem gefiltert wird, in Anführungszeichen.
  • AutoFilter wird auf tbl.Range angewendet, nicht direkt auf das Arbeitsblatt.

2. Hinzufügen des Region-Filters

  • Region ist die zweite Spalte der Tabelle, daher eine andere Field:=-Nummer als beim Monatsfilter.
  • Für die Filterung auf zwei Werte in derselben Spalte wird Criteria1:=Array(...) mit beiden Werten verwendet, zusätzlich Operator:=xlFilterValues — das Weglassen dieses Operators ist der häufigste Fehler.
  • Beide Filter (Monat und Region) können gleichzeitig aktiv sein — einfach AutoFilter zweimal aufrufen, jeweils für eine Spalte.

3. Filter löschen und sortieren

  • Vor dem Aufruf von tbl.AutoFilter.FilterMode prüfen, ob ShowAllData aktiv ist — ein Aufruf ohne aktiven Filter führt zu einem Fehler.
  • Das Sort-Objekt benötigt zuerst .SortFields.Clear, dann jeweils ein .SortFields.Add2 pro Sortier-Ebene — die Reihenfolge des Hinzufügens entscheidet, welches das Primär- und welches das Sekundärsortierkriterium ist, nicht die Reihenfolge in der Tabelle.
  • Region aufsteigend sollte vor Profit absteigend hinzugefügt werden, da Region das primäre Sortierkriterium ist.
Lösung
expand arrow
Option Explicit

Sub FilterToFebruary()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
End Sub

Sub FilterFebruaryEastWest()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
    tbl.Range.AutoFilter Field:=2, _
        Criteria1:=Array("East", "West"), _
        Operator:=xlFilterValues
End Sub

Sub ClearFiltersAndSort()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    ' Clear any active filters
    If tbl.AutoFilter.FilterMode Then
        tbl.AutoFilter.ShowAllData
    End If

    ' Sort by Region ascending, then Profit descending
    With tbl.Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=tbl.ListColumns("Region").Range, _
            SortOn:=xlSortOnValues, Order:=xlAscending
        .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
            SortOn:=xlSortOnValues, Order:=xlDescending
        .Header = xlYes
        .Apply
    End With
End Sub

Nach Ausführen von FilterFebruaryEastWest werden nur noch Februar-Zeilen für die Regionen East und West angezeigt. Anschließend ClearFiltersAndSort ausführen — alle Zeilen erscheinen wieder, sortiert zuerst nach Region (alphabetisch) und innerhalb jeder Region steht der höchste Profit oben.

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 4. Kapitel 2

Fragen Sie AI

expand

Fragen Sie AI

ChatGPT

Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen

Sortieren und Filtern von Daten

Filtern schränkt die sichtbaren Daten ein, ohne die zugrunde liegenden Daten zu verändern – unerlässlich für Berichte, die jeweils nur einen Monat oder eine Region anzeigen sollen.

Abbildung 4.2

Grundlegender AutoFilter

tbl.Range.AutoFilter Field:=1, Criteria1:="January"
' Field:=1 means the 1st column of the table (Month)

AutoFilter löscht oder verschiebt keine Daten – es blendet die Zeilen aus, die nicht übereinstimmen, genau so, als hätte man im Dropdown-Pfeil alles außer January manuell abgewählt. Field:=1 zählt die Spalten ab 1 innerhalb der Tabelle selbst (Month, Region, Sales, Expenses, Profit, Target – daher wäre Region Field:=2, Profit Field:=5), weshalb diese Angabe angepasst werden muss, falls die Spaltenreihenfolge geändert wird.

Filter mit mehreren Bedingungen

Das Filtern nach mehr als einem Wert in derselben Spalte erfordert xlFilterValues und ein Array von Kriterien:

tbl.Range.AutoFilter Field:=2, _
    Criteria1:=Array("North", "Central"), _
    Operator:=xlFilterValues

Im Vergleich zum Einzelwert-Filter oben: Criteria1 enthält jetzt ein Array(...) zulässiger Werte statt nur einen einfachen String, und Operator:=xlFilterValues weist AutoFilter an, dieses Array als Liste von Treffern zu behandeln, anstatt es als einzelne Kriterienausdruck zu interpretieren. Wird Operator:=xlFilterValues weggelassen, führt diese Zeile entweder zu einem Fehler oder zu unerwartetem Verhalten – das ist leicht zu übersehen und sollte immer überprüft werden, wenn Criteria1 eine Liste ist.

Das Filtern nach einer numerischen Bedingung – zum Beispiel nur Zeilen, bei denen Profit das Target deutlich übersteigt – verwendet stattdessen Vergleichsoperatoren:

tbl.Range.AutoFilter Field:=5, Criteria1:=">15000"

Beachte, dass ">15000" als Text in Anführungszeichen geschrieben wird, obwohl es sich um einen numerischen Vergleich handelt – AutoFilter erwartet Criteria1 immer als String und analysiert das führende > selbst. Wird Criteria1:=15000 ohne das > geschrieben, werden nur Zeilen mit genau 15000 gefiltert, nicht aber größere Werte – ein häufiger und leicht zu machender Fehler.

Sortieren

Das Sort-Objekt unterstützt mehrere Schlüssel, genau wie der Dialog Daten → Sortieren:

With tbl.Sort
    .SortFields.Clear
    .SortFields.Add2 Key:=tbl.ListColumns("Month").Range, _
        SortOn:=xlSortOnValues, Order:=xlAscending
    .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
        SortOn:=xlSortOnValues, Order:=xlDescending
    .Header = xlYes
    .Apply
End With

.SortFields.Clear wird zuerst ausgeführt, damit übrig gebliebene Sortierschlüssel aus einem vorherigen Makro-Lauf (oder durch manuelles Sortieren der Tabelle) nicht unbemerkt mit den neuen kombiniert werden – immer vor dem Hinzufügen löschen. Die Reihenfolge der beiden .Add2-Aufrufe ist genauso wichtig wie deren Order:=xlAscending/xlDescending-Einstellungen: Der zuerst hinzugefügte Schlüssel wird zum primären Sortierschlüssel (Month), der zweite dient als Tiebreaker innerhalb jeder Gruppe (Profit, jeweils höchster Wert zuerst innerhalb eines Monats). .Header = xlYes teilt Excel mit, dass Zeile 1 eine Kopfzeile ist und nicht verschoben werden darf; .Apply löst die Sortierung tatsächlich aus – alles davor baut nur die Anweisungen auf.

Filter zurücksetzen

Filter sollten immer zu Beginn eines Berichts-Makros zurückgesetzt werden, damit jeder Durchlauf von einem bekannten, ungefilterten Zustand startet:

If tbl.AutoFilter.FilterMode Then
    tbl.AutoFilter.ShowAllData
End If

FilterMode ist ein Boolean, der True ist, sobald irgendein Filter die sichtbaren Zeilen der Tabelle einschränkt – die Abfrage verhindert einen Laufzeitfehler, da ein Aufruf von ShowAllData ohne aktiven Filter einen Fehler auslöst, anstatt einfach nichts zu tun.

Aufgabe

  1. Makro schreiben, das tblReports nur auf Februar filtert, mit AutoFilter Field:=1.
  2. Erweiterung: Filter für Region (Field:=2) auf „East“ und „West“ gleichzeitig setzen, mit xlFilterValues.
  3. Beide Filter löschen, dann die Tabelle zuerst nach Region aufsteigend, dann nach Profit absteigend sortieren, mit dem oben gezeigten Sort-Objekt.
Hinweis
expand arrow

1. Filterung auf Februar

  • Field:=1 bezieht sich auf die erste Spalte der Tabelle, nicht auf das Arbeitsblatt — Monat ist Spalte 1 innerhalb von tblReports, unabhängig davon, in welcher Arbeitsblattspalte sie tatsächlich steht.
  • Criteria1 erwartet den exakten Text, nach dem gefiltert wird, in Anführungszeichen.
  • AutoFilter wird auf tbl.Range angewendet, nicht direkt auf das Arbeitsblatt.

2. Hinzufügen des Region-Filters

  • Region ist die zweite Spalte der Tabelle, daher eine andere Field:=-Nummer als beim Monatsfilter.
  • Für die Filterung auf zwei Werte in derselben Spalte wird Criteria1:=Array(...) mit beiden Werten verwendet, zusätzlich Operator:=xlFilterValues — das Weglassen dieses Operators ist der häufigste Fehler.
  • Beide Filter (Monat und Region) können gleichzeitig aktiv sein — einfach AutoFilter zweimal aufrufen, jeweils für eine Spalte.

3. Filter löschen und sortieren

  • Vor dem Aufruf von tbl.AutoFilter.FilterMode prüfen, ob ShowAllData aktiv ist — ein Aufruf ohne aktiven Filter führt zu einem Fehler.
  • Das Sort-Objekt benötigt zuerst .SortFields.Clear, dann jeweils ein .SortFields.Add2 pro Sortier-Ebene — die Reihenfolge des Hinzufügens entscheidet, welches das Primär- und welches das Sekundärsortierkriterium ist, nicht die Reihenfolge in der Tabelle.
  • Region aufsteigend sollte vor Profit absteigend hinzugefügt werden, da Region das primäre Sortierkriterium ist.
Lösung
expand arrow
Option Explicit

Sub FilterToFebruary()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
End Sub

Sub FilterFebruaryEastWest()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    tbl.Range.AutoFilter Field:=1, Criteria1:="February"
    tbl.Range.AutoFilter Field:=2, _
        Criteria1:=Array("East", "West"), _
        Operator:=xlFilterValues
End Sub

Sub ClearFiltersAndSort()
    Dim tbl As ListObject
    Set tbl = ThisWorkbook.Worksheets("Reports").ListObjects("tblReports")

    ' Clear any active filters
    If tbl.AutoFilter.FilterMode Then
        tbl.AutoFilter.ShowAllData
    End If

    ' Sort by Region ascending, then Profit descending
    With tbl.Sort
        .SortFields.Clear
        .SortFields.Add2 Key:=tbl.ListColumns("Region").Range, _
            SortOn:=xlSortOnValues, Order:=xlAscending
        .SortFields.Add2 Key:=tbl.ListColumns("Profit").Range, _
            SortOn:=xlSortOnValues, Order:=xlDescending
        .Header = xlYes
        .Apply
    End With
End Sub

Nach Ausführen von FilterFebruaryEastWest werden nur noch Februar-Zeilen für die Regionen East und West angezeigt. Anschließend ClearFiltersAndSort ausführen — alle Zeilen erscheinen wieder, sortiert zuerst nach Region (alphabetisch) und innerhalb jeder Region steht der höchste Profit oben.

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 4. Kapitel 2
some-alt