Excel VBA Tutorial: Zeilen und Spalten in Excel-Tabellen (ListObjects) löschen

Melden

Dieses Tutorial zeigt dir, wie du mit VBA (Visual Basic for Applications) gezielt Zeilen und Spalten in formatierten Excel-Tabellen (auch bekannt als ListObjects) löschen kannst.

Der Vorteil der Arbeit mit ListObjects gegenüber normalen Zellbereichen ist, dass dein Code robuster bleibt, auch wenn die Tabelle auf dem Blatt verschoben wird.


Voraussetzungen

  1. Deine Tabelle muss als "Tabelle" formatiert sein (Strg + T).
  2. Du musst den Namen der Tabelle kennen (standardmäßig Tabelle1, einsehbar unter dem Reiter „Tabellenentwurf“).
  3. Der VBA-Editor ist mit Alt + F11 erreichbar.

1. Eine Zeile in der Tabelle löschen

Um eine Zeile innerhalb einer Tabelle zu löschen, greifen wir auf das ListRows-Objekt zu.

Bestimmte Zeile nach Index löschen

Wenn du genau weißt, die wievielte Zeile der Tabelle (nicht des Arbeitsblatts!) gelöscht werden soll:

Sub ZeileNachIndexLoeschen()
    Dim tbl As ListObject
    Set tbl = ActiveSheet.ListObjects("Tabelle1")

    ' Löscht die 3. Zeile der Tabelle
    If tbl.ListRows.Count >= 3 Then
        tbl.ListRows(3).Delete
    End If
End Sub

Die aktive Zeile löschen

Falls der Cursor gerade in der Tabelle steht und diese Zeile gelöscht werden soll:

Sub AktiveTabellenzeileLoeschen()
    Dim targetRow As ListRow
    On Error Resume Next ' Falls der Cursor außerhalb der Tabelle steht
    Set targetRow = Selection.ListObject.ListRows(Selection.Row - Selection.ListObject.HeaderRowRange.Row)

    If Not targetRow Is Nothing Then
        targetRow.Delete
    Else
        MsgBox "Bitte wähle eine Zelle innerhalb der Tabelle aus."
    End If
End Sub

2. Zeilen basierend auf einer Bedingung löschen

Dies ist ein häufiger Anwendungsfall (z. B. alle Zeilen löschen, in denen der Status "Erledigt" ist).

Wichtig: Wenn du Zeilen in einer Schleife löschst, musst du die Schleife immer rückwärts laufen lassen, da sich sonst der Index der verbleibenden Zeilen verschiebt.

Sub ZeilenBedingtLoeschen()
    Dim tbl As ListObject
    Dim i As Long
    Set tbl = ActiveSheet.ListObjects("Tabelle1")

    ' Wir laufen von der letzten Zeile bis zur ersten
    For i = tbl.ListRows.Count To 1 Step -1
        ' Prüfe Bedingung in Spalte "Status" (Spalte 2 der Tabelle)
        If tbl.ListRows(i).Range(1, 2).Value = "Erledigt" Then
            tbl.ListRows(i).Delete
        End If
    Next i
End Sub

3. Eine Spalte in der Tabelle löschen

Spalten werden über das ListColumns-Objekt angesprochen. Das Löschen nach dem Namen der Überschrift ist hier besonders sicher.

Spalte nach Name löschen

Sub SpalteNachNameLoeschen()
    Dim tbl As ListObject
    Set tbl = ActiveSheet.ListObjects("Tabelle1")

    On Error Resume Next ' Falls die Spalte nicht existiert
    tbl.ListColumns("SpaltenName").Delete
    On Error GoTo 0
End Sub

Spalte nach Index löschen

Sub SpalteNachIndexLoeschen()
    Dim tbl As ListObject
    Set tbl = ActiveSheet.ListObjects("Tabelle1")

    ' Löscht die 2. Spalte der Tabelle
    If tbl.ListColumns.Count >= 2 Then
        tbl.ListColumns(2).Delete
    End If
End Sub

4. Den gesamten Tabelleninhalt löschen (Daten leeren)

Manchmal möchte man die Tabelle behalten (Struktur und Header), aber alle Datenzeilen entfernen:

Sub AlleDatenLoeschen()
    Dim tbl As ListObject
    Set tbl = ActiveSheet.ListObjects("Tabelle1")

    ' Prüfen, ob überhaupt Daten vorhanden sind
    If Not tbl.DataBodyRange Is Nothing Then
        tbl.DataBodyRange.Delete
    End If
End Sub

Profi-Tipps für den Code

  1. Bildschirmaktualisierung ausschalten: Bei großen Tabellen mit vielen Löschvorgängen beschleunigt dies den Code enorm.
    Application.ScreenUpdating = False
    ' Dein Code hier
    Application.ScreenUpdating = True
  2. Fehlerbehandlung: Nutze On Error Resume Next nur sehr gezielt, um Abstürze zu vermeiden, wenn z. B. eine Spalte bereits gelöscht wurde.
  3. Referenzierung: Nutze immer den Tabellennamen anstatt ActiveSheet, wenn du sichergehen willst, dass der Code auch funktioniert, wenn ein anderes Blatt aktiv ist: Set tbl = Sheets("MeinDatenblatt").ListObjects("Tabelle1")

Zusammenfassung

  • tbl.ListRows(n).Delete für Zeilen.
  • tbl.ListColumns(n).Delete für Spalten.
  • Rückwärts-Schleife (Step -1) beim bedingten Löschen verwenden!
0