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

VBA Dir in Excel — Dateien in einem Ordner durchlaufen und der zustandsbehaftete Iterator, der Sie stolpern lässt

|

VBA Dir in Excel — Dateien in einem Ordner durchlaufen und der zustandsbehaftete Iterator, der Sie stolpern lässt

TL;DRDir ist keine gewöhnliche Funktion. Der erste Aufruf übergibt einen Pfad und erhält den ersten passenden Dateinamen; jeder spätere Aufruf übergibt nichts und erhält den nächsten Namen, bis er "" liefert. Die Schleife sieht also so aus — und Sie dürfen Dir darin niemals erneut aufrufen:

Sub ListWorkbooks()
    Dim folder As String, name As String
    folder = "C:\Reports\"
    name = Dir(folder & "*.xlsx")      ' erster Aufruf: die Suche starten
    Do While name <> ""
        Debug.Print folder & name      ' Dir liefert nur den NAMEN - den Ordner voranstellen
        name = Dir()                   ' kein Argument: der NAECHSTE Treffer
    Loop
End Sub

In dem Moment, in dem Ihr Makro viele Dateien verarbeiten muss — zwölf Regionaldateien konsolidieren, jede CSV in einem Ablageordner importieren — greifen Sie zu Dir. Es ist die eingebaute Funktion, die keine Verweise und keine Einrichtung braucht. Doch sie verbirgt ein Design, über das fast jeder stolpert: Dir merkt sich, wo es war, global, und eine zweite Suche löscht dieses Gedächtnis still. Verstehen Sie diese eine Tatsache, und jeder „es hat die Hälfte meiner Dateien übersprungen“-Bug verschwindet.

Was Sie lernen

  • Das mentale Modell — Dir ist ein zustandsbehafteter Iterator, als Funktion verkleidet
  • Die eine Regel, über die alle stolpern — rufen Sie Dir niemals erneut mitten in einer Dir-Schleife auf
  • Warum Dir nur den Dateinamen liefert und Sie den Ordner selbst voranstellen müssen
  • Den Platzhalter (*.xlsx) und wie Dir mit „kein Treffer“ umgeht ("", kein Fehler)
  • Warum Dir nicht in Unterordner absteigen kann — und was Sie stattdessen verwenden
  • Warum Sie die Namen erst in ein Array sammeln und dann die Dateien öffnen/verschieben/löschen sollten

Das mentale Modell: Dir ist ein Iterator, kein Nachschlagen

Die meisten Funktionen geben bei gleicher Eingabe jedes Mal dieselbe Antwort. Dir nicht. Es hält einen einzigen, versteckten, modulweiten Cursor in genau eine Ordnersuche:

  • Dir("C:\Reports\*.xlsx") — das Argument startet eine neue Suche und liefert den ersten Treffer.
  • Dir() — ohne Argument rückt dieselbe Suche vor und liefert den nächsten Treffer.
  • Wenn nichts mehr übrig ist, liefert Dir() eine leere Zeichenfolge "".

Stellen Sie es sich als Cursor vor, den Sie einmal setzen und dann Schritt für Schritt vorrücken. Die Do While name <> ""-Schleife oben ist die kanonische Form: mit dem Pfad setzen, dann am Ende jedes Durchgangs das argumentlose Dir() aufrufen. Das ist das ganze Muster, und es ist die Form, die Sie sich einprägen sollten.

Die Regel, über die alle stolpern: Rufen Sie Dir nicht in einer Dir-Schleife auf

Weil es nur einen versteckten Cursor gibt, startet jeder Dir-Aufruf mit einem Argument irgendwo innerhalb der Schleife eine brandneue Suche und wirft Ihren Platz weg. Das ist der Dir-Bug Nummer eins, und er ist tückisch, weil er völlig vernünftig aussieht:

name = Dir(folder & "*.xlsx")
Do While name <> ""
    If Dir(folder & "flag.txt") <> "" Then   ' <- KATASTROPHE: setzt den Cursor zurueck
        Process folder & name
    End If
    name = Dir()          ' setzt jetzt die "flag.txt"-Suche fort, nicht die *.xlsx-Suche
Loop

Das innere Dir(folder & "flag.txt") startet die Maschine mit einem anderen Muster neu. Wenn die Schleife dann Dir() aufruft, rückt sie diese Suche vor — Sie verarbeiten also die falschen Dateien, überspringen die meisten Ihrer .xlsx-Dateien oder drehen sich endlos. Die Regel ist absolut: Innerhalb einer Dir-Schleife ist das einzige Dir, das Sie aufrufen dürfen, das argumentlose Dir(). Müssen Sie mitten in der Schleife auf eine andere Datei prüfen, verwenden Sie stattdessen FileSystemObject.FileExists — es hat keinen gemeinsamen Cursor, der beschädigt werden könnte.

