Kurzfassung —
Columns("C").DeleteistInsertrückwärts ausgeführt: Es entfernt Spalte C und zieht alles rechts davon eine Spalte nach links. Gleiche Verschiebung, entgegengesetzte Richtung — mit einer zerstörerischen Wendung. Jede Formel, die auf eine gelöschte Zelle verwies, hat nichts mehr, worauf sie zeigen könnte, sie kippt also dauerhaft in#REF!. Und das Löschen in einer Vorwärts-Schleife überspringt Spalten, weil jede Löschung die danach neu nummeriert. Löschen Sie von rechts nach links, oder sammeln Sie die Ziele in einemUnionund löschen einmal.
Sub DeleteFlaggedColumns()
Dim ws As Worksheet, c As Long, kill As Range
Set ws = ThisWorkbook.Worksheets("Report")
For c = ws.UsedRange.Columns.Count To 1 Step -1 ' scannen, NICHT mitten in der Schleife loeschen
If ws.Cells(1, c).Value = "" Then
If kill Is Nothing Then Set kill = ws.Columns(c) _
Else Set kill = Union(kill, ws.Columns(c))
End If
Next c
If Not kill Is Nothing Then kill.Delete ' eine Verschiebung, nichts wird neu nummeriert
End Sub
Eine Spalte zu löschen nutzt genau dieselbe Raster-Verschiebung wie eine einzufügen — es zieht nur nach links, statt nach rechts zu schieben. Was Delete zum schärferen Werkzeug macht, ist, dass die Verschiebung zerstörerisch ist: Daten verschwinden, und Verweise, die auf sie zielten, brechen. Zwei Fehlerarten erklären fast jeden Löschfehler bei Spalten — gebrochene Verweise und übersprungene Spalten — und beide kommen direkt aus der Verschiebung.
Was Sie lernen
- Das Denkmodell — Löschen zieht das Raster nach links, und Verweise in die Lücke sterben
- Warum Sie
#REF!bekommen, und welche Formeln die Verschiebung überstehen und welche zerspringen - Die Vorwärtsschleifen-Falle — warum eine Löschschleife Spalten überspringt, und die Lösung von rechts nach links
- Löschen nach Bedingung mit einem einzigen
Union, damit mitten in der Schleife nichts neu nummeriert wird - Wann Sie
ClearContentswollten, nichtDelete
Das Denkmodell: Löschen zieht nach links, und die Lücke nimmt die Verweise mit
Columns("C").Delete entfernt Spalte C, dann rückt D an die Stelle von C, E an die von D und so weiter.
Excel passt die Verweise an, die überleben — eine Formel, die =SUM(D2:D100) liest, wird zu
=SUM(C2:C100), weil diese Daten nach links zogen und Excel ihnen folgte. Dieser Teil ist freundlich.
Der unfreundliche Teil sind Verweise, die in Spalte C selbst zeigten. Ist C weg, kann eine Formel wie
=C5*A5 nicht auf ein Nichts verschoben werden — es gibt keine Zelle, auf der sie landen könnte —, sie
wird also zu =#REF!*A5 und bleibt kaputt. #REF! ist keine vorübergehende Störung; es ist Excel, das
Ihnen sagt, dass der Verweis zerstört wurde. Und es kann auf einem Blatt zuschlagen, das Sie gar nicht
ansehen, weil eine Formel drei Register weiter still von der Spalte abhängen kann, die Sie gerade gelöscht
haben.
Die Regel, die daraus folgt: Bevor Sie eine Spalte löschen, aus der andere Formeln lesen, entscheiden
Sie, was mit diesen Formeln geschieht — lenken Sie sie um, oder wandeln Sie die abhängigen Formeln
zuerst in Werte um. Löschen Sie die Spalte blind, und Sie finden womöglich #REF! über die ganze
Arbeitsmappe verstreut, nachdem das Makro „gelungen" ist.
Die Vorwärtsschleifen-Falle: der Löschfehler Nummer eins
Sie wollen die Spalten C, E und G löschen. Der Instinkt ist eine Vorwärtsschleife:
Dim c As Long
For c = 3 To 7 Step 2
ws.Columns(c).Delete ' FALSCH - loescht die falschen Spalten
Next c
Sehen Sie, was passiert. Das Löschen von Spalte 3 (C) zieht alles nach links, aus der alten Spalte E wird also Spalte D und aus dem alten G wird F. Die Schleife löscht dann Spalte 5 — die nicht mehr E ist — und im dritten Durchlauf löscht sie, was auch immer in Spalte 7 gerutscht ist. Sie entfernen am Ende die falschen Spalten und lassen die stehen, die Sie loswerden wollten. Das Löschen nummeriert die Spalten neu, die Sie noch nicht erreicht haben.
Es gibt zwei korrekte Lösungen, und die zweite ist besser:
' Loesung 1: von RECHTS NACH LINKS laufen, damit fruehere Loeschungen spaetere Ziele nie verschieben
For c = 7 To 3 Step -2
ws.Columns(c).Delete
Next c
' Loesung 2 (bevorzugt): in einem Union sammeln, EINMAL loeschen - die Reihenfolge wird egal
Dim kill As Range
Set kill = Union(ws.Columns(3), ws.Columns(5), ws.Columns(7))
kill.Delete
Das ist dieselbe Krankheit, die Sie schon beim Zeilen löschen behandeln —
dort laufen Sie aus genau diesem Grund von unten nach oben. Hier ist die Achse waagerecht, also von
rechts nach links. Der Union-Ansatz umgeht die Richtung ganz und ist dramatisch schneller: Ein Löschen
löst eine Verschiebung und eine Neuberechnung aus, während N einzelne Löschungen je N davon auslösen.
Löschen nach Bedingung: sammeln, dann einmal löschen
Das Union-Muster glänzt, wenn Sie Spalten nach einer Regel löschen — jede Spalte mit leerer Überschrift, jede Spalte, deren Titel zu einer Liste passt, jede leere Spalte. Die Disziplin lautet: scannen und sammeln, nie innerhalb des Scans löschen.
Sub DeleteEmptyColumns()
Dim ws As Worksheet, c As Long, kill As Range
Set ws = ThisWorkbook.Worksheets("Data")
For c = 1 To ws.UsedRange.Columns.Count
If Application.WorksheetFunction.CountA(ws.Columns(c)) = 0 Then
If kill Is Nothing Then Set kill = ws.Columns(c) _
Else Set kill = Union(kill, ws.Columns(c))
End If
Next c
If Not kill Is Nothing Then kill.Delete
End Sub
Weil das Löschen nach der Schleife geschieht, kann der Scan in jede Richtung laufen — nichts wird neu
nummeriert, während Sie noch entscheiden. Prüfen Sie Not kill Is Nothing, bevor Sie .Delete aufrufen,
sonst wirft eine leere Treffermenge den Laufzeitfehler 91 („Object variable not set").
Delete gegen ClearContents: wissen, was Sie meinten
Die häufigste Quelle eines versehentlichen #REF! ist, zu Delete zu greifen, wenn Sie nur die Daten
loswerden wollten:
Columns("C").Deleteentfernt die Struktur der Spalte und schiebt alles nach links. Verweise in sie brechen; das Spaltenlayout des Blatts ändert sich.Columns("C").ClearContentsleert die Zellen und verschiebt nichts. Formeln, die Spalte C lesen, sehen jetzt Leeres (oder Nullen), das Layout bleibt unberührt, und kein Verweis bricht.
Hängt eine nachgelagerte Formel, ein Diagramm, eine ListObject-Tabelle oder ein benannter Bereich
davon ab, dass diese Spalte existiert, dann wollen Sie ClearContents. Reservieren Sie Delete für den
Fall, dass die Spalte wirklich nicht da sein sollte. Und wenn eine Spalte zu einer Tabelle gehört, löschen
Sie sie über die Tabelle — ws.ListObjects("Sales").ListColumns("Tax").Delete — statt über
Columns(...).Delete, was gegen die eigene Struktur der Tabelle arbeitet.
Wie ExcelMaster hilft
Eine Spalte zu löschen sieht trivial aus und verbirgt drei Fallen — Verweise, die auf Blättern, die Sie
nicht im Blick haben, in #REF! brechen, eine Schleife, die sich selbst neu nummeriert und die falschen
Spalten löscht, und die Wahl zwischen Delete und Clear, die entscheidet, ob Ihr Layout überlebt.
ExcelMaster lässt Sie sagen,
was Sie wollen — „lösche jede Spalte ohne Überschrift, halte die Summen intakt" — und sammelt die Treffer
in einem einzigen Union, löscht sie in einer Verschiebung, sodass nichts neu nummeriert wird, warnt,
wenn eine Löschung anderswo eine Formel brechen würde, und nutzt ClearContents, wenn Sie „leeren" statt
„entfernen" meinten. Sie behalten die Arbeitsmappe und den Code.
Häufig gestellte Fragen
Wie lösche ich in VBA eine Spalte?
Nutzen Sie Columns("C").Delete, um Spalte C zu entfernen; jede Spalte rechts davon verschiebt sich einen
Schritt nach links. Qualifizieren Sie ihn — ThisWorkbook.Worksheets("Report").Columns("C").Delete —,
damit er nicht auf dem gerade aktiven Blatt handelt. Columns("C:E").Delete entfernt drei benachbarte
Spalten in einem Aufruf.
Warum bekomme ich nach dem Löschen einer Spalte #REF!?
Weil eine Formel auf eine Zelle in der gelöschten Spalte verwies, und sobald diese Spalte weg ist, hat der
Verweis nichts mehr, worauf er zeigen kann, er wird also dauerhaft zu #REF!. Formeln, die auf Spalten
rechts der Löschung verwiesen, sind in Ordnung — Excel verschiebt sie mit den Daten nach links. Nur
Verweise in den gelöschten Bereich brechen. Prüfen Sie auch andere Blätter; die gebrochene Formel muss
nicht dort sein, wo Sie gelöscht haben.
Warum überspringt meine Löschschleife Spalten?
Weil das Löschen einer Spalte jede Spalte danach neu nummeriert, läuft eine Vorwärtsschleife
For c = 1 To n an Spalten vorbei, die in einen bereits passierten Platz gerutscht sind. Laufen Sie von
rechts nach links (For c = n To 1 Step -1), oder — besser — sammeln Sie die Zielspalten in einem Union
und rufen .Delete einmal auf, was sie unabhängig von der Reihenfolge in einer einzigen Verschiebung
entfernt.
Wie lösche ich mehrere Spalten auf einmal?
Bei benachbarten Spalten Columns("C:E").Delete. Bei verstreuten Spalten bauen Sie ein Union —
Union(Columns(3), Columns(5), Columns(7)).Delete —, damit sie alle in einer Verschiebung verschwinden.
Das ist zugleich korrekt (keine Neunummerierung) und viel schneller, als sie einzeln zu löschen.
Was ist der Unterschied zwischen Delete und ClearContents bei einer Spalte?
Delete entfernt die Spalte und schiebt den Rest nach links, was Verweise brechen und Ihr Layout ändern
kann. ClearContents leert die Zellen und verschiebt nichts, lässt also die Struktur und jeden Verweis
intakt. Hängt irgendetwas Nachgelagertes davon ab, dass die Spalte existiert, nutzen Sie ClearContents.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 15.09.2026.
Verwandte Anleitungen: VBA Spalte einfügen · VBA Zellen einfügen · VBA Zeilen löschen · VBA Spalten ausblenden · VBA SpecialCells
