TL;DR — Das
FileSystemObject(FSO) ist ein Objektmodell für die Festplatte: einmal erzeugen, dannFilesundSubFoldersdurchlaufen und Eigenschaften wieSizeundDateLastModifiedlesen. Erzeugen Sie es mit später Bindung, damit es auf jedem Rechner läuft — kein Verweis zum Anhaken:
Sub ListWithSizes()
Dim fso As Object, folder As Object, file As Object
Set fso = CreateObject("Scripting.FileSystemObject") ' spaete Bindung - kein Verweis noetig
Set folder = fso.GetFolder("C:\Reports")
For Each file In folder.Files ' eine echte Auflistung, kein Cursor
Debug.Print file.Name, file.Size, file.DateLastModified
Next file
End Sub
Wo Dir ein knapper eingebauter Befehl mit einem versteckten Cursor ist, behandelt das
FileSystemObject das Dateisystem so, wie der Rest von VBA eine Arbeitsmappe behandelt — als Objekte mit
Eigenschaften, die Sie durchlaufen und inspizieren können. Dieses Upgrade ist es, was Sie kaufen:
Unterordner, Dateimetadaten und sichere verschachtelte Schleifen. Der Preis ist ein Objekt zum Erzeugen und
eine Entscheidung — wie Sie es binden —, die still bestimmt, ob Ihr Makro auf dem Rechner eines anderen
läuft.
Was Sie lernen
- Das mentale Modell — das Dateisystem als Ordner und Dateien, jedes ein Objekt mit Eigenschaften
- Die eine Entscheidung, über die alle stolpern —
CreateObject(späte Bindung) gegenüberDim … As New(frühe Bindung) - Wie Sie in Unterordner absteigen, das, was
Dirschlicht nicht kann - Metadaten lesen —
Size,DateLastModified,Name,ParentFolder FileExistsundFolderExists— der saubere Weg, vor dem Handeln zu prüfen- Warum FSO Textdateien öffnet, aber niemals eine Excel-Arbeitsmappe
Das mentale Modell: die Festplatte als Objektmodell
Überall sonst in VBA arbeiten Sie mit Objekten — ein Workbook hat Sheets, ein Worksheet hat einen
Range. Das FileSystemObject erweitert genau diese Idee auf die Festplatte:
- ein
fsogibt IhnenGetFolder(path)undGetFile(path) - ein
Folderhat eine.Files-Auflistung, eine.SubFolders-Auflistung und einen.Name - eine
Filehat.Name,.Size,.DateLastModified,.ParentFolder,.Path
Statt also einen Cursor zu setzen und ihn Schritt für Schritt vorzurücken, schreiben Sie die Schleife, die
Sie ohnehin kennen — For Each file In folder.Files — und greifen in jedes Objekt hinein für das, was Sie
brauchen. Es gibt keinen versteckten Zustand, sodass Sie Schleifen frei verschachteln können (Dateien in
Unterordnern in Unterordnern), ohne dass sich etwas unter Ihnen zurücksetzt.
Die eine Entscheidung, über die alle stolpern: CreateObject gegenüber New
Es gibt zwei Wege, ein fso zu erzeugen, und der Unterschied entscheidet, ob Ihr Makro es übersteht, an
einen Kollegen gemailt zu werden. Das ist der FileSystemObject-Bug Nummer eins.
Frühe Bindung — sauber anzusehen, aber fragil:
Dim fso As New FileSystemObject ' braucht Extras > Verweise > Microsoft Scripting Runtime
Das kompiliert nur, wenn dieser Rechner den Verweis Microsoft Scripting Runtime angehakt hat.
Schreiben Sie es auf Ihrem PC, wo das Kästchen angehakt ist, senden Sie die Datei an jemanden, bei dem es
das nicht ist, und es scheitert bei der Kompilierung mit User-defined type not defined (Benutzerdefinierter
Typ nicht definiert) — bevor eine einzige Zeile läuft. Sie bekommen dafür IntelliSense, doch Sie haben die
Arbeitsmappe an die Einstellungen eines einzigen Rechners gebunden.
Späte Bindung — der portable Standard:
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject") ' loest zur Laufzeit auf, kein Verweis
CreateObject schlägt die Komponente zur Laufzeit namentlich nach, sodass kein Verweis nötig ist und
die Arbeitsmappe überall läuft, wo Windows Scripting installiert ist (also überall). Sie verlieren
IntelliSense zur Kompilierzeit; Sie gewinnen ein Makro, das beim Verteilen einfach funktioniert. Für alles,
was Sie teilen, verwenden Sie späte Bindung und deklarieren Sie Ihre Variablen As Object. Diese eine
Wahl beseitigt die ganze Klasse von „läuft nur auf meinem Rechner“-Meldungen.
Unterordner: das, was Dir nicht kann
Der klarste Grund, Dir hinter sich zu lassen, ist ein Ordnerbaum. FSOs SubFolders-Auflistung plus ein
rekursives Sub durchläuft jede Tiefe, was Dirs einziger Cursor unmöglich macht:
Sub WalkTree(folderPath As String)
Dim fso As Object: Set fso = CreateObject("Scripting.FileSystemObject")
ProcessFolder fso.GetFolder(folderPath), fso
End Sub
Sub ProcessFolder(fld As Object, fso As Object)
Dim file As Object, sub_ As Object
For Each file In fld.Files
If LCase(fso.GetExtensionName(file.Name)) = "xlsx" Then Debug.Print file.Path
Next file
For Each sub_ In fld.SubFolders ' rekursiv - Dir kann sich so nicht verschachteln
ProcessFolder sub_, fso
Next sub_
End Sub
Jeder Folder trägt seine eigenen .Files und .SubFolders, sodass Verschachtelung und Rekursion sicher
sind — es gibt keinen gemeinsamen Cursor, der beschädigt werden könnte. Beachten Sie fso.GetExtensionName
und seine Geschwister (GetBaseName, BuildPath, GetParentFolderName) — zeichenkettenfreie Pfadhelfer,
die umständliches InStrRev-Zerschneiden ersetzen.
Metadaten lesen: Größe, Datum, Name
Der andere Grund, FSO zu wählen, ist, dass ein File-Objekt Dinge über sich selbst weiß, die Dir nie
preisgibt:
For Each file In folder.Files
If file.DateLastModified < Now - 30 Then ' aelter als 30 Tage
Debug.Print file.Name & " - " & Format(file.Size / 1024, "0") & " KB"
End If
Next file
Size, DateLastModified, DateCreated, Type, Attributes — alle nur eine Eigenschaft entfernt. „Jede
diese Woche geänderte Arbeitsmappe“ zu filtern oder „Temp-Dateien über 10 MB löschen“ ist mit FSO trivial
und mit Dir mühsam.
FileExists und FolderExists: prüfen, bevor Sie handeln
FSO gibt Ihnen zwei zustandslose Prädikate, die der sauberste Weg sind, auf eine Datei zu
prüfen — und, entscheidend, sie haben keinen versteckten Cursor,
sodass Sie sie im Gegensatz zu Dir überall aufrufen können, sogar innerhalb einer Dir-Schleife:
If fso.FileExists("C:\Reports\March.xlsx") Then ...
If fso.FolderExists("C:\Reports\2026") Then ...
FileExists und FolderExists sind verschieden — Dir verwischt die beiden —, sodass Sie genau sagen, was
Sie meinen, und nie versehentlich einen Ordner treffen, wo Sie eine Datei wollten.
Die Falle: FSO öffnet keine Arbeitsmappen
Hier ist die Verwechslung, die Menschen im Kreis herumschickt. Das FileSystemObject kann einfache
Textdateien erstellen, lesen und schreiben (CreateTextFile, OpenTextFile) — Logs, als Rohtext
behandelte CSVs, .ini-Dateien. Es kann CopyFile, MoveFile, DeleteFile. Was es nicht kann, ist
eine Excel-Arbeitsmappe öffnen:
Set wb = fso.OpenTextFile("C:\Reports\March.xlsx") ' FALSCH - liefert rohe XML-/Zip-Bytes, keine Arbeitsmappe
Set wb = Workbooks.Open("C:\Reports\March.xlsx") ' RICHTIG - eine Arbeitsmappe oeffnet Excel, nicht FSO
FSO findet und verwaltet Dateien; Workbooks.Open ist das, was eine Datei
in eine lebende Arbeitsmappe verwandelt, aus der Sie Zellen lesen können. Das idiomatische Stapel-Makro
verwendet beide: FSO (oder Dir), um den Ordner zu durchmustern, dann Workbooks.Open, um jedes Ergebnis
zu öffnen. Halten Sie die beiden Aufgaben in Ihrem Kopf getrennt, und das ganze Muster rastet ein.
Das ehrliche Fazit: wann FSO Dir schlägt
Dir gewinnt nur auf einer Achse — null Einrichtung für eine flache Schleife über einen einzelnen Ordner.
Das FileSystemObject gewinnt überall sonst, und die Entscheidung ist mechanisch:
- Unterordner nötig? FSO —
Dirkann nicht rekursieren. - Größe, Datum oder Typ nötig? FSO —
Dirliefert nur einen Namen. - Kopieren, verschieben, löschen oder Textdateien schreiben? FSO — es ist ein vollständiger Werkzeugkasten.
- Eine schnelle Ein-Ordner-
*.xlsx-Schleife ohne Zusätze?Dirist in Ordnung und kürzer. - Wie auch immer Sie durchmustern, öffnen Sie Arbeitsmappen mit
Workbooks.Open— niemals mit FSO.
Und was auch immer Sie verteilen, erzeugen Sie das Objekt mit CreateObject, nicht mit New, damit es
auf jedem Rechner läuft und nicht nur auf Ihrem.
Wie ExcelMaster hilft
Das FileSystemObject ist gerade deshalb mächtig, weil es ein Objektmodell ist — doch das heißt, daran zu
denken, es für Portabilität spät zu binden, SubFolders für einen Baum zu rekursieren, die richtige
Metadaten-Eigenschaft zu lesen und jede Datei an Workbooks.Open zu übergeben, statt zu erwarten, dass FSO
sie öffnet. Kleine Entscheidungen, von denen jede still bestimmt, ob das Makro auf dem PC der nächsten Person
läuft.
ExcelMaster trifft diese
Entscheidungen für Sie. Beschreiben Sie die Aufgabe — „geh jeden Unterordner unter Reports durch, finde
diesen Monat geänderte Arbeitsmappen und kopiere ihre Summen in eine Übersicht“ — und es schreibt einen spät
gebundenen FSO-Durchlauf mit der rekursiven SubFolders-Schleife, dem DateLastModified-Filter und einem
passenden Workbooks.Open / Close für jeden
Treffer. Sie beschreiben das Ergebnis; es verdrahtet das Objektmodell beim ersten Mal korrekt.
Häufig gestellte Fragen
Was ist das FileSystemObject in VBA?
Das FileSystemObject (FSO) ist eine Windows-Scripting-Komponente, die das Dateisystem als Objektmodell
offenlegt — Folder- und File-Objekte mit Auflistungen (Files, SubFolders) und Eigenschaften (Name,
Size, DateLastModified). Sie erzeugen es mit CreateObject("Scripting.FileSystemObject") und verwenden
es, um Textdateien zu durchmustern, zu kopieren, zu verschieben, zu löschen und zu lesen. Anders als
Dir hat es keinen versteckten Cursor, sodass Schleifen sicher verschachteln.
CreateObject oder Dim As New FileSystemObject — was sollte ich verwenden?
Verwenden Sie Set fso = CreateObject("Scripting.FileSystemObject") (späte Bindung). Es braucht keinen
Verweis und läuft auf jedem Rechner. Dim fso As New FileSystemObject (frühe Bindung) verlangt, dass der
Verweis Microsoft Scripting Runtime unter Extras ▸ Verweise angehakt ist, sodass eine Arbeitsmappe, die
auf Ihrem PC kompiliert, bei einem Kollegen mit User-defined type not defined scheitert. Späte Bindung ist
der portable Standard für alles, was Sie verteilen.
Wie durchlaufe ich mit dem FileSystemObject Unterordner?
Holen Sie den Ordner mit fso.GetFolder(path), durchlaufen Sie seine .SubFolders-Auflistung und rufen Sie
dieselbe Routine rekursiv für jeden Unterordner auf. Weil jeder Folder seine eigenen .Files und
.SubFolders hat, ist Rekursion sicher — es gibt keinen gemeinsamen Zustand zum Zurücksetzen. Genau das
kann Dir nicht.
Kann das FileSystemObject eine Excel-Arbeitsmappe öffnen?
Nein. FSO öffnet und schreibt Textdateien (OpenTextFile, CreateTextFile) und kann jede Datei
kopieren, verschieben oder löschen, aber es kann keine Arbeitsmappe öffnen. Verwenden Sie es, um Dateien zu
finden, und öffnen Sie dann jede mit Workbooks.Open. fso.OpenTextFile
auf einer .xlsx liefert rohe Bytes, keine Arbeitsmappe.
Wie erhalte ich in VBA die Größe oder das Änderungsdatum einer Datei?
Verwenden Sie das FileSystemObject: fso.GetFile(path).Size liefert Bytes und .DateLastModified liefert
den Zeitstempel. Innerhalb einer Ordnerschleife lesen Sie file.Size und file.DateLastModified direkt an
jedem File-Objekt. Dir kann Ihnen weder das eine noch das andere geben — es liefert nur den Namen —, was
einer der Hauptgründe ist, FSO für alles jenseits einer flachen Auflistung zu bevorzugen.
Getestet in
Getestet in: Excel 365 (Windows 11), VBA 7.1 — zuletzt geprüft am 21.08.2026.
Verwandte Anleitungen: VBA Dir · VBA Check If File Exists · VBA Open Workbook · VBA Save Workbook · VBA On Error
