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.
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
- Makro schreiben, das tblReports nur auf Februar filtert, mit
AutoFilter Field:=1. - Erweiterung: Filter für Region (Field:=2) auf „East“ und „West“ gleichzeitig setzen, mit
xlFilterValues. - Beide Filter löschen, dann die Tabelle zuerst nach Region aufsteigend, dann nach Profit absteigend sortieren, mit dem oben gezeigten Sort-Objekt.
1. Filterung auf Februar
Field:=1bezieht sich auf die erste Spalte der Tabelle, nicht auf das Arbeitsblatt — Monat ist Spalte 1 innerhalb vontblReports, unabhängig davon, in welcher Arbeitsblattspalte sie tatsächlich steht.Criteria1erwartet den exakten Text, nach dem gefiltert wird, in Anführungszeichen.AutoFilterwird auftbl.Rangeangewendet, 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ätzlichOperator:=xlFilterValues— das Weglassen dieses Operators ist der häufigste Fehler. - Beide Filter (Monat und Region) können gleichzeitig aktiv sein — einfach
AutoFilterzweimal aufrufen, jeweils für eine Spalte.
3. Filter löschen und sortieren
- Vor dem Aufruf von
tbl.AutoFilter.FilterModeprüfen, obShowAllDataaktiv ist — ein Aufruf ohne aktiven Filter führt zu einem Fehler. - Das
Sort-Objekt benötigt zuerst.SortFields.Clear, dann jeweils ein.SortFields.Add2pro 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.
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.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
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.
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
- Makro schreiben, das tblReports nur auf Februar filtert, mit
AutoFilter Field:=1. - Erweiterung: Filter für Region (Field:=2) auf „East“ und „West“ gleichzeitig setzen, mit
xlFilterValues. - Beide Filter löschen, dann die Tabelle zuerst nach Region aufsteigend, dann nach Profit absteigend sortieren, mit dem oben gezeigten Sort-Objekt.
1. Filterung auf Februar
Field:=1bezieht sich auf die erste Spalte der Tabelle, nicht auf das Arbeitsblatt — Monat ist Spalte 1 innerhalb vontblReports, unabhängig davon, in welcher Arbeitsblattspalte sie tatsächlich steht.Criteria1erwartet den exakten Text, nach dem gefiltert wird, in Anführungszeichen.AutoFilterwird auftbl.Rangeangewendet, 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ätzlichOperator:=xlFilterValues— das Weglassen dieses Operators ist der häufigste Fehler. - Beide Filter (Monat und Region) können gleichzeitig aktiv sein — einfach
AutoFilterzweimal aufrufen, jeweils für eine Spalte.
3. Filter löschen und sortieren
- Vor dem Aufruf von
tbl.AutoFilter.FilterModeprüfen, obShowAllDataaktiv ist — ein Aufruf ohne aktiven Filter führt zu einem Fehler. - Das
Sort-Objekt benötigt zuerst.SortFields.Clear, dann jeweils ein.SortFields.Add2pro 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.
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.
Danke für Ihr Feedback!