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

VBA AutoFilter in Excel — Zeilen im Code filtern (und warum ausgeblendet nicht gelöscht ist)

|

VBA AutoFilter in Excel — Zeilen im Code filtern (und warum ausgeblendet nicht gelöscht ist)

Kurz gesagtAutoFilter blendet die Zeilen aus, die nicht zu Ihren Kriterien passen — es entfernt sie nicht. Diese ausgeblendeten Zeilen sind weiterhin im Bereich, werden weiterhin von SUM gezählt und von einem schlichten .Copy weiterhin mitkopiert. Um nur das zu lesen, zu kopieren oder zu löschen, was sichtbar ist, müssen Sie über .SpecialCells(xlCellTypeVisible) gehen. Und achten Sie auf die Umschaltfalle: .AutoFilter ohne Argumente aufzurufen schaltet das Filtern an oder aus, sodass ein Makro, das „einen Filter setzt“, den Filter beim zweiten Lauf ausschalten kann. Räumen Sie den Zustand zuerst mit .AutoFilterMode = False auf.

' Eine Tabelle auf Region = "West" filtern, dann nur auf die SICHTBAREN Zeilen wirken.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Sales")
ws.AutoFilterMode = False                      ' zuerst jeden verbliebenen Filter raeumen

With ws.Range("A1").CurrentRegion              ' die ganze Tabelle inkl. Kopfzeile
    .AutoFilter Field:=2, Criteria1:="West"    ' Field ist 1-basiert INNERHALB des Bereichs
    ' nur sichtbare Datenzeilen (Kopfzeile mit Offset(1) ueberspringen):
    .Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Copy _
        Destination:=Worksheets("West").Range("A1")
End With
ws.AutoFilterMode = False                       ' den Filter am Ende entfernen

AutoFilter ist der schnellste Weg, eine Tabelle auf die Zeilen einzugrenzen, die Sie interessieren, und es ist der Motor hinter dem schnellsten Massenlöschen in Excel-VBA. Doch es täuscht Menschen, weil es aussieht, als hätte es Zeilen entfernt, obwohl es sie nur ausgeblendet hat. Fast jeder AutoFilter-Bug ist eine Spielart dieses einen Missverständnisses, und genau dort setzt diese Anleitung an.

Was Sie lernen

  • Das mentale Modell — AutoFilter ist eine Ansicht, kein Löschen; ausgeblendete Zeilen sind weiterhin da
  • Warum SUM und .Copy herausgefilterte Zeilen weiterhin einschließen und wie SpecialCells(xlCellTypeVisible) das behebt
  • Kriterien setzen — einzelne Werte, Vergleichsoperatoren, zwei Bedingungen und „in einer Liste“
  • Die Umschaltfalle — warum ein .AutoFilter-Aufruf ohne Argumente das Filtern abschaltet
  • Das professionelle Muster aus Filtern-dann-Löschen, um Tausende Zeilen schnell zu entfernen
  • AutoFilter vs die FILTER-Funktion vs Spezialfilter — zu welchem man greift

Das mentale Modell: ein Filter ist eine Ansicht, kein Löschen

Wenn Sie einen Filter anwenden, tut Excel genau eine Sache: Es setzt die Eigenschaft hidden auf jede Zeile, die nicht passt. Die Daten bewegen sich nicht. Nichts wird entfernt. Sie betrachten denselben Bereich durch eine Schablone, die einige Zeilen aus der Ansicht nimmt.

Das ist die ganze Idee, und sie hat eine Folge, die man beim ersten Mal überraschend findet: Alles, was auf dem Bereich arbeitet, sieht die ausgeblendeten Zeilen weiterhin. =SUM(B2:B1000) addiert die herausgefilterten Zahlen. Range("B2:B1000").Copy kopiert sie alle, ausgeblendet oder nicht. Eine For Each cell-Schleife besucht jede einzelne. Der Filter änderte, was Sie sehen; er änderte nicht, was der Bereich enthält.

Das mentale Modell ist also eine Frage, die Sie vor jedem Vorgang auf einer gefilterten Tabelle stellen: Will ich alle Zeilen oder nur die sichtbaren? Lautet die Antwort „nur die sichtbaren“, können Sie den Bereich nicht direkt nutzen — Sie müssen Excel ausdrücklich nach der sichtbaren Teilmenge fragen. Das ist die eine Gewohnheit, die AutoFilter zuverlässig macht.

Die wichtigste Regel: sichtbare Zeilen über SpecialCells erreichen

Um nur die Zeilen anzufassen, die der Filter sichtbar gelassen hat, wandeln Sie den Bereich in seine sichtbaren Zellen um:

Dim visible As Range
On Error Resume Next     ' xlCellTypeVisible wirft 1004, wenn nichts sichtbar ist
Set visible = ws.Range("A1").CurrentRegion.Offset(1) _
                  .SpecialCells(xlCellTypeVisible)
On Error GoTo 0

If Not visible Is Nothing Then
    ' visible ist ein MEHRFLAECHIGER Bereich - die gefilterten Zeilen sind nicht zusammenhaengend
    MsgBox "Visible rows: " & visible.Rows.Count
