Excel VBA Tutorial: Zeilen und Spalten in Excel-Tabellen (ListObjects) löschen
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
- Deine Tabelle muss als "Tabelle" formatiert sein (Strg + T).
- Du musst den Namen der Tabelle kennen (standardmäßig Tabelle1, einsehbar unter dem Reiter „Tabellenentwurf“).
- 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
- 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 - Fehlerbehandlung: Nutze
On Error Resume Nextnur sehr gezielt, um Abstürze zu vermeiden, wenn z. B. eine Spalte bereits gelöscht wurde. - 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).Deletefür Zeilen.tbl.ListColumns(n).Deletefür Spalten.- Rückwärts-Schleife (
Step -1) beim bedingten Löschen verwenden!