Kurz gesagt — Einfügen ist das Spiegelbild des Löschens.
.EntireRow.Insertzaubert 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.Insertein; bei einem Teilbereich benennen Sie die Richtung mitShift:=xlDown(oderxlToRight); steuern Sie mitCopyOrigin, 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
Shiftdie 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
