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

VBA Copy File in Excel — FileCopy, FileSystemObject.CopyFile und warum es keine geöffnete Arbeitsmappe kopieren kann

|

VBA Copy File in Excel — FileCopy, FileSystemObject.CopyFile und warum es keine geöffnete Arbeitsmappe kopieren kann

TL;DRFileCopy source, destination kopiert eine Datei in einer Zeile, braucht keine Verweise und überschreibt still, was auch immer bereits am Ziel liegt. Der Haken, über den jeder stolpert — es kann keine geöffnete Datei kopieren, auch nicht die Arbeitsmappe, aus der Sie das Makro heraus ausführen. Beide Pfade müssen vollständig sein, Dateiname inklusive, und der Zielordner muss bereits existieren:

Sub BackupReport()
    ' Beide Argumente sind VOLLSTAENDIGE Pfade, samt Dateiname auf jeder Seite
    FileCopy "C:\Reports\March.xlsx", "C:\Backup\March.xlsx"   ' ueberschreibt Backup still
End Sub

Sobald ein Makro die Dateien gefunden hat, an denen es arbeiten soll, ist das Nächste meist, mit ihnen zu handeln — und die sanfteste dieser Handlungen ist, eine davon an einen sicheren Ort zu kopieren, bevor irgendetwas anderes sie anfasst. Genau dort stoßen Einsteiger an ihre erste Wand: FileCopy funktioniert bei einer geschlossenen Datei tadellos und scheitert dann mit error 70 in dem Moment, in dem Sie es auf eine geöffnete Arbeitsmappe richten. Verstehen Sie das Warum, und Sie greifen immer zum richtigen der drei Kopierwerkzeuge.

Was Sie lernen

  • Das mentale Modell — welches Kopierwerkzeug Sie brauchen, hängt davon ab, ob die Datei geöffnet ist
  • Warum FileCopy ohne Warnung überschreibt — das Gegenteil der Name-Anweisung
  • Warum FileCopy bei einer geöffneten Arbeitsmappe mit error 70 scheitert und was Sie stattdessen verwenden
  • Warum beide Argumente vollständige Pfade sein müssen und der Zielordner bereits existieren muss
  • Wann Sie zu FileSystemObject.CopyFile für Platzhalter und ein explizites Überschreib-Flag wechseln
  • Wie Sie die gerade geöffnete Arbeitsmappe mit SaveCopyAs kopieren und wie Kopieren-dann-Kill zu einem Verschieben wird

Das mentale Modell: drei Kopierwerkzeuge für drei Situationen

Es gibt in VBA keinen einzelnen Befehl „eine Datei kopieren“ — es gibt drei, und sie sind nicht austauschbar. Die Frage, die den richtigen auswählt, ist immer dieselbe: Ist die Datei geöffnet, und brauchen Sie Platzhalter?

  • FileCopy source, destination — die eingebaute Anweisung. Keine Verweise, keine Objekte. Kopiert eine geschlossene Datei, überschreibt das Ziel still. Das ist Ihr Standard für Dateien, die auf der Festplatte liegen.
  • FileSystemObject.CopyFile source, destination[, overwrite] — die Objektmodell-Variante. Dieselbe Aufgabe, aber sie akzeptiert Platzhalter (*.xlsx), nimmt ein explizites Überschreib-Flag und hat mit CopyFolder ein Geschwister für ganze Bäume.
  • workbook.SaveCopyAs path — der einzige korrekte Weg, eine gerade geöffnete Arbeitsmappe zu kopieren. Es schreibt einen Schnappschuss auf die Festplatte, ohne die aktive Datei zu stören.

Alles Weitere ist eine Folge dieser drei und der Situationen, zu denen sie gehören. Wählen Sie, indem Sie zuerst fragen „ist sie geöffnet?“ und dann „brauche ich ein Muster?“.

FileCopy überschreibt still — das Gegenteil von Name

