Kurzfassung —
Columns("C").Insertlässt keine leere Spalte aus dem Nichts erscheinen. Es schiebt Spalte C und alles rechts davon eine Spalte weiter nach rechts, und Excel schreibt jede Formel um, die in diesen Bereich zeigte, sodass sie weiterhin auf denselben Daten landet. Einfügen ist eine Verschiebung. Zwei Regeln halten es sicher: Arbeiten Sie auf der ganzen Spalte (Columns(...)oder.EntireColumn, nie ein Teilbereich), und fügen Sie mehrere Spalten in einem einzigen Aufruf ein statt eine nach der anderen in einer Vorwärtsschleife.
Sub InsertMarginColumn()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Report")
ws.Columns("D").Insert CopyOrigin:=xlFormatFromRightOrBelow
ws.Columns("D").ClearFormats ' neue Spalte sauber beginnen, nicht im Stil des linken Nachbarn
End Sub
Eine Spalte einfügen, eine Spalte löschen und einen Teilbereich einfügen oder löschen sind dieselbe Idee
in drei Gewändern: Sie alle verschieben das Raster physisch, und alles verschiebt sich mit —
einschließlich der Formelverweise, die entweder den Daten folgen oder in #REF! zerspringen.
Ganzspalten-Operationen verschieben in eine einzige, eindeutige Richtung, sie sind also der sichere Fall.
Bekommen Sie diesen einen richtig hin, und die anderen beiden sind größtenteils derselbe Mechanismus, nur
enger gezielt.
Was Sie lernen
- Das Denkmodell — Einfügen schafft Platz durch Schieben, nicht durch Leeren
- Die eine Regel, die zerrissene Layouts verhindert — die
EntireColumneinfügen, nie einen Teilbereich - Warum Ihre Formeln ein Einfügen überstehen, Ihre fest verdrahteten VBA-Adressen aber nicht
- Wie Sie mehrere Spalten auf einmal einfügen, und warum eine Vorwärtsschleife sie verstreut
- Die
CopyOrigin-Regel hinter „Warum ist meine neue Spalte schon formatiert?"
Das Denkmodell: Einfügen schiebt, es leert nicht
Columns("C").Insert heißt nicht „lege eine leere Spalte bei C ab". Es heißt „schaffe Platz bei C, indem
du alle nach rechts schiebst". Aus Spalte C wird D, aus D wird E und so weiter bis zum Rand des Blatts.
Die alten Daten von Spalte C sind nicht verschwunden — sie sind umgezogen. Eine leere Spalte ist einfach
der freie Raum, der an der Einfügestelle zurückbleibt.
Das ist wichtig, weil eine Verschiebung Folgen hat, die ein Leeren nicht hätte. Ziehen die Daten um,
zieht Excel die Verweise mit: Eine Formel drei Blätter weiter, die =SUM(C2:C100) las, wird in dem
Moment zu =SUM(D2:D100), in dem Sie vor C einfügen, weil Excel sie auf dieselben Zahlen gerichtet hält.
Das ist die Funktion. Die Falle, weiter unten, ist, dass Ihr VBA-Code nicht dieselbe Behandlung erhält.
Die wichtigste Regel: die EntireColumn einfügen
Jedes verlässliche Einfügen arbeitet auf einer ganzen Spalte:
ws.Columns("C").Insert ' eine ganze Spalte vor C
ws.Range("C:C").EntireColumn.Insert ' identisch, ausgeschrieben
Der Weg Nummer eins, ein Layout zu zerreißen, ist stattdessen einen Teilbereich einzufügen:
ws.Range("C1:C10").Insert Shift:=xlShiftToRight ' verschiebt nur 10 Zellen nach rechts
Das schiebt zehn Zellen nach rechts, während der Rest von Spalte C stehen bleibt — eine zackige Stufe,
mitten ins Raster geschlagen, mit den Zeilen ab 11, die nun gegen die Zeilen 1–10 verrutscht sind. Es
läuft ohne Fehler und sieht gut aus, bis jemand nach unten scrollt. Die Regel ist einfach: Um eine
Spalte einzufügen, benennen Sie eine Spalte — Columns(...) oder .EntireColumn.
Teilbereichs-Einfügungen sind ein echtes Werkzeug, aber sie sind eine andere Aufgabe (behandelt in
VBA Zellen einfügen), und danach zu greifen, wenn Sie „eine Spalte" meinten,
ist der Fehler.
Verweise folgen den Daten — Ihr Code aber nicht
Hier ist die Asymmetrie, die Leute überrascht. Fügen Sie eine Spalte vor C ein, und:
- Arbeitsblattformeln passen sich an.
=D5*E5,=VLOOKUP(A2, C:F, 2, 0), der Quellbereich eines Diagramms — Excel schreibt sie alle um, sodass sie weiterhin auf dieselben Daten zeigen. Sie müssen sie nicht anfassen. - Fest verdrahtete Adressen in Ihrem VBA passen sich nicht an. Läuft Ihr Makro später
ws.Range("D5").Value = 100, dann meint dieses wörtliche"D5"immer noch die Zelle in Spalte D, Zeile 5 — aber nach dem Einfügen ist das eine andere Zelle als die, an die Sie dachten. Die Zeichenkette weiß nicht, dass links von ihr eine Spalte aufgetaucht ist.
Die Gefahr ist also nicht das Einfügen selbst; es ist Code, der vor dem Einfügen geschrieben wurde und das alte Layout voraussetzt. Zwei Verteidigungen, nach Vorzug geordnet:
' 1. Wichtiges VOR dem Einfuegen als Objekt festhalten - das Objekt folgt der Verschiebung
Dim total As Range
Set total = ws.Range("D5")
ws.Columns("C").Insert
total.Value = 100 ' immer noch die richtige Zelle; das Objekt folgte der Verschiebung
' 2. Oder Spalten NACH dem Einfuegen per Ueberschrift finden, nie per fixem Buchstaben
Dim col As Long
col = ws.Rows(1).Find("Amount", LookAt:=xlWhole).Column
Die Faustregel: Behandeln Sie jede wörtliche Zelladresse als veraltet in dem Moment, in dem Sie in ihrer
Nähe einfügen oder löschen. Halten Sie Verweise als Range-Objekte, oder schlagen Sie sie über eine
Überschrift nach, die Sie per Name finden können.
Mehrere Spalten in einem Aufruf einfügen
Um drei Spalten einzufügen, fügen Sie einen Bereich aus drei Spalten ein:
ws.Columns("C:E").Insert ' drei Spalten erscheinen vor C, in einer Verschiebung
Fügen Sie nicht dreimal eine einzelne Spalte in einer Vorwärtsschleife ein:
Dim i As Long
For i = 1 To 3
ws.Columns("C").Insert ' FALSCH - jedes Einfuegen schiebt das naechste weiter
Next i
Jedes Insert nummeriert alles rechts davon neu, das „C" des zweiten Durchlaufs ist also nicht dort, wo
Sie es vermuten. Sie bekommen über das Blatt verstreute Spalten statt eines sauberen Blocks. Das ist
dieselbe Neunummerierungs-Falle, die Löschen in einer Vorwärtsschleife Spalten überspringen lässt — das
Spiegelbild, behandelt in VBA Spalte löschen. Fügen Sie den Block in einer
einzigen Anweisung ein, oder — falls die Positionen berechnet und zwingend durchlaufen werden müssen —
arbeiten Sie von rechts nach links, sodass frühere Einfügungen spätere Ziele nie verschieben.
CopyOrigin: warum die neue Spalte vorformatiert ankommt
Eine frisch eingefügte Spalte ist nicht wirklich leer — standardmäßig erbt sie die Formatierung der
Spalte zu ihrer Linken (CopyOrigin:=xlFormatFromLeftOrAbove, der Standard). Ist der linke Nachbar
eine fette Summe oder ein schattiertes Band, taucht Ihre „leere" neue Spalte fett oder schattiert auf.
Das ist die Antwort auf „Warum ist meine eingefügte Spalte schon formatiert?".
ws.Columns("D").Insert CopyOrigin:=xlFormatFromRightOrBelow ' stattdessen den RECHTEN Nachbarn erben
' - oder - den Standard nehmen, dann loeschen:
ws.Columns("D").Insert
ws.Columns("D").ClearFormats
Wählen Sie bewusst. Vom linken zu erben ist richtig, wenn Sie einen formatierten Block erweitern; leeren ist richtig, wenn Sie eine echt frische Spalte wollen. Es dem Standard zu überlassen und sich dann zu wundern ist das, was Sie vermeiden wollen.
Wie ExcelMaster hilft
Eine Spalte einzufügen sieht nach einer Zeile aus und verbirgt drei Entscheidungen — die ganze Spalte einfügen (nicht einen Teilbereich), Ihre späteren Verweise über die Verschiebung hinweg gültig halten und steuern, von welchem Nachbarn die neue Spalte die Formatierung erbt —, und jede davon falsch zu treffen scheitert still: ein zerrissenes Layout, ein Makro, das jetzt in die falsche Zelle schreibt, oder eine verirrte fette Spalte.
ExcelMaster lässt Sie sagen,
was Sie wollen — „füge nach Amount eine Randspalte ein, ohne Formatierung, und halte die Summenformel
intakt" — und schreibt das EntireColumn.Insert, findet die Spalte über ihre Überschrift statt über einen
fixen Buchstaben, setzt CopyOrigin (oder leert die Formate) passend und fügt einen mehrspaltigen Block
in einem Aufruf ein, wenn Sie mehrere anfordern. Sie behalten die Arbeitsmappe und den Code.
Häufig gestellte Fragen
Wie füge ich in VBA eine Spalte ein?
Nutzen Sie Columns("C").Insert, um eine ganze Spalte vor Spalte C einzufügen. Alles ab C nach rechts
verschiebt sich eine Spalte weiter, und Arbeitsblattformeln, die auf diese Zellen verwiesen, passen sich
automatisch an. Bevorzugen Sie die qualifizierte Form
ThisWorkbook.Worksheets("Report").Columns("C").Insert, damit sie nicht davon abhängt, welches Blatt
gerade aktiv ist.
Wie füge ich mehrere Spalten auf einmal ein?
Fügen Sie einen mehrspaltigen Bereich ein: Columns("C:E").Insert fügt drei Spalten vor C in einer
einzigen Verschiebung ein. Durchlaufen Sie nicht dreimal Columns("C").Insert — jedes Einfügen
nummeriert die Spalten danach neu, die Wiederholungen landen also an den falschen Stellen. Ein Aufruf, ein
sauberer Block.
Warum hat meine eingefügte Spalte schon eine Formatierung?
Weil Insert standardmäßig das Format der Spalte zu ihrer Linken kopiert
(CopyOrigin:=xlFormatFromLeftOrAbove). Übergeben Sie CopyOrigin:=xlFormatFromRightOrBelow, um
stattdessen von rechts zu erben, oder rufen Sie danach .ClearFormats auf der neuen Spalte auf, um sie
wirklich leer zu machen.
Brechen meine Formeln, wenn ich eine Spalte einfüge?
Arbeitsblattformeln brechen nicht — Excel schreibt ihre Verweise um, sodass sie den Daten über die
Verschiebung hinweg folgen. Was sich nicht aktualisiert, ist eine fest verdrahtete Adresse in Ihrem
VBA, etwa Range("D5"): Dieses Literal zeigt weiter auf Spalte D, die jetzt eine andere Zelle ist. Fangen
Sie Zellen vor dem Einfügen als Range-Objekte ab, oder finden Sie sie danach per Überschrift.
Wie füge ich eine Spalte vor einer bestimmten Überschrift statt vor einem festen Buchstaben ein?
Finden Sie die Überschrift, dann fügen Sie auf ihrer EntireColumn ein:
Rows(1).Find("Amount", LookAt:=xlWhole).EntireColumn.Insert. Das übersteht Layout-Änderungen, weil es
die Spalte darüber findet, was sie ist, statt über ihren aktuellen Platz.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 15.09.2026.
Verwandte Anleitungen: VBA Spalte löschen · VBA Zellen einfügen · VBA Zeilen einfügen · VBA Spalten ausblenden · VBA Spaltenbreite
