TL;DR — Zwei korrekte Wege, einer je Werkzeugkasten.
Dirist der Einzeiler, wenn Sie nirgends in der Nähe einerDir-Schleife sind;FileSystemObject.FileExistsist der sichere Standard, weil es keinen versteckten Zustand hat:
' Eingebaut, eine Zeile - teilt sich aber Dirs einzelnen globalen Cursor:
If Dir("C:\Reports\March.xlsx") <> "" Then MsgBox "It's there"
' Zustandslos, klarer, unterscheidet Datei von Ordner - der sicherere Standard:
Dim fso As Object: Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists("C:\Reports\March.xlsx") Then MsgBox "It's there"
„Existiert diese Datei?“ ist die meistgesuchte Dateifrage in VBA, denn die Alternative — eine Datei zu
öffnen, die nicht da ist — löst Laufzeitfehler 1004 aus und bringt ein unbeaufsichtigtes Makro zum
Stillstand. Die gute Nachricht ist, dass die Prüfung ein Einzeiler ist. Der Haken ist, dass der
naheliegende Einzeiler, Dir, denselben versteckten Cursor trägt, der eine
Dir-Schleife antreibt — also ist es genauso wichtig, wo Sie ihn aufrufen, wie wie.
Was Sie lernen
- Der falsche Reflex — „einfach öffnen und den Fehler abfangen“ — und warum er die schlechteste Option ist
- Die zwei richtigen Antworten —
DirundFileSystemObject.FileExists - Die Falle, die dieses Thema bestimmt — die
Dir-Prüfung setzt eineDir-Schleife zurück - Wie
Direinen Ordnerpfad oder einen abschließenden Backslash falsch behandelt FileExistsgegenüberFolderExists— sagen Sie genau, was Sie meinen- Warum „prüfen, dann öffnen“ dennoch eine Fehlerabsicherung braucht (das winzige Wettrennen und die praktische Abhilfe)
Der falsche Reflex: öffnen und den Fehler abfangen
Die verlockende Abkürzung ist, die Prüfung ganz zu überspringen und den Fehlschlag es Ihnen sagen zu lassen:
On Error Resume Next
Set wb = Workbooks.Open(path) ' fehlt sie, feuert 1004 und wird verschluckt
On Error GoTo 0
If wb Is Nothing Then MsgBox "Not found"
Das funktioniert, aber es ist das Schlechteste der drei Optionen. Es ist langsam (Excel versucht die
Datei tatsächlich zu öffnen), es verschluckt unabhängige Fehler — eine beschädigte Datei, ein
Berechtigungsproblem, eine gesperrte Datei sehen alle identisch aus wie „fehlt“ — und es stützt sich auf
On Error Resume Next, das Bugs verbirgt, wenn es eingeschaltet bleibt. Die
Existenz zu testen ist billig und präzise; darauf zu verzichten, um sich auf einen Fehlerbehandler zu
stützen, tauscht eine saubere Antwort gegen eine trübe. Prüfen Sie zuerst.
Die zwei richtigen Antworten
Dir — der eingebaute Einzeiler. Ohne Platzhalter testet Dir schlicht einen Pfad und liefert den
Dateinamen, wenn er da ist, oder "", wenn nicht:
If Dir("C:\Reports\March.xlsx") <> "" Then ' "" bedeutet nicht gefunden
Kurz, keine Verweise, kein Objekt. Seine einzige Bürde ist der gemeinsame Cursor (nächster Abschnitt).
FileSystemObject.FileExists — der zustandslose Standard. Ein echtes Prädikat, das True/False
liefert und keinen globalen Zustand berührt:
Dim fso As Object: Set fso = CreateObject("Scripting.FileSystemObject")
If fso.FileExists("C:\Reports\March.xlsx") Then ...
Es liest sich wie das, was es tut, unterscheidet Dateien von Ordnern und — der Grund, warum es der sicherere
Standard ist — Sie können es überall aufrufen, auch mitten in einer Dir-Schleife,
ohne Nebenwirkungen. Verwenden Sie späte Bindung (CreateObject), damit es auf jedem Rechner läuft; siehe
VBA FileSystemObject.
Die Falle, die dieses Thema bestimmt: Dir-Prüfung in einer Dir-Schleife
Das ist der Grund, warum die beiden Prüfungen nicht austauschbar sind, und es ist dasselbe Verhalten des
versteckten Cursors, das Dir bestimmt. Dir hält eine modulweite Suchposition.
Dir(path) aufzurufen, um eine Datei zu testen, startet eine neue Suche — und löscht die Position, auf
die sich Ihre Aufzählungsschleife verließ:
name = Dir(folder & "*.xlsx")
Do While name <> ""
If Dir(folder & "done\" & name) = "" Then ' <- setzt den Cursor zurueck - Schleife bricht
Process folder & name
End If
name = Dir() ' rueckt jetzt die "done\"-Suche vor, nicht die *.xlsx-Suche
Loop
Das innere Dir setzt die Maschine neu auf, sodass die Schleife Dateien überspringt, sie wiederholt oder
nie endet. Die Regel ist absolut: Rufen Sie innerhalb einer Dir-Schleife niemals Dir auf, um eine
andere Datei zu prüfen — verwenden Sie stattdessen fso.FileExists. Es hat keinen Cursor zum Stören.
Diese eine Wechselwirkung ist der Grund, warum „welche Existenzprüfung?“ keine Geschmackssache ist: Ist
irgendwo im Aufrufpfad eine Dir-Aufzählung, lautet die Antwort FileExists.
Wie Dir Ordner und abschließende Backslashes falsch behandelt
Sogar außerhalb einer Schleife hat Dir zwei Grenzfälle, die FileExists vermeidet, weil Dir gebaut
wurde, um Namen abzugleichen, nicht um ein sauberes Ja/Nein über eine Datei zu beantworten:
- Ein Ordnerpfad.
Dir("C:\Reports")kann"Reports"liefern — den Ordner treffend —, sodass ein „Datei existiert“-Test für etwas besteht, das ein Verzeichnis ist.fso.FileExists("C:\Reports")liefert korrektFalse(es ist ein Ordner), undfso.FolderExistsbeantwortet die Ordnerfrage separat. - Ein abschließender Backslash.
Dir("C:\Reports\")testet die Existenz des Ordners, nicht einer Datei darin. Leicht zu treffen, wenn Sie Pfade durch Verkettung bauen und ein verirrtes Trennzeichen stehen lassen.
Standardmäßig überspringt Dir auch versteckte und System-Dateien, sodass eine Datei, die wirklich
existiert, aber versteckt ist, als fehlend gemeldet wird, sofern Sie nicht das Attribut vbHidden
übergeben. FileExists hat keine dieser Mehrdeutigkeiten — es beantwortet „gibt es eine Datei an genau
diesem Pfad“, Punkt.
Prüfen, dann öffnen: das kleine Wettrennen, die praktische Abhilfe
Ein ehrlicher Vorbehalt: Zwischen dem Augenblick, in dem Sie prüfen, und dem Augenblick, in dem Sie öffnen, könnte ein anderer Prozess die Datei löschen oder sperren. In der Praxis ist diese Lücke zwischen „Zeitpunkt der Prüfung“ und „Zeitpunkt der Nutzung“ winzig und spielt selten eine Rolle — doch das korrekte Muster ist nicht, zwischen der Prüfung und der Fehlerabsicherung zu wählen, es ist, beide zu verwenden:
If Not fso.FileExists(path) Then
MsgBox "File not found: " & path ' der erwartete, haeufige Fall - eine saubere Meldung
Exit Sub
End If
On Error GoTo OpenFailed ' der seltene Fall - gesperrt, beschaedigt, Berechtigungen
Set wb = Workbooks.Open(path)
Die Existenzprüfung behandelt den gewöhnlichen „es ist nicht da“-Fall mit einer klaren Meldung statt eines
Absturzes; der Fehlerbehandler fängt die wirklich außergewöhnlichen Fehlschläge ab,
die die Prüfung nicht vorhersagen kann. Das ist die robuste Gestalt für jedes
Workbooks.Open in einem automatisierten Job.
Verwandt: ist die Arbeitsmappe schon geöffnet?
Ein naher Verwandter von „existiert die Datei“ ist „ist sie bereits in Excel geöffnet“, und es ist eine
andere Frage mit einer anderen Antwort — die Workbooks-Auflistung nach Namen durchlaufend, ohne die
Festplatte anzufassen:
Function IsOpen(fileName As String) As Boolean
Dim wb As Workbook
On Error Resume Next
Set wb = Workbooks(fileName) ' nach Dateiname, z. B. "March.xlsx"
On Error GoTo 0
IsOpen = Not wb Is Nothing
End Function
Existenz betrifft die Festplatte; „schon geöffnet“ betrifft die im Speicher befindliche
Workbooks-Auflistung. Eine Datei zu öffnen, die bereits geöffnet ist, lädt sie nicht neu — Excel aktiviert
einfach die Kopie im Speicher —, sodass ein Stapel-Makro, das zweimal laufen könnte, dies vor dem Aufruf von
Workbooks.Open testen sollte.
Das ehrliche Fazit: welche Prüfung, wann
- Standardmäßig
fso.FileExists. Es ist zustandslos, liest sich klar, unterscheidet Datei von Ordner und — der entscheidende Punkt — ist die einzige sichere Prüfung, wenn irgendwo eineDir-Schleife im Spiel ist. - Verwenden Sie den
Dir-Einzeiler nur für einen schnellen, isolierten Test, bei dem keineDir-Aufzählung läuft und Sie null Einrichtung wollen. - Ersetzen Sie die Prüfung niemals durch ein bloßes Öffnen-und-Abfangen; es ist langsamer und verbirgt echte Fehler.
- Paaren Sie die Prüfung mit einer Fehlerabsicherung rund um das Öffnen — die Prüfung für den häufigen Fall, den Behandler für den seltenen.
Machen Sie das richtig, und der Dateiabsturz Nummer eins — ein 1004 auf einem Pfad, der nicht da ist — wird zu einer sauberen, einzeiligen Meldung, die Ihr unbeaufsichtigtes Makro protokollieren und hinter sich lassen kann.
Wie ExcelMaster hilft
Die Existenzprüfung sieht trivial aus, bis Sie auf die Teile stoßen, die es nicht sind — der Dir-Cursor,
den eine verirrte Prüfung zurücksetzt, der Ordnerpfad, den ein Dateitest fälschlich trifft, das Wettrennen,
das bedeutet, dass Sie dennoch eine Fehlerabsicherung brauchen. All das für jede Datei richtig hinzubekommen,
die ein Stapel-Makro anfasst, ist eine Menge sorgfältiger Klempnerei.
ExcelMaster erledigt das.
Beschreiben Sie den Job — „für jeden erwarteten Bericht, wenn die Datei da ist, importiere sie, sonst
protokolliere sie als fehlend und mach weiter“ — und es schreibt fso.FileExists-Prüfungen, die Ihre
Ordnerschleife nie stören, paart jedes Workbooks.Open
mit einem Fehlerbehandler und testet, ob eine Arbeitsmappe bereits geöffnet ist,
bevor es sie erneut öffnet. Sie beschreiben das Ergebnis; es macht die Prüfungen korrekt und
nebenwirkungsfrei.
Häufig gestellte Fragen
Wie prüfe ich in VBA, ob eine Datei existiert?
Zwei gute Wege. Der eingebaute Einzeiler ist If Dir("C:\path\file.xlsx") <> "" Then — Dir liefert den
Namen, wenn die Datei existiert, und "", wenn nicht. Der klarere, zustandslose Weg ist
CreateObject("Scripting.FileSystemObject").FileExists(path), der True/False liefert und überall
aufgerufen werden kann. Bevorzugen Sie FileExists und testen Sie niemals mit Dir innerhalb einer
Dir-Schleife.
Warum bricht meine Dir-Dateiprüfung meine Dir-Schleife?
Weil Dir einen einzigen versteckten Such-Cursor hält. Dir(otherPath) aufzurufen, um eine Datei zu
testen, startet eine neue Suche und löscht die Position, von der Ihre Aufzählungsschleife abhängt, sodass
die Schleife dann Dateien überspringt, sie wiederholt oder endlos läuft. Verwenden Sie innerhalb einer
Dir-Schleife fso.FileExists, um andere Dateien zu prüfen — es hat keinen gemeinsamen Zustand.
Sollte ich zum Prüfen der Existenz einer Datei Dir oder FileSystemObject verwenden?
Verwenden Sie FileSystemObject.FileExists als Ihren Standard — es ist zustandslos, unterscheidet Dateien
von Ordnern und ist sicher innerhalb einer Dir-Schleife aufzurufen. Verwenden Sie den Dir-Einzeiler nur
für eine schnelle, isolierte Prüfung, bei der keine Dir-Aufzählung läuft und Sie keine Einrichtung wollen.
Siehe VBA FileSystemObject.
Gibt Dir für einen Ordner True zurück?
Es kann. Dir("C:\Reports") kann "Reports" liefern und den Ordner treffen, sodass ein naiver „Datei
existiert“-Test für ein Verzeichnis besteht. Und Dir("C:\Reports\") mit einem abschließenden Backslash
testet den Ordner, nicht eine Datei darin. FileSystemObject.FileExists vermeidet beides, indem es strikt
über eine Datei antwortet, mit FolderExists für die Ordnerfrage.
Wie prüfe ich in VBA, ob eine Arbeitsmappe bereits geöffnet ist?
Das ist eine andere Frage — es geht um Speicher, nicht um Festplatte. Durchlaufen Sie die
Workbooks-Auflistung nach Dateiname: Set wb = Workbooks("March.xlsx") innerhalb eines
On Error Resume Next-Blocks, dann testen Sie Not wb Is Nothing. Eine bereits geöffnete Datei zu öffnen,
lädt sie nicht neu, sodass ein Makro, das zweimal laufen könnte, dies vor dem Aufruf von
Workbooks.Open prüfen sollte.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 21.08.2026.
Verwandte Anleitungen: VBA Dir · VBA FileSystemObject · VBA Open Workbook · VBA On Error · VBA Close Workbook
