Kurzfassung —
Worksheet.Copynimmt dieselbeBefore:=/After:=-Positionierung, die Sie bei Add nutzen, aber mit zwei Unterschieden, die jeden erwischen. Erstens: Es gibt nichts zurück — es gibt keinSet ws = sheet.Copy, also greifen Sie die frische Kopie in der unmittelbar nächsten Zeile überActiveSheet. Zweitens, und das ist der große:ws.Copyohne Ziel kopiert nicht innerhalb der Arbeitsmappe — es erstellt eine brandneue Arbeitsmappe, die die Kopie enthält. Übergeben Sie immer einBeforeoderAfter, es sei denn, eine neue Datei ist genau das, was Sie wollen.
Sub DuplicateTemplate()
Dim src As Worksheet, copy As Worksheet
Set src = ThisWorkbook.Worksheets("Template")
src.Copy After:=ThisWorkbook.Worksheets(Worksheets.Count) ' Duplikat ans Ende
Set copy = ActiveSheet ' die Kopie ist jetzt aktiv
copy.Name = "Template " & Format(Now, "hhmmss") ' sofort umbenennen
End Sub
Worksheet.Copy ist die Code-Fassung von Rechtsklick auf ein Register ▸ Verschieben oder kopieren ▸
Kopie erstellen. So stanzen Bericht-Makros Monat für Monat ein frisches Blatt aus einer Vorlage. Es ist
zugleich die überraschendste Methode der ganzen Blattverwaltungs-Familie, denn der „naheliegende" Aufruf
— Sheets("Template").Copy ohne Argumente — tut etwas völlig anderes, als der Name nahelegt.
Was Sie lernen
- Das Denkmodell —
Copyist der Zwilling von Add: gleiche Positionierung, kein Rückgabewert - Die Überraschung, die die meisten Makros bricht — ein blankes
Copyerzeugt eine neue Arbeitsmappe - Wie Sie die Kopie referenzieren, wenn die Methode nichts zurückgibt
- Was mit einem kopierten Blatt mitwandert — Formeln, Formatierung, Code und definierte Namen
- Wie
MoveCopymit umgekehrter Absicht spiegelt, und wie Sie in eine andere Arbeitsmappe kopieren
Das Denkmodell: Copy ist der Zwilling von Add, ohne Rückgabewert
Ein Blatt hinzuzufügen und eines zu kopieren teilen eine Grammatik. Beide nehmen Before:= und After:=,
um zu sagen, wo das Blatt landet, und beide setzen standardmäßig auf eine Position statt ans Ende. Der
Unterschied: Add ist eine Funktion, die Ihnen das neue Blatt reicht, während Copy eine Methode ist,
die überhaupt nichts zurückgibt. Sie können nicht Set ws = src.Copy schreiben; das ist ein
Kompilierfehler.
Excel lässt Ihnen also genau einen Weg, das frische Duplikat zu greifen: Direkt nachdem Copy läuft,
wird die Kopie zum aktiven Blatt. Fangen Sie sie in der nächsten Zeile ab, bevor irgendetwas anderes
den Fokus stehlen kann:
src.Copy After:=Worksheets(Worksheets.Count)
Dim copy As Worksheet
Set copy = ActiveSheet ' das IST die Kopie - jetzt greifen
Das ist eine der seltenen Stellen, an denen der Verlass auf ActiveSheet korrekt statt schlampig ist,
denn Copy lässt das neue Blatt wirklich aktiv, und es gibt keinen besseren Griff. Die Disziplin besteht
darin, es sofort zu tun — ein Calculate, ein DoEvents oder ein Ereignishandler zwischen Copy und
Set copy = ActiveSheet kann den Fokus verschieben und Ihnen das falsche Blatt reichen.
Die Überraschung, die die meisten Makros bricht: ein blankes Copy erzeugt eine neue Arbeitsmappe
Hier ist das Verhalten, das Leute zu Suchmaschinen treibt. Man würde vernünftigerweise erwarten, dass
Sheets("Template").Copy — ohne Argumente — das Blatt innerhalb der aktuellen Arbeitsmappe dupliziert.
Tut es nicht. Ein Copy mit weder Before noch After erstellt eine neue Arbeitsmappe mit einem
einzigen Blatt und legt die Kopie dort ab. Führen Sie es in einer Schleife aus, und Sie bekommen einen
Stapel neuer Fenster statt eines Stapels neuer Register.
src.Copy ' KEIN lokales Duplikat - eine ganz neue Arbeitsmappe erscheint
Die Regel ist einfach: Übergeben Sie immer ein Ziel, wenn Sie ein Duplikat innerhalb der Arbeitsmappe wollen. Die argumentlose Form ist allerdings kein Bug — sie ist die sauberste idiomatische Wendung in ganz VBA, um ein einzelnes Blatt als eigene Datei zu exportieren:
src.Copy ' neue Arbeitsmappe mit nur diesem Blatt
ActiveWorkbook.SaveAs "C:\Reports\September.xlsx", FileFormat:=xlOpenXMLWorkbook
ActiveWorkbook.Close SaveChanges:=False
So bedient dieselbe Methode zwei Absichten, abhängig von einem einzigen Argument. Entscheiden Sie,
welche Sie meinen, und lassen Sie ein fehlendes After nie ein „dieses Register duplizieren" in ein
„vierzig Arbeitsmappen öffnen" verwandeln.
Was mit einem kopierten Blatt mitwandert
Copy klont das Objekt, nicht nur die Werte — und das ist mehr, als die meisten sich vorstellen. Ein
kopiertes Blatt bringt seine Formeln, Formatierung, Diagramme, Formen, bedingte Formatierung, den Code
in seinem Blattmodul und alle blattbezogenen definierten Namen mit. Daraus folgen zwei Konsequenzen:
- Formeln, die auf andere Blätter verwiesen, behalten diese Verweise, sodass eine Kopie innerhalb derselben Arbeitsmappe still auf die Nachbarn des Originals zurückzeigen kann — prüfen Sie, ob Sie die Verknüpfungen umgelenkt haben wollten.
- Duplizierte definierte Namen sind der klassische Nebeneffekt: Kopieren Sie ein Blatt mit einem blattbezogenen Namen, und Excel fragt womöglich zu einem bereits existierenden Namen nach oder erstellt still einen zweiten, anders gebundenen.
Wollen Sie nur die Daten, kopieren Sie nicht das Blatt — kopieren Sie den Bereich.
dst.Range("A1:Z100").Value = src.Range("A1:Z100").Value verschiebt Werte ohne jeden Ballast. Das ganze
Blatt zu kopieren ist das richtige Werkzeug, wenn Sie die Vorlage — Layout, Formeln und Code — bewusst
unversehrt reproduzieren wollen.
Die Kopie benennen, und wie Move Copy spiegelt
Excel benennt ein Duplikat automatisch Template (2), Template (3) und so weiter, Sie benennen es also
fast immer sofort um. Da es keinen Rückgabewert gibt, benennen Sie über das aktive Blatt in der Zeile
direkt nach Copy um, und es gelten dieselben Regeln wie im Add-Artikel — 31
Zeichen, eindeutig, kein : \ / ? * [ ].
Worksheet.Move ist das Spiegelbild von Copy. Es nimmt die identischen Before:=/After:=-Argumente,
aber es verschiebt das Blatt, statt es zu duplizieren, und ein blankes Move ohne Ziel öffnet
ebenfalls eine neue Arbeitsmappe — es bewegt das Blatt vollständig aus der aktuellen heraus. Gleiche
Argumentform, entgegengesetzte Absicht:
src.Move After:=Worksheets(Worksheets.Count) ' ans Ende verschieben (kein Duplikat)
src.Copy To:=Workbooks("Report.xlsx").Worksheets(1) ' in eine andere geoeffnete Arbeitsmappe kopieren
Um in eine andere Arbeitsmappe zu kopieren, zielen Sie im Before/After-Argument auf deren Blatt —
beide Dateien müssen geöffnet sein. Die Faustregel über die ganze Methode hinweg: Übergeben Sie immer ein
Ziel, fangen Sie die Kopie in der nächsten Zeile über ActiveSheet ab, denken Sie daran, dass die Kopie
Code und Namen mitträgt, und greifen Sie zur blanken Form nur, wenn „neue Arbeitsmappe" das eigentliche
Ziel ist.
Wie ExcelMaster hilft
Ein Blatt zu kopieren verbirgt eine Mine — die argumentlose Form öffnet eine neue Arbeitsmappe, statt zu duplizieren — und zwei leisere Fallen: keinen Rückgabewert zum Greifen und eine Kopie, die ihren Code und ihre definierten Namen mitschleppt.
ExcelMaster lässt Sie die Absicht
klar aussprechen — „dupliziere das Template-Blatt ans Ende und benenne es nach dem heutigen Datum" oder
„exportiere dieses Blatt als eigene Datei" — und schreibt für jede die richtige Form: ein positioniertes
Copy mit einem ActiveSheet-Abfangen und einer Umbenennung für das Duplikat innerhalb der
Arbeitsmappe, oder ein blankes Copy plus SaveAs für den Export. Es warnt außerdem, wenn ein kopiertes
Blatt Formeln oder Namen trägt, die kollidieren werden. Sie behalten die Arbeitsmappe und den Code.
Häufig gestellte Fragen
Wie kopiere ich in VBA ein Arbeitsblatt?
Nutzen Sie Worksheet.Copy mit einem Ziel: src.Copy After:=Worksheets(Worksheets.Count) dupliziert das
Blatt ans Ende. Weil Copy nichts zurückgibt, greifen Sie das neue Blatt in der nächsten Zeile über
ActiveSheet — Set copy = ActiveSheet — und benennen es dann um. Übergeben Sie immer Before:= oder
After:=; die argumentlose Form tut etwas anderes.
Warum öffnet mein Copy-Makro eine neue Arbeitsmappe?
Weil Sie Copy ohne Before- oder After-Argument aufgerufen haben. Ein blankes Worksheet.Copy
dupliziert nicht innerhalb der aktuellen Arbeitsmappe — es erstellt eine neue Arbeitsmappe mit einem
einzigen Blatt, die die Kopie enthält. Übergeben Sie ein Ziel (After:=Worksheets(Worksheets.Count)), um
an Ort und Stelle zu duplizieren, und reservieren Sie die argumentlose Form für den Export eines Blatts
als eigene Datei.
Wie bekomme ich eine Referenz auf das kopierte Blatt?
Copy hat keinen Rückgabewert, Sie können also nicht Set ws = src.Copy schreiben. Stattdessen wird die
Kopie unmittelbar nach dem Aufruf zum aktiven Blatt, fangen Sie sie also mit Set copy = ActiveSheet in
der unmittelbar nächsten Zeile ab — bevor ein Calculate, DoEvents oder Ereignishandler den Fokus
verschieben und Ihnen das falsche Blatt reichen kann.
Wie kopiere ich ein Blatt in eine andere Arbeitsmappe?
Zielen Sie im Positionierungsargument auf ein Blatt in der anderen Arbeitsmappe, bei beiden geöffneten
Dateien: src.Copy After:=Workbooks("Report.xlsx").Worksheets(Worksheets.Count). Die Kopie trägt ihre
Formeln, Formatierung und ihren Code mit; achten Sie auf Formeln, die auf die Quell-Arbeitsmappe
verwiesen, da sie auf die Originaldatei zurückzeigen können.
Was ist der Unterschied zwischen Copy und Move?
Worksheet.Copy dupliziert das Blatt; Worksheet.Move verschiebt es und entfernt es aus seiner
ursprünglichen Position. Beide nehmen dieselben Before:=/After:=-Argumente, und beide öffnen eine neue
Arbeitsmappe, wenn sie ohne Ziel aufgerufen werden. Nutzen Sie Copy, um ein Duplikat zu stanzen, und
Move, um ein Blatt umzusortieren oder herauszulösen.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 14.09.2026.
Verwandte Anleitungen: VBA Blatt hinzufügen · VBA Blatt löschen · VBA Worksheets · VBA Arbeitsmappe öffnen · VBA ThisWorkbook