End If

Zwei Dinge zum Verinnerlichen. Erstens: SpecialCells(xlCellTypeVisible) liefert einen mehrflächigen Bereich zurück — weil die sichtbaren Zeilen mit ausgeblendeten dazwischen verstreut sind. Durchlaufen Sie ihn mit For Each area In visible.Areas, wenn Sie Blöcke verarbeiten müssen, oder nutzen Sie .EntireRow-Operationen, die die Bereiche für Sie handhaben. Zweitens: Es wirft Fehler 1004, wenn nichts sichtbar ist (ein Filter, der auf null Zeilen passte), sichern Sie es also mit On Error ab. Lassen Sie SpecialCells weg und arbeiten auf dem rohen Bereich, dann arbeiten Sie klammheimlich auch auf den ausgeblendeten Zeilen — der mit Abstand häufigste AutoFilter-Fehler.

Kriterien setzen: Werte, Operatoren und Listen

AutoFilter nimmt ein Field (1-basiert innerhalb des gefilterten Bereichs, nicht der Spaltenbuchstabe des Blatts) und ein oder zwei Kriterien:

With ws.Range("A1").CurrentRegion
    ' exakter Wert
    .AutoFilter Field:=2, Criteria1:="West"

    ' Vergleich - der Operator steht im String
    .AutoFilter Field:=3, Criteria1:=">1000"

    ' zwei Bedingungen auf einem Field (zwischen 100 und 500)
    .AutoFilter Field:=3, Criteria1:=">=100", Operator:=xlAnd, Criteria2:="<=500"

    ' "in einer Liste" - ein Array plus xlFilterValues
    .AutoFilter Field:=2, Criteria1:=Array("West", "East"), Operator:=xlFilterValues
End With

Die Falle, die jeden einmal erwischt: Field zählt ab dem linken Rand des Bereichs, auf dem Sie .AutoFilter aufgerufen haben, nicht ab Spalte A des Blatts. Beginnt Ihre Tabelle in Spalte C, ist Field:=1 die Spalte C. Verrechnen Sie sich bei diesem Versatz, filtern Sie die falsche Spalte, ganz ohne Fehler.

Die Umschaltfalle: ein nacktes AutoFilter schaltet das Filtern aus

.AutoFilter ohne Argumente aufgerufen ist ein Umschalter — er schaltet die Filterpfeile ein, wenn sie aus sind, und aus, wenn sie an sind. Das macht ihn gefährlich in einem Makro, das mehr als einmal laufen könnte:

ws.Range("A1").CurrentRegion.AutoFilter    ' einmal ausfuehren: Pfeile AN. nochmal: Pfeile AUS.

Dieselbe Zustandsbehaftung beißt auf subtilere Weise: Ein Filter, der von einem früheren Lauf übrig ist — oder davon, dass ein Nutzer von Hand filtert —, ändert klammheimlich, was „sichtbar“ beim nächsten Mal bedeutet, wenn Ihr Code den Bereich liest. Vertrauen Sie dem geerbten Filterzustand nicht. Beginnen Sie damit, ihn zu räumen, und räumen Sie ihn erneut, wenn Sie fertig sind:

ws.AutoFilterMode = False   ' jeden bestehenden Filter entfernen - sauberer Start
' ... Ihren Filter anwenden, Ihre Arbeit tun ...
ws.AutoFilterMode = False   ' das Blatt so hinterlassen, wie Sie es vorgefunden haben

Die Prüfung If ws.AutoFilterMode Then sagt Ihnen, ob gerade ein Filter aktiv ist. Ihr Makro zustandsunabhängig zu machen — räumen, filtern, arbeiten, räumen — ist es, was die Bug-Klasse „lief einmal, brach beim zweiten Mal“ verhindert.

Das Muster, das man sich merken sollte: filtern, dann die sichtbaren Zeilen löschen

Deshalb verdient sich AutoFilter seinen Platz in ernsthaftem Code. Um Tausende Zeilen zu löschen, die auf eine Bedingung passen, ist das Filtern und Löschen der sichtbaren Zellen dramatisch schneller als das Schleifen — Excel übernimmt den Abgleich, und ein .Delete entfernt sie alle:

With ws.Range("A1").CurrentRegion
    .AutoFilter Field:=5, Criteria1:="Cancelled"
    ' sichtbare Datenzeilen loeschen - Offset(1) ueberspringt die Kopfzeile, sonst loeschen Sie Ihre Titel
    On Error Resume Next
    .Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete
    On Error GoTo 0
End With
ws.AutoFilterMode = False

Das .Offset(1) ist der Haken: Ohne es ist die Kopfzeile ebenfalls sichtbar und wird zusammen mit den Daten gelöscht. Dieser Ansatz aus Filtern-dann-Löschen passt natürlich zu den Löschtechniken in VBA Zeilen löschen — und es ist der Ansatz, zu dem ich statt einer Rückwärtsschleife greife, wann immer die Trefferzahl groß ist.

AutoFilter vs FILTER-Funktion vs Spezialfilter

