TL;DR —
FileCopy source, destinationkopiert 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
FileCopyohne Warnung überschreibt — das Gegenteil derName-Anweisung - Warum
FileCopybei 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.CopyFilefür Platzhalter und ein explizites Überschreib-Flag wechseln - Wie Sie die gerade geöffnete Arbeitsmappe mit
SaveCopyAskopieren und wie Kopieren-dann-Killzu 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 mitCopyFolderein 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, dannFileCopydie 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 Kopie →
FileCopy— 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-Entscheidung →
fso.CopyFilemit einem Platzhalter und demOverwrite-Flag. - Die geöffnete Arbeitsmappe →
SaveCopyAs, niemalsFileCopy— das ist die ganze Antwort auferror 70. - Vollständige Pfade, existierender Ordner → benennen Sie die Zieldatei explizit und legen Sie den
Ordner zuerst mit
MkDiran.
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
