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

VBA FileSystemObject in Excel — CreateObject gegenüber Verweis, Unterordner und warum es keine Arbeitsmappen öffnet

|

VBA FileSystemObject in Excel — CreateObject gegenüber Verweis, Unterordner und warum es keine Arbeitsmappen öffnet

TL;DR — Das FileSystemObject (FSO) ist ein Objektmodell für die Festplatte: einmal erzeugen, dann Files und SubFolders durchlaufen und Eigenschaften wie Size und DateLastModified lesen. 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über Dim … As New (frühe Bindung)
  • Wie Sie in Unterordner absteigen, das, was Dir schlicht nicht kann
  • Metadaten lesen — Size, DateLastModified, Name, ParentFolder
  • FileExists und FolderExists — 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 fso gibt Ihnen GetFolder(path) und GetFile(path)
  • ein Folder hat eine .Files-Auflistung, eine .SubFolders-Auflistung und einen .Name
  • eine File hat .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 — Dir kann nicht rekursieren.
  • Größe, Datum oder Typ nötig? FSO — Dir liefert 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? Dir ist 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