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

VBA Spalte löschen in Excel — Spalten entfernen ohne #REF!-Fehler oder übersprungene Spalten

|

VBA Spalte löschen in Excel — Spalten entfernen ohne #REF!-Fehler oder übersprungene Spalten

KurzfassungColumns("C").Delete ist Insert rü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 einem Union und 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 ClearContents wollten, nicht Delete

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").Delete entfernt die Struktur der Spalte und schiebt alles nach links. Verweise in sie brechen; das Spaltenlayout des Blatts ändert sich.
  • Columns("C").ClearContents leert 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 UnionUnion(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