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

VBA Zeilen und Spalten einfügen in Excel — das Raster richtig verschieben (und in einer Schleife einfügen ohne Chaos)

|

VBA Zeilen und Spalten einfügen in Excel — das Raster richtig verschieben (und in einer Schleife einfügen ohne Chaos)

Kurz gesagt — Einfügen ist das Spiegelbild des Löschens. .EntireRow.Insert zaubert keinen leeren Platz aus dem Nichts — es schiebt jede bestehende Zeile nach unten, um eine Lücke zu öffnen, genau so, wie das Löschen sie nach oben rutschen lässt. Das heißt, dasselbe Problem des sich unter Ihnen bewegenden Rasters gilt: Fügen Sie in einer von oben nach unten laufenden Schleife ein, und die noch nicht erreichten Zeilen rutschen Ihnen weiter davon. Fügen Sie eine ganze Zeile mit .EntireRow.Insert ein; bei einem Teilbereich benennen Sie die Richtung mit Shift:=xlDown (oder xlToRight); steuern Sie mit CopyOrigin, wessen Nachbarformatierung die neue Zeile kopiert; und um viele Zeilen hinzuzufügen, fügen Sie einen mehrzeiligen Bereich in einem Aufruf ein, statt zu schleifen.

' Eine leere Zeile ÜBER Zeile 5 einfügen; 5, 6, 7... um eins nach unten schieben.
Dim ws As Worksheet: Set ws = ThisWorkbook.Worksheets("Data")

ws.Rows(5).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove

Sobald Sie die Löschfalle kennen — eine vorwärts laufende Schleife, die Zeilen überspringt, weil das Löschen das Raster nach oben rutschen lässt — hält das Einfügen keine Überraschungen bereit, denn es ist dieselbe Idee in die andere Richtung. Einfügen schiebt das Raster nach unten. Alles, was das Löschen subtil machte (die Nummern bewegen sich, ganze Zeile gegen Teilbereich, einmal gegen in einer Schleife), hat ein exaktes Gegenstück auf der Einfügeseite. Diese Anleitung geht sie in diesem Spiegel durch, sodass das Modell, das Sie schon haben, die meiste Arbeit erledigt.

Was Sie lernen

  • Das mentale Modell — Einfügen schiebt das Raster nach unten, es füllt keinen leeren Platz
  • Einfügen einer ganzen Zeile gegenüber einem Teilbereich, und warum Shift die Richtung bestimmt
  • CopyOrigin — wessen Nachbarformatierung die eingefügte Zeile oder Spalte erbt
  • Einfügen in einer Schleife, ohne die eigenen neuen Zeilen erneut zu verarbeiten
  • Der Ein-Aufruf-Weg, viele Zeilen auf einmal einzufügen

Das mentale Modell: Einfügen schiebt das Raster nach unten

So wie das Löschen einer Zeile sie entfernt und die Lücke schließt, öffnet das Einfügen einer Zeile eine Lücke und schiebt alles nach unten, um Platz zu schaffen. ws.Rows(5).EntireRow.Insert schreibt nicht in Zeile 5 — es erzeugt eine brandneue leere Zeile 5, und aus der alten Zeile 5 wird Zeile 6, aus der alten 6 wird 7 und so weiter bis ganz ans untere Ende des benutzten Bereichs. Die neue Zeile kommt hinzu; jede bestehende Zeile unterhalb der Einfügestelle rückt um eins nach unten.

Das ist die eine Tatsache, an der Sie festhalten sollten, denn sie ist die Quelle sowohl des alltäglichen Verhaltens als auch der Schleifenfalle. „Über Zeile 5 einfügen“ heißt in Wahrheit „bei 5 Platz schaffen und den Rest nach unten schieben“. Spalten funktionieren seitwärts genauso: Columns("C").Insert öffnet eine neue Spalte C und schiebt D, E, F nach rechts. Das Raster ist elastisch, und Insert dehnt es — was bedeutet, dass sich die Adresse von allem unterhalb (oder rechts) der Einfügestelle gerade geändert hat.

Die Regel für Teilbereiche: die Richtung mit Shift benennen

Wenn Sie eine ganze Zeile oder Spalte einfügen, gibt es keine Mehrdeutigkeit — eine ganze Zeile kann nur nach unten, eine ganze Spalte nur nach rechts. Fügen Sie aber einen Teilbereich ein, muss Excel raten, in welche Richtung die Nachbarn geschoben werden, und dieses Raten richtet sich nach der Form des Bereichs:

ws.Range("B5:D5").Insert Shift:=xlDown      ' B:D nach unten schieben, Spalten A und E in Ruhe lassen
ws.Range("B5:B8").Insert Shift:=xlToRight   ' diese Zellen nach rechts schieben

Lassen Sie Shift bei einem Teilbereich weg, wählt Excel eine Richtung danach, ob der Block breiter als hoch ist — eine Regel, die sich niemand merkt, und genau so landen Zellen seitlich verschoben, wo Sie sie nach unten wollten. Sobald der Bereich keine volle Zeile oder Spalte ist, geben Sie Shift ausdrücklich an. Und meistens wollen Sie ohnehin gar kein Teileinfügen: Einen Teilblock von Zellen zu verschieben bringt jede nicht enthaltene Spalte aus der Ausrichtung — dieselbe Beschädigung, die ein Einzelzellen-Löschen verursacht. Greifen Sie zu .EntireRow.Insert / .EntireColumn.Insert, es sei denn, Sie wollen wirklich einen Block verschieben:

ws.Rows(5).EntireRow.Insert          ' ganze Zeile - jede Spalte bleibt im Gleichschritt
ws.Columns("C").EntireColumn.Insert  ' ganze Spalte - jede Zeile bleibt im Gleichschritt

Die Regel, die überrascht: CopyOrigin bestimmt die Formatierung

Eine frisch eingefügte Zeile ist nicht frei von Formatierung — Excel kopiert das Aussehen eines Nachbarn, und CopyOrigin wählt, welchen. Der Standard ist xlFormatFromLeftOrAbove, sodass eine neue Zeile das Format der Zeile darüber erbt. Meist in Ordnung — bis die Zeile darüber eine fette, schattierte Überschrift ist und Ihre neue Datenzeile ebenfalls als Überschrift verkleidet ankommt:

' Neue Zeile kopiert das Format der Zeile DARUNTER statt der Überschrift darüber.
ws.Rows(2).EntireRow.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromRightOrBelow

xlFormatFromRightOrBelow weist Excel an, die Formatierung von der Zeile unterhalb der Einfügestelle zu nehmen — genau das, was Sie wollen, wenn Sie eine Datenzeile direkt unter eine Überschrift einfügen. Das ist ein kleines Flag mit sichtbarer Wirkung: falsch gesetzt, trägt jede eingefügte Zeile die falschen Kleider; richtig gesetzt, wirken Einfügungen native. Wollen Sie eine wirklich saubere Zeile, fügen Sie zuerst ein und löschen dann die Formate ausdrücklich mit .ClearFormats.

Die Schleifenfalle, gespiegelt: rückwärts einfügen oder eigene Zeilen erneut verarbeiten

Einfügen in einer Schleife birgt dieselbe Gefahr wie Löschen in einer Schleife, nur in die entgegengesetzte Richtung. Angenommen, Sie laufen nach unten und fügen nach jeder „Total“-Zeile eine leere Trennzeile ein. Fügen Sie von oben nach unten ein, schiebt die neue Zeile Ihre noch nicht geprüften Zeilen weiter nach unten — und je nachdem, wie Sie weiterrücken, kann die Schleife geradewegs in die eben erzeugte Zeile hineinlaufen und wieder und wieder einfügen. Das Raster wächst unter Ihnen.

Die saubere Lösung ist dieselbe wie beim Löschen: schleifen Sie von unten nach oben, sodass jedes Einfügen unterhalb der Zeilen geschieht, die Sie noch besuchen müssen, und ihre Nummern nie stört:

Dim i As Long, lastRow As Long
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

For i = lastRow To 2 Step -1
    If ws.Cells(i, "A").Value = "Total" Then
        ws.Rows(i + 1).EntireRow.Insert Shift:=xlDown   ' unten einfügen; die Zeilen darüber bleiben unberührt
    End If
Next i

Rückwärts landet jede eingefügte Zeile unterhalb von Zellen, die Sie schon erledigt haben, sodass die noch wartenden Zeilen ihre Adressen behalten. Es ist die identische Disziplin aus VBA Zeilen löschen — wenn eine Schleife die Zeilenzahl ändert, laufen Sie sie mit Step -1.

Viele Zeilen auf einmal einfügen: Resize statt Wiederholung

.Insert hundertmal aufzurufen, um hundert Zeilen hinzuzufügen, ist langsam — jeder Aufruf strukturiert das Raster um und berechnet neu. Um n zusammenhängende Zeilen einzufügen, fügen Sie einen n-zeiligen Bereich in einem einzigen Vorgang ein. Greifen Sie die Zielzeile, bringen Sie sie mit .Resize(n) auf die gewünschte Höhe und fügen Sie das ein:

' 5 leere Zeilen über Zeile 10 in einem Aufruf einfügen.
ws.Rows(10).Resize(5).EntireRow.Insert Shift:=xlDown

Rows(10).Resize(5) sind die Zeilen 10 bis 14; das Einfügen dieses Blocks öffnet fünf Zeilen auf einmal und schiebt den Rest gemeinsam nach unten. Eine strukturelle Änderung statt fünf. Für verstreute Einfügungen über ein großes Blatt ist das schnellste Muster oft, eine Hilfsspalte hinzuzufügen, nach ihr zu sortieren oder zu filtern, um die Zeilen zu gruppieren, und in einem Rutsch einzufügen — dasselbe Prinzip „die strukturelle Bearbeitung nur einmal ausführen“, das auch Massenlöschungen schnell macht. Verpacken Sie große Einfügungen in Application.ScreenUpdating = False und manuelle Berechnung, und sie sind sofort fertig.

Wie ExcelMaster hilft

Einfügecode scheitert auf stille, kosmetische Weise: ein Teilbereich in die falsche Richtung geschoben, weil Shift fehlte, neue Zeilen in der fetten Formatierung einer Überschrift, eine von oben nach unten laufende Schleife, die in ihre eigene Ausgabe einfügt, hundert einzelne Einfügungen, die einen Bericht zum Kriechen bringen. Jedes davon sieht aus wie „das Einfügen hat nicht ganz geklappt“ und nicht wie ein klarer Fehler.

ExcelMaster lässt Sie sagen, was Sie wollen — „füge nach jeder Zwischensumme eine leere Zeile ein“, „füge drei Zeilen über der Zusammenfassung ein“, „setze eine neue Spalte zwischen C und D“. Es schreibt .EntireRow.Insert (oder .EntireColumn.Insert) mit dem richtigen Shift und CopyOrigin, schleift in der sicheren Richtung, bündelt mehrzeilige Einfügungen in einem Aufruf und legt zuerst eine Sicherung des Blatts an. Sie behalten die Arbeitsmappe und den Code; Sie sparen sich das Raten, in welche Richtung sich das Raster gleich bewegt.

Häufig gestellte Fragen

Wie füge ich in VBA eine Zeile ein?

Nehmen Sie .EntireRow.Insert auf der Zeile, die Sie nach unten schieben wollen: ws.Rows(5).EntireRow.Insert erzeugt eine neue leere Zeile 5 und schiebt die alte Zeile 5 samt allem darunter um eins nach unten. Fügen Sie zur Klarheit Shift:=xlDown hinzu und CopyOrigin, um zu steuern, wessen Nachbarformatierung die neue Zeile erbt.

Was macht das Shift-Argument beim Einfügen?

Shift sagt Excel, in welche Richtung bestehende Zellen geschoben werden, wenn Sie einen Teilbereich einfügen — xlDown schiebt sie nach unten, xlToRight nach rechts. Für eine ganze Zeile oder Spalte ist es überflüssig (die können nur in eine Richtung), für einen Teilblock aber wichtig, wo Excel die Richtung sonst aus der Form des Bereichs errät.

Warum hat meine eingefügte Zeile die falsche Formatierung?

Eingefügte Zeilen kopieren das Format eines Nachbarn, ausgewählt durch CopyOrigin. Der Standard xlFormatFromLeftOrAbove kopiert die Zeile darüber — Einfügen unter einer Überschrift lässt die neue Zeile also wie eine Überschrift aussehen. Übergeben Sie CopyOrigin:=xlFormatFromRightOrBelow, um stattdessen die Zeile darunter zu kopieren, oder rufen Sie nach dem Einfügen .ClearFormats auf der neuen Zeile auf.

Wie füge ich in VBA mehrere Zeilen auf einmal ein?

Bringen Sie die Zielzeile mit Resize auf die benötigte Anzahl und fügen Sie diesen Block in einem Aufruf ein: ws.Rows(10).Resize(5).EntireRow.Insert fügt fünf Zeilen über Zeile 10 ein. Ein einzelnes Einfügen mehrerer Zeilen ist viel schneller als fünf .Insert-Aufrufe, weil Excel das Raster nur einmal umstrukturiert.

Soll ich beim Einfügen von Zeilen vorwärts oder rückwärts schleifen?

Rückwärts, aus demselben Grund wie beim Löschen. Einfügen schiebt noch nicht geprüfte Zeilen weiter nach unten, und eine von oben nach unten laufende Schleife kann am Ende in die eben erzeugten Zeilen einfügen. Die Schleife For i = lastRow To 2 Step -1 hält jedes Einfügen unterhalb der Zellen, die Sie noch verarbeiten müssen, sodass sich ihre Zeilennummern nie verschieben.

Getestet in

Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 07.08.2026.

Verwandte Anleitungen: VBA Zeilen löschen · VBA Spalten und Zeilen ausblenden · VBA Letzte Zeile · VBA Range · VBA For-Schleife