FileCopy fragt nie. Existiert am Ziel bereits etwas, wird es ohne Rückfrage und ohne Fehler ersetzt. Das ist wichtig, weil die Schwester-Anweisung für die Festplatte, Name, genau das Gegenteil tut — sie weigert sich zu überschreiben und löst einen Fehler aus. Zwei eingebaute Anweisungen, zwei widersprüchliche Antworten auf „was, wenn das Ziel existiert?“:

FileCopy "C:\Reports\March.xlsx", "C:\Backup\March.xlsx"   ' ersetzt Backup\March.xlsx, keine Warnung

Wenn ein stilles Überschreiben genau das ist, was Sie wollen (ein Backup auffrischen), ist das praktisch. Wenn nicht — wenn dieses Backup die einzige Kopie von gestern war — müssen Sie das Ziel selbst absichern, bevor Sie FileCopy aufrufen:

If Dir("C:\Backup\March.xlsx") = "" Then                    ' nur kopieren, wenn dort nichts ist
    FileCopy "C:\Reports\March.xlsx", "C:\Backup\March.xlsx"
End If

Dieser einzeilige Existenztest ist das Thema von prüfen, ob eine Datei existiert; hier ist er der Unterschied zwischen einem sicheren Backup und einem zerstörten.

Die error-70-Falle: FileCopy kann keine geöffnete Datei kopieren

Das ist der FileCopy-Bug Nummer eins. Die Anweisung fordert von Windows exklusiven Lesezugriff auf die Quelle und exklusiven Schreibzugriff auf das Ziel. Eine geöffnete Arbeitsmappe ist von Excel gesperrt, also:

FileCopy ThisWorkbook.FullName, "C:\Backup\live.xlsx"   ' error 70 - "Permission denied"

scheitert sofort — und die Datei, die Sie am dringendsten sichern wollen (die, in der Sie gerade arbeiten), ist genau die, die geöffnet ist. Derselbe error 70 erscheint, wenn das Ziel geöffnet oder schreibgeschützt ist oder Ihnen die Rechte am Ordner fehlen. Es gibt zwei korrekte Auswege:

  • Ist es Ihre Arbeitsmappe, verwenden Sie SaveCopyAs — es kopiert die aktive Datei, ohne sie zu schließen (nächster Abschnitt).
  • Ist es eine andere Arbeitsmappe, die Sie im Code geöffnet haben, schließen Sie sie zuerst mit Close, dann FileCopy die Datei auf der Festplatte.

„Reparieren“ Sie error 70 niemals mit On Error Resume Next — das verbirgt eine gesperrte Datei als stilles Nicht-Kopieren, und Ihr Backup findet einfach nie statt.

Beide Argumente sind vollständige Pfade — und der Ordner muss existieren

Zwei strukturelle Regeln erwischen die Leute immer wieder:

Das Ziel ist ein vollständiger Pfad, kein Ordner. FileCopy leitet den Dateinamen nicht aus der Quelle ab.

FileCopy "C:\Reports\March.xlsx", "C:\Backup\"              ' error 75 - path/file access error
FileCopy "C:\Reports\March.xlsx", "C:\Backup\March.xlsx"    ' korrekt - benennen Sie sie explizit

Der Zielordner muss bereits existieren. FileCopy legt C:\Backup\ nicht für Sie an. Falls der Ordner fehlen könnte, erstellen Sie ihn zuerst mit MkDir — und denken Sie daran, dass MkDir selbst einen Fehler auslöst, wenn der Ordner bereits existiert, also sichern Sie es ab:

If Dir("C:\Backup", vbDirectory) = "" Then MkDir "C:\Backup"
FileCopy "C:\Reports\March.xlsx", "C:\Backup\March.xlsx"

FileSystemObject.CopyFile: Platzhalter und ein explizites Überschreib-Flag

Wenn Sie viele Dateien auf einmal kopieren müssen oder wollen, dass Überschreiben eine Entscheidung statt ein stiller Standard ist, wechseln Sie zum FileSystemObject:

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")        ' spaete Bindung - laeuft auf jedem Rechner
fso.CopyFile "C:\Reports\*.xlsx", "C:\Backup\"              ' Platzhalter: jede .xlsx auf einmal
fso.CopyFile "C:\Reports\March.xlsx", "C:\Backup\March.xlsx", False   ' Overwrite:=False -> error, wenn sie existiert

