Kurzfassung — Um eine Zeile zu verschieben, ohne Daten auszulöschen, schneiden Sie sie aus und fügen sie dann mit Insert ein — Sie legen sie nicht mit Paste ab.
Rows(5).Cut Destination:=Rows(20)legt die Zeile auf Zeile 20 und überschreibt, was dort stand.Rows(5).Cut, gefolgt vonRows(20).Insert, öffnet eine Lücke bei Zeile 20, lässt die Zeile hineinfallen und schließt das Loch, aus dem sie kam — nichts wird zerstört. Ein Verschieben ist eine Verschiebung, also Vorsicht vor der Falle: Verschieben Sie eine Zeile nach unten, zieht das Loch, das sie hinterlässt, jede Zeile darunter — auch Ihr Ziel — um eins nach oben.
Sub MoveRow()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Data")
ws.Rows(5).Cut ' die Zeile aufheben (Laufrahmen), Quelle noch nicht weg
ws.Rows(20).Insert Shift:=xlDown ' Insert: ausgeschnittene Zeile VOR Zeile 20 einfuegen, Rest nach unten
Application.CutCopyMode = False ' am Ende den Zwischenablage-Zustand loeschen
End Sub
Zeilen verschieben, Spalten verschieben und das Verb Cut darunter sind eine Idee: Sie heben Daten auf
und entscheiden dann, wie Sie sie ablegen. Insert öffnet eine Lücke und bewahrt alles; Paste landet
obenauf und überschreibt. Bringen Sie den Zeilenfall richtig hin — ausschneiden, mit Insert einfügen, die
Verschiebung im Blick — und Spalten verschieben ist derselbe Zug um neunzig Grad gedreht, gebaut auf
demselben Range.Cut.
Was Sie lernen
- Das Denkmodell — ein Verschieben ist ausschneiden und mit Insert einfügen, und dieses Einfügen ist eine Verschiebung, kein Überschreiben mit Paste
- Der Fehler Nummer eins —
Cut Destination:=und Paste überschreiben das Ziel und verlieren Daten - Warum ein Verschieben nach unten alles unterhalb der Quelle neu nummeriert, sodass das Ziel um eins nach oben rutscht
- Wie Sie mehrere Zeilen auf einmal verschieben, ohne dass sie in der falschen Reihenfolge landen (von unten nach oben)
- Warum Formelverweise einer ausgeschnittenen Zeile folgen, statt wie beim Löschen in
#REF!zu zerspringen
Das Denkmodell: Verschieben ist eine Verschiebung, kein Überschreiben
In „diese Zeile verschieben" stecken zwei Bewegungen. Zuerst heben Sie sie auf — Rows(5).Cut legt
die Zeile in den Ausschneidemodus der Zwischenablage (den Laufrahmen, die „laufenden Ameisen"). Dann
legen Sie sie ab, und hier beginnt jede Geschichte von Datenverlust, denn dafür gibt es zwei völlig
verschiedene Wege:
- Mit Paste ablegen (
Cut Destination:=Rows(20), oder ein manuelles.Cutund dann.Paste) legt die Zeile auf Zeile 20. Der alte Inhalt von Zeile 20 ist weg, still, ohne Warnung. - Mit Insert einfügen (
Rows(5).Cutund dannRows(20).Insert) öffnet eine frische Lücke bei Zeile 20, lässt die ausgeschnittene Zeile hineinfallen und schließt das Loch bei Zeile 5. Alles andere rückt beiseite, um Platz zu machen. Nichts geht verloren.
Eine Zeile zu verschieben ist immer die zweite Bewegung. Es ist dieselbe Verschiebung, die Sie schon vom Einfügen und Löschen von Zeilen kennen: Das Raster öffnet und schließt sich physisch, und alles unterhalb der Änderung wird neu nummeriert. Halten Sie daran fest — der ganze Artikel folgt aus „Verschieben ist eine Verschiebung".
Der Fehler Nummer eins: das Darüberlegen mit Paste überschreibt das Ziel
Das sieht aus, als würde es eine Zeile verschieben, und es ist der häufigste Weg, in einem Makro Daten zu zerstören:
ws.Rows(5).Cut Destination:=ws.Rows(20) ' FALSCH zum Verschieben - das legt Zeile 5 mit Paste auf Zeile 20
Cut Destination:= ist ein Paste. Es legt die Zellen von Zeile 5 auf Zeile 20, überschreibt die Daten
von Zeile 20 und leert dann Zeile 5. Stand in Zeile 20 etwas, ist es weg. Das ist in Ordnung, wenn Zeile
20 wirklich leerer Platz zum Ablegen ist, aber es ist ein Desaster, wenn Sie „diese Zeile zwischen die
anderen einreihen" meinten.
Der Zug, der Ihre Daten erhält, ist ausschneiden, dann Insert:
ws.Rows(5).Cut ' aufheben
ws.Rows(20).Insert Shift:=xlDown ' RICHTIG - eine Luecke oeffnen, hineinlegen, nichts ueberschrieben
Hält die Zwischenablage ausgeschnittene Zellen, führt .Insert ein Insert cut cells aus — es schafft
Platz, statt obenauf zu landen. Die Regel ist unmissverständlich: Zum Verschieben fügen Sie das
Ausgeschnittene mit Insert ein; legen Sie es nie mit Paste darüber. Greifen Sie nur dann zu
Cut Destination:=, wenn Sie wirklich ein leeres Ziel überschreiben wollen.
Die Verschiebungs-Falle: nach unten verschieben nummeriert Ihr Ziel neu
Hier die Überraschung, die Hilfeforen füllt — „Ich habe eine Zeile ausgeschnitten, weiter unten mit Insert eingefügt, und alle meine Daten sind nach oben gerückt." Das ist kein Fehler; das ist die Verschiebung, die konsequent ist.
Ausschneiden und Einfügen geschehen als eine Operation. Verschieben Sie Zeile 5 nach unten auf Zeile 20,
schließt sich das Loch bei Zeile 5 als Teil desselben Zugs, sodass die Zeilen 6 bis 20 jeweils um eins
nach oben rücken — und die Zeile, die 20 war, sitzt jetzt auf 19. Ihre Zeile landet relativ zum
verschobenen Raster, nicht zu den Zeilennummern, die Sie im Kopf hatten, als Sie 20 schrieben.
Die Lösung: Verschieben Sie nicht mehr über fest verdrahtete Zeilennummern, denn diese Nummern verschieben sich unter Ihnen. Finden Sie den Orientierungspunkt über seinen Wert und fügen Sie relativ dazu ein, damit die Verschiebung Sie nicht täuschen kann:
Dim target As Range
Set target = ws.Columns("A").Find("Subtotal", LookAt:=xlWhole) ' das WO finden, keine Nummer
ws.Rows(5).Cut
target.EntireRow.Insert Shift:=xlDown ' fuegt oberhalb der echten Subtotal-Zeile ein, egal ob verschoben
Application.CutCopyMode = False
Wenn es Nummern sein müssen, merken Sie sich die Richtung: nach oben verschieben (Quelle unterhalb des Ziels) lässt die Nummer des Ziels unverändert; nach unten verschieben (Quelle oberhalb des Ziels) rückt das Ziel um eins nach oben. Im Zweifel fügen Sie oberhalb eines gefundenen Orientierungspunkts ein.
Mehrere Zeilen verschieben: von unten nach oben
Verschieben Sie Zeilen einzeln in einer Vorwärtsschleife, nummeriert jeder Zug die noch nicht angefassten neu, sodass der zweite Zug die falsche Zeile greift. Das ist dieselbe Disziplin wie beim Löschen von Zeilen in einer Schleife — arbeiten Sie von unten nach oben, damit die Verschiebungen unterhalb Ihres Cursors geschehen, wo sie Zeilen, die Sie noch verschieben müssen, nicht stören können:
Dim i As Long
For i = lastRow To firstRow Step -1 ' von unten nach oben: Verschiebungen landen unterhalb, nicht oberhalb
If ws.Cells(i, "D").Value = "Archive" Then
ws.Rows(i).Cut
ws.Rows(archiveTop).Insert Shift:=xlDown
End If
Next i
Application.CutCopyMode = False
Für einen zusammenhängenden Block verschieben Sie ihn in einem Zug — ws.Rows("5:9").Cut und dann ein
einziges .Insert — statt fünfmal zu schleifen und gegen fünf Verschiebungen zu kämpfen. Ein Ausschneiden,
ein Insert, keine Neunummerierungs-Überraschungen mitten in der Schleife.
Cut verschiebt Verweise; Löschen bricht sie
Es gibt noch einen Grund, warum Cut + Insert der sichere Zug ist: Excel folgt ihm. Eine Formel
anderswo, die =Data!B5 liest, wird umgeschrieben, sodass sie nach dem Verschieben auf das neue Zuhause
der Zeile zeigt, und liest weiterhin dieselben Daten. Das ist das Gegenteil vom
Löschen einer Zeile, wo eine Formel, die in die gelöschte Zeile zeigt, zu
=#REF! zusammenfällt und kaputt bleibt. Ein Verschieben verlagert die Daten und nimmt ihre Verweise mit;
ein Löschen zerstört die Daten und lässt die Verweise verwaist zurück. Wenn Ihr Ziel „dieselben Zahlen,
ein anderer Platz" ist, ist das genau das Verhalten, das Sie wollen.
Wie ExcelMaster hilft
Eine Zeile zu verschieben sind drei Entscheidungen, verkleidet als eine Zeile — mit Insert einfügen oder mit Paste überschreiben (Daten erhalten oder zerstört), in welche Richtung die Verschiebung läuft (und ob Ihre Zielnummer noch das bedeutet, was Sie denken) und ob Sie einen Block in einem Aufruf verschieben oder von unten nach oben schleifen —, und jede davon falsch zu treffen scheitert leise: eine still überschriebene Zielzeile, Zeilen, die um eins daneben landen, oder eine halbe Schleife, die in die falschen Plätze verschoben wurde.
ExcelMaster lässt Sie sagen, was Sie wollen — „verschiebe jede Archive-Zeile an den Anfang des Archivblocks und behalte die Daten, die schon dort stehen" — und schneidet aus und fügt mit Insert ein, statt mit Paste zu überschreiben, findet den Orientierungspunkt über den Wert, damit die Verschiebung nicht täuscht, und schleift von unten nach oben, wenn es mehrere sind. Sie behalten die Arbeitsmappe und den Code.
Häufig gestellte Fragen
Wie verschiebe ich in VBA eine Zeile, ohne Daten zu überschreiben?
Schneiden Sie die Zeile aus und fügen Sie sie dann mit Insert ein, legen Sie sie nicht mit Paste ab:
ws.Rows(5).Cut, gefolgt von ws.Rows(20).Insert Shift:=xlDown. Das Insert öffnet eine Lücke am Ziel
und schiebt die anderen Zeilen nach unten, sodass nichts überschrieben wird. Rows(5).Cut Destination:=Rows(20) legt mit Paste auf Zeile 20 und zerstört deren Inhalt — nutzen Sie das nur, wenn das
Ziel leer ist.
Warum rücken meine Daten nach oben, nachdem ich eine Zeile ausgeschnitten und eingefügt habe?
Weil das Verschieben eine einzige Verschiebung ist. Schneiden Sie eine Zeile aus und fügen Sie sie weiter unten mit Insert ein, schließt sich das Loch, das die Zeile hinterlässt, als Teil derselben Operation, sodass jede Zeile unterhalb der Quelle — auch die, auf die Sie zielten — um eins nach oben rutscht. Fügen Sie relativ zu einem Orientierungspunkt ein, den Sie über den Wert finden, statt über eine fest verdrahtete Zeilennummer, und die Verschiebung spielt keine Rolle mehr.
Wie verschiebe ich in VBA mehrere Zeilen auf einmal?
Für einen zusammenhängenden Block schneiden Sie den ganzen Bereich aus und fügen einmal ein:
ws.Rows("5:9").Cut und dann .Insert. Für verstreute Zeilen, die über eine Bedingung ausgewählt werden,
schleifen Sie von der letzten Zeile nach oben zur ersten (Step -1), damit jeder Zug Zeilen unterhalb
Ihrer Position verschiebt, nie die, die Sie noch verschieben müssen.
Wie verschiebe ich eine Zeile auf ein anderes Arbeitsblatt?
Schneiden Sie die Zeile aus und fügen Sie sie auf dem anderen Blatt mit Insert ein:
ThisWorkbook.Worksheets("Data").Rows(5).Cut und dann
ThisWorkbook.Worksheets("Archive").Rows(2).Insert Shift:=xlDown. Es ist dasselbe
Ausschneiden-und-Einfügen; nur das Zielblatt ändert sich. Qualifizieren Sie beide Blätter, damit das Makro
nicht davon abhängt, welches gerade aktiv ist.
Was ist der Unterschied zwischen Cut und Copy beim Verschieben einer Zeile?
Cut verschiebt — es leert die Quelle, sobald die Zeile landet, sodass Sie mit einer Kopie enden. Copy
dupliziert — die Quelle bleibt, und Sie müssten sie selbst löschen, was leicht schiefgeht. Um eine Zeile zu
verschieben, nutzen Sie Cut; die vollständige Mechanik finden Sie unter
VBA Ausschneiden.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 17.09.2026.
Verwandte Anleitungen: VBA Ausschneiden · VBA Spalten verschieben · VBA Zeilen einfügen · VBA Zeilen löschen · VBA Kopieren und Einfügen