Dir liefert den Namen, nicht den Pfad

Dir gibt den bloßen Dateinamen zurück — March.xlsx, nicht C:\Reports\March.xlsx. Dies zu vergessen ist der zweithäufigste Fehler, denn das Nächste, was Sie tun, ist meist, die Datei zu öffnen:

Set wb = Workbooks.Open(name)             ' Fehler 1004 - "March.xlsx" ist kein vollstaendiger Pfad
Set wb = Workbooks.Open(folder & name)    ' korrekt - den vollstaendigen Pfad neu aufbauen

Halten Sie die Ordner-Zeichenfolge stets getrennt und hängen Sie sie wieder an, wenn Sie den vollständigen Pfad brauchen. Deshalb endet die Ordnervariable auch auf einen Backslash ("C:\Reports\") — damit folder & name ein gültiger Pfad ohne fehlendes Trennzeichen ist.

Der Platzhalter und der Fall „kein Treffer“

Das Argument des ersten Dir ist ein Pfad plus ein Muster. * steht für eine beliebige Folge von Zeichen, ? für ein einzelnes Zeichen:

  • Dir("C:\Reports\*.xlsx") — jede .xlsx im Ordner
  • Dir("C:\Reports\Q?-2026.xlsx")Q1-2026.xlsx, Q2-2026.xlsx, …
  • Dir("C:\Reports\March.xlsx") — kein Platzhalter, also prüft es nur eine Datei: liefert "March.xlsx", wenn sie existiert, "", wenn nicht (das ist der Einzeiler hinter dem Prüfen, ob eine Datei existiert)

Passt nichts, liefert Dir "" — es löst keinen Fehler aus. Deshalb behandelt Do While name <> "" sowohl „gar keine Dateien“ als auch „das Ende erreicht“ mit demselben Test.

Eine Falle: Standardmäßig passt Dir auch auf Ordner und überspringt versteckte/System-Dateien. Passt ein Unterordner zufällig auf Ihr Muster, bekommen Sie auch dessen Namen zurück. Wenn es darauf ankommt, übergeben Sie explizit das Attribut vbNormal oder verifizieren Sie mit dem FileSystemObject.

Dir kann nicht rekursieren — und den Ordner mitten in der Schleife zu verändern beschädigt sie

Zwei harte Grenzen drängen Sie für alles jenseits einer flachen Liste von Dir weg:

Es ist nicht rekursiv. Dir durchläuft einen Ordner. Es gibt kein Argument, um in Unterordner abzusteigen, und Sie können zwei Dir-Schleifen nicht verschachteln (ein Cursor, wie gesagt). Um einen Baum zu verarbeiten — C:\Reports\2026\Q1\..., Q2\... — brauchen Sie das FileSystemObject, dessen SubFolders-Auflistung für Rekursion gebaut ist.

Den Ordner während der Schleife zu ändern zerstört die Aufzählung. Wenn Sie Dateien während einer Dir-Schleife mit Kill löschen, umbenennen, verschieben oder auch nur Open und SaveAs, verändern Sie genau den Ordner, den der versteckte Cursor gerade durchläuft. Namen werden übersprungen oder wiederholt. Die Abhilfe ist ein Zwei-Pass-Muster — erst sammeln, dann handeln:

Dim names() As String, n As Long
ReDim names(1 To 1000)
Dim f As String: f = Dir(folder & "*.xlsx")
Do While f <> ""                 ' Durchlauf 1: nur die Namen sammeln
    n = n + 1: names(n) = f
    f = Dir()
Loop
Dim i As Long
For i = 1 To n                   ' Durchlauf 2: jetzt ist Oeffnen / Verschieben / Loeschen sicher
    Process folder & names(i)
Next i

Sind die Namen einmal in einem Array, ist der fragile Cursor erledigt, und Sie können mit den Dateien tun, was Sie wollen.

Das ehrliche Fazit: wofür Dir eigentlich da ist

Dir ist das richtige Werkzeug für genau eine Aufgabe — eine schnelle, flache Schleife über die Dateien in einem einzelnen Ordner, ohne Verweise hinzuzufügen und ohne ein Objekt zu erzeugen. Für „führe dieses Makro über jede .xlsx in diesem Ordner aus“ ist es kürzer und schneller als alles andere. Beschränken Sie es darauf und befolgen Sie vier Regeln:

  • Einmal setzen, mit Dir() vorrücken — das einzige Dir innerhalb der Schleife nimmt kein Argument.
  • Den Ordner voranstellenDir liefert Namen; folder & name baut den Pfad neu auf.
  • Zwei Durchläufe, wenn Sie verändern — Namen in ein Array sammeln, dann öffnen/verschieben/löschen.
  • Greifen Sie zum FileSystemObject, sobald Sie Unterordner, Dateigröße oder -datum oder eine zweite Existenzprüfung mitten in der Schleife brauchen.

In dem Augenblick, in dem Sie ein zweites Dir in derselben Schleife haben wollen, ist das das Signal, dass Sie Dir entwachsen sind — kein Bug zum Flicken, sondern ein Werkzeug zum Wechseln.

Wie ExcelMaster hilft

Eine Dateischleife richtig hinzubekommen heißt, Dir einmal zu setzen, mit dem argumentlosen Aufruf vorzurücken, vollständige Pfade neu aufzubauen und zu wissen, wann die Ordnermutation ein Zwei-Pass-Array erzwingt — überraschend viel Zeremonie für „einfach die Dateien in einem Ordner durchlaufen“, und ein einziger verirrter Dir-Aufruf bricht still das Ganze.

ExcelMaster schreibt die Schleife für Sie. Beschreiben Sie den Job — „öffne jede Arbeitsmappe in diesem Ordner, zieh die Summen heraus und schließe jede“ — und es erzeugt eine korrekte Dir-Schleife (oder einen FileSystemObject-Durchlauf, wenn Sie Unterordner brauchen), mit der Ordnerverkettung, dem Zwei-Pass-Array, wenn Dateien verschoben werden, und einem passenden wb.Close in jeder Iteration. Sie beschreiben das Ergebnis; es verwaltet das Gedächtnis des Iterators, sodass es Sie nie beißt.

Häufig gestellte Fragen

Wie durchlaufe ich mit VBA alle Dateien in einem Ordner?

Setzen Sie Dir mit einem Pfad und Platzhalter, dann rücken Sie mit dem argumentlosen Dir() vor: name = Dir("C:\Reports\*.xlsx"), dann Do While name <> "" … name = Dir() … Loop. Dir liefert nacheinander jeden Dateinamen und "", wenn der Ordner erschöpft ist. Denken Sie daran, dass Dir nur den Namen liefert, verwenden Sie also folder & name, wenn Sie den vollständigen Pfad brauchen.

Warum überspringt meine VBA-Dir-Schleife Dateien oder läuft endlos?

Fast immer, weil Sie Dir mit einem Argument innerhalb der Schleife aufgerufen haben. Dir hält einen einzigen versteckten Cursor, und jedes Dir(somePath) startet eine neue Suche, die Ihren Platz auslöscht — das Dir() am Schleifenende rückt dann die falsche Suche vor. Rufen Sie innerhalb einer Dir-Schleife nur das argumentlose Dir() auf. Um mitten in der Schleife auf eine andere Datei zu prüfen, verwenden Sie FileSystemObject.FileExists, das keinen gemeinsamen Zustand hat.

Durchsucht VBA Dir Unterordner?

Nein. Dir durchläuft einen einzelnen Ordner und hat keine Rekursion, und Sie können zwei Dir-Schleifen nicht verschachteln, weil es nur einen Cursor gibt. Um einen Ordnerbaum zu durchlaufen, verwenden Sie das FileSystemObject und iterieren dessen SubFolders-Auflistung rekursiv.

Wie erhalte ich aus VBA Dir den vollständigen Pfad?

Dir liefert den bloßen Dateinamen (March.xlsx), nicht den vollständigen Pfad. Halten Sie den Ordner in einer eigenen Variablen (die auf einen Backslash endet) und verketten Sie: folder & name ergibt C:\Reports\March.xlsx. Den bloßen Namen an Workbooks.Open zu übergeben, löst Laufzeitfehler 1004 aus.

Sollte ich Dir oder FileSystemObject zum Durchlaufen von Dateien verwenden?

Verwenden Sie Dir für eine schnelle, flache Schleife über einen Ordner ohne Einrichtung. Wechseln Sie zum FileSystemObject, wenn Sie in Unterordner absteigen, die Größe oder das Änderungsdatum jeder Datei lesen oder während der Schleife auf andere Dateien prüfen müssen — überall dort, wo Dirs einziger versteckter Cursor Ihnen im Weg steht.

Getestet in

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

Verwandte Anleitungen: VBA FileSystemObject · VBA Check If File Exists · VBA Open Workbook · VBA Close Workbook · VBA For Loop