Drei Dinge, die FileCopy nicht kann, CopyFile aber schon: ein Platzhalter-Muster abgleichen, ein Überschreib-Flag nehmen, sodass eine bestehende Datei error 58 auslöst, statt still zu verschwinden, und — mit CopyFolder — einen ganzen Verzeichnisbaum kopieren. Beachten Sie, dass hier die Zielordner-Form erlaubt ist (ein abschließender \ bedeutet „in diesen Ordner“), weshalb CopyFile sich natürlich mit einer Platzhalter-Quelle paart. Eine geöffnete Datei kann es dennoch nicht kopieren — diese Einschränkung gehört zu Windows, nicht zum Werkzeug.

Die geöffnete Arbeitsmappe mit SaveCopyAs kopieren — und Kopieren-dann-Kill ist ein Verschieben

Bei der aktiven Arbeitsmappe ist die Antwort gar keine Dateisystem-Kopie — es ist eine Arbeitsmappen-Methode:

ThisWorkbook.SaveCopyAs "C:\Backup\March-" & Format(Now, "yyyymmdd-hhnnss") & ".xlsx"

SaveCopyAs schreibt eine Kopie auf die Festplatte und lässt das Original geöffnet und unberührt — kein error 70, kein Schließen, keine Änderung am eigenen Pfad der Arbeitsmappe. Es ist der korrekte Backup-Aufruf in jedem langen Makro und wird zusammen mit Save und SaveAs in der Anleitung zum Speichern von Arbeitsmappen behandelt.

Schließlich eine nützliche Gleichung: ein Verschieben ist ein Kopieren gefolgt von einem Löschen. Wenn Sie Name nicht verwenden können — etwa beim Verschieben einer Datei auf ein anderes Laufwerk, was Name verweigert — greifen Sie auf Kopieren-dann-Löschen zurück:

FileCopy "C:\Reports\March.xlsx", "D:\Archive\March.xlsx"   ' auf das andere Laufwerk kopieren
Kill "C:\Reports\March.xlsx"                                ' dann das Original entfernen

Dieser Kill ist endgültig und hat kein Undo, also tun Sie es erst, nachdem Sie bestätigt haben, dass die Kopie angekommen ist.

Das ehrliche Fazit: wählen Sie nach „ist sie geöffnet?“, dann „brauche ich ein Muster?“

Eine Datei zu kopieren ist trivial, bis die Datei geöffnet ist oder das Ziel bereits eine Rolle spielt. Vier Regeln halten es korrekt:

  • Geschlossene Datei, einzelne KopieFileCopy — am kürzesten, keine Einrichtung, aber es überschreibt still, also sichern Sie das Ziel ab, wenn die bestehende Datei zählt.
  • Viele Dateien oder eine echte Überschreib-Entscheidungfso.CopyFile mit einem Platzhalter und dem Overwrite-Flag.
  • Die geöffnete ArbeitsmappeSaveCopyAs, niemals FileCopy — das ist die ganze Antwort auf error 70.
  • Vollständige Pfade, existierender Ordner → benennen Sie die Zieldatei explizit und legen Sie den Ordner zuerst mit MkDir an.

In dem Augenblick, in dem FileCopy Ihnen error 70 liefert, hören Sie auf, nach On Error zu greifen, und stellen Sie die eigentliche Frage: Ist diese Datei geöffnet? Ist sie Ihre, SaveCopyAs; ist es eine andere, schließen Sie sie zuerst.

Wie ExcelMaster hilft

Zwischen FileCopy, fso.CopyFile und SaveCopyAs zu wählen — und dabei zu behalten, dass nur das letzte eine geöffnete Arbeitsmappe anfassen kann, dass das Ziel einen vollständigen Pfad braucht und dass der Ordner zuerst existieren muss — ist viel Zeremonie für „mach einfach eine Kopie“, und die falsche Wahl scheitert zur Laufzeit mit einem kryptischen error 70.

ExcelMaster schreibt die richtige Kopie für die Situation. Beschreiben Sie den Job — „sichere diese Arbeitsmappe mit einem Zeitstempel, bevor ich irgendetwas überschreibe“ oder „kopiere jede .xlsx in diesem Ordner in ein Archiv“ — und es erzeugt den korrekten Aufruf: SaveCopyAs für die aktive Datei, fso.CopyFile mit einem Platzhalter für einen Stapel, die MkDir-Absicherung für einen fehlenden Ordner und ein Kopieren-dann-Kill, wenn Sie wirklich ein laufwerksübergreifendes Verschieben meinten. Sie beschreiben das Ergebnis; es wählt das Werkzeug, das keinen error 70 auslöst.

Häufig gestellte Fragen

Wie kopiere ich in VBA eine Datei?

Verwenden Sie die eingebaute Anweisung FileCopy source, destination, bei der beide Argumente vollständige Pfade samt Dateiname sind — zum Beispiel FileCopy "C:\Reports\March.xlsx", "C:\Backup\March.xlsx". Sie braucht keine Verweise und kopiert eine geschlossene Datei, aber sie überschreibt das Ziel still, und der Zielordner muss bereits existieren. Um viele Dateien auf einmal zu kopieren, verwenden Sie FileSystemObject.CopyFile mit einer Platzhalter-Quelle.

Warum liefert VBA FileCopy error 70 Permission denied?

Weil die Quell- oder Zieldatei geöffnet oder gesperrt ist. FileCopy braucht exklusiven Zugriff, und Excel sperrt jede geöffnete Arbeitsmappe — das Kopieren der Arbeitsmappe, aus der Sie es ausführen, scheitert also immer mit error 70. Um die gerade geöffnete Arbeitsmappe zu kopieren, verwenden Sie stattdessen ThisWorkbook.SaveCopyAs path; um eine andere im Code geöffnete Arbeitsmappe zu kopieren, schließen Sie sie zuerst mit Close, dann FileCopy die Datei auf der Festplatte.

Wie kopiere ich in VBA eine Datei in einen anderen Ordner?

Geben Sie FileCopy ein Ziel in diesem Ordner, als vollständigen Pfad mit dem Dateinamen: FileCopy "C:\In\a.xlsx", "C:\Out\a.xlsx". Der Zielordner muss bereits existieren — FileCopy legt ihn nicht an, also sichern Sie zuerst mit If Dir("C:\Out", vbDirectory) = "" Then MkDir "C:\Out" ab. Für ein reines Ordnerziel wie "C:\Out\" verwenden Sie fso.CopyFile statt FileCopy.

Überschreibt VBA FileCopy eine bestehende Datei?

Ja — still, ohne Rückfrage und ohne Fehler. Das ist das Gegenteil der Name-Anweisung, die sich weigert zu überschreiben. Wenn Sie eine bestehende Datei nicht ersetzen wollen, prüfen Sie zuerst mit Dir(path) = "" oder fso.FileExists(path) darauf, oder verwenden Sie fso.CopyFile source, destination, False, sodass ein bestehendes Ziel error 58 auslöst, statt zu verschwinden.

Wie kopiere ich in VBA die gerade geöffnete Arbeitsmappe?

Verwenden Sie ThisWorkbook.SaveCopyAs "C:\Backup\copy.xlsx". SaveCopyAs schreibt einen Schnappschuss auf die Festplatte und lässt das Original geöffnet und unverändert, sodass es den error 70 vermeidet, den FileCopy bei einer geöffneten Datei liefert. Es ist der Standardweg für ein Backup mit Zeitstempel in einem langen Makro, und es ändert nicht den eigenen gespeicherten Pfad der Arbeitsmappe.

Getestet in

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

Verwandte Anleitungen: VBA Delete File · VBA Rename File · VBA Dir · VBA FileSystemObject · VBA Save Workbook