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

VBA prüfen, ob eine Datei existiert — Dir gegenüber FileSystemObject.FileExists (und die Falle in einer Dir-Schleife)

|

VBA prüfen, ob eine Datei existiert — Dir gegenüber FileSystemObject.FileExists (und die Falle in einer Dir-Schleife)

TL;DR — Zwei korrekte Wege, einer je Werkzeugkasten. Dir ist der Einzeiler, wenn Sie nirgends in der Nähe einer Dir-Schleife sind; FileSystemObject.FileExists ist 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 — Dir und FileSystemObject.FileExists
  • Die Falle, die dieses Thema bestimmt — die Dir-Prüfung setzt eine Dir-Schleife zurück
  • Wie Dir einen Ordnerpfad oder einen abschließenden Backslash falsch behandelt
  • FileExists gegenüber FolderExists — 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 korrekt False (es ist ein Ordner), und fso.FolderExists beantwortet 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 eine Dir-Schleife im Spiel ist.
  • Verwenden Sie den Dir-Einzeiler nur für einen schnellen, isolierten Test, bei dem keine Dir-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") <> "" ThenDir 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