Drei Werkzeuge teilen sich das Wort „Filter“ und lösen verschiedene Probleme:

  • AutoFilter blendet nicht passende Zeilen an Ort und Stelle aus. Nehmen Sie es, wenn Sie eine Teilmenge einer bestehenden Tabelle sehen, kopieren oder löschen wollen. Es ist eine Ansicht über das Original.
  • Die Tabellenfunktion FILTER() verteilt eine neue Matrix passender Zeilen anderswohin, live und neu berechnend. Nehmen Sie sie, wenn Sie eine formelgesteuerte Liste wollen, die sich selbst aktualisiert — kein Makro nötig.
  • Spezialfilter (Range.AdvancedFilter) kann Treffer an einen anderen Ort kopieren oder mit einem Kriterienbereich eindeutige Werte extrahieren. Nehmen Sie ihn für komplexe Extrakte mit mehreren Bedingungen.

Die Einschätzung: Für „diese Tabelle eingrenzen, damit ich auf die Treffer wirken kann“ ist AutoFilter richtig. Ertappen Sie sich beim Wunsch nach einer lebendigen, sich selbst aktualisierenden Liste von Treffern an einem anderen Ort, hören Sie auf, ein Makro zu schreiben — das ist die Aufgabe der FILTER()-Funktion, nicht die von AutoFilter.

Wie ExcelMaster hilft

AutoFilters Fallen sind allesamt stille: eine gefilterte Summe zu bilden und die ausgeblendeten Zeilen einzuschließen, zu kopieren und alles zu bekommen, ohne SpecialCells zu löschen und die falschen Zellen zu treffen, der Field-Versatz, der Umschalter, der Ihren Filter beim zweiten Lauf abschaltet. Keine wirft einen Fehler — sie wirken einfach auf Zeilen, die Sie für verschwunden hielten.

ExcelMaster lässt Sie sagen, was die Tabelle zeigen soll. Beschreiben Sie „behalte nur die Zeilen der Region West über 1000“ oder „lösche jede stornierte Bestellung“, und es räumt zuerst den veralteten Filterzustand, trifft den Field-Index richtig, geht über SpecialCells(xlCellTypeVisible) für alles, was nur sichtbare Zeilen anfasst, und sichert das Blatt vor dem Löschen. Sie behalten die Arbeitsmappe und den Code; Sie sparen sich den Teil, in dem sich eine ausgeblendete Zeile in Ihre Summe schleicht.

Häufig gestellte Fragen

Löscht VBA AutoFilter die Zeilen, die es herausfiltert?

Nein. AutoFilter blendet nur nicht passende Zeilen aus — sie bleiben im Bereich, werden weiterhin von SUM gezählt, von .Copy weiterhin kopiert und von Schleifen weiterhin besucht. Um nur auf den sichtbaren Zeilen zu arbeiten, müssen Sie über .SpecialCells(xlCellTypeVisible) gehen. Um Zeilen wirklich zu entfernen, filtern Sie und löschen dann die sichtbaren Zellen.

Warum schließt SUM in VBA meine herausgefilterten Zeilen weiterhin ein?

Weil das Filtern Zeilen ausblendet, sie nicht entfernt, und SUM ausgeblendete Werte addiert. Nehmen Sie SUBTOTAL(109, range) statt SUM, um nur sichtbare Zeilen zu summieren, oder summieren Sie in VBA .SpecialCells(xlCellTypeVisible). Das ist das deutlichste Zeichen, dass ein Filter eine Ansicht ist, kein Löschen.

Wie filtere ich in VBA AutoFilter nach zwei Bedingungen?

Übergeben Sie Criteria1, einen Operator und Criteria2. Für einen Bereich nehmen Sie xlAnd (Criteria1:=">=100", Operator:=xlAnd, Criteria2:="<=500"); für ein Entweder-oder nehmen Sie xlOr. Für „Wert in einer Liste“ übergeben Sie ein Array an Criteria1 mit Operator:=xlFilterValues.

Warum schaltet sich mein AutoFilter aus, wenn das Makro erneut läuft?

Weil der Aufruf von .AutoFilter ohne Argumente ein Umschalter ist — er schaltet das Filtern ein, wenn es aus ist, und aus, wenn es an ist. Führen Sie es zweimal aus, und der Filter verschwindet. Machen Sie das Makro zustandsunabhängig: Rufen Sie ws.AutoFilterMode = False auf, um zuerst zu räumen, und wenden Sie dann Ihren Filter mit ausdrücklichen Argumenten an.

Was ist der schnellste Weg, Zeilen nach Bedingung in VBA zu löschen?

Wenden Sie AutoFilter an, um die Zeilen zu treffen, die weg sollen, und löschen Sie dann die sichtbaren Zellen in einem Aufruf: .Offset(1).SpecialCells(xlCellTypeVisible).EntireRow.Delete (das Offset(1) überspringt die Kopfzeile). Excel übernimmt den Abgleich, und ein einzelnes Löschen entfernt sie alle, was weit schneller ist als Zeile für Zeile zu schleifen.

Getestet in

Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 08.08.2026.

Verwandte Anleitungen: VBA Find · VBA Sort · VBA Zeilen löschen · VBA Letzte Zeile · VBA Range