Order und Unterordner auslesen

Das FileSystemObject bietet vielfältige Möglichkeiten, um von VBA aus mit dem Datei-System zu interagieren. So gibt es spezielle Methoden / Eigenschaften, um auf den Inhalt eines Ordners zuzugreifen. Kniffelig wird die Sache meist, wenn auch noch der Inhalt aller Unterordner mit erfasst warden soll. Hier hilft eine Technik namens Rekursion.

Hinter diesem etwas sperrigen Namen verbirgt sich ein ganz einfaches Konzept: eine Prozedur ruft sich selbst auf. Klingt erstmal einfach – ist es auch! Allerdings gibt es ein paar Fallstricke! Eine sich selbst aufrufende Prozedur würde erstmal zu einer Endlos-Schleife führen, die erst abbricht, wenn alle Ressourcen des Rechners aufgebraucht sind. Stellen wir uns eine einfache Prozedur vor, an die wir per Parameter einen Ordner das Datei-Systems übergeben und die alle darin enthaltenen Unter-Ordner auflistet. Das kann z. B. mit einer For-Each-Schleife gemacht werden, bei der alle SubFolder Elemente eine FSO Folder Objektes durchlaufen warden. Der Trick ist nun, innerhalb dieser Schleife die Prozedur erneut aufzurufen – nun allerdings für jeden Unterordner.

Hier ein einfaches Beispiel, das dies verdeutlicht soll:

Option Explicit

Private Sub test()
readFileSystem ("C:\Temp\")
End Sub

Private Sub readFileSystem(ByVal pFolder As String)
Dim oFSO As Object
Dim oFolder As Object

' create FSO
Set oFSO = CreateObject("Scripting.FileSystemObject")

' get start folder
Set oFolder = oFSO.getFolder(pFolder)

' list folder content
listFolderContent oFolder

' destroy FSO
Set oFolder = Nothing
Set oFSO = Nothing
End Sub

Private Sub listFolderContent(ByVal pFolder As Object)
Dim oFile As Object
Dim oFolder As Object

' go thru all sub folders
For Each oFolder In pFolder.SubFolders
Debug.Print oFolder.Path

' do the recursion to list sub folder content
listFolderContent oFolder
Next

' list all files in that directory
For Each oFile In pFolder.Files
Debug.Print oFile.Path
Next

' destroy all objects
Set pFolder = Nothing
Set oFile = Nothing
Set oFolder = Nothing
End Sub

Die Prozedur readFileSystem erstellt ein FSO Objekt und lädt den auszulesenden Ordner in ein Folder Objekt. Dieses wird dann an die Prozedur lsitFolderContent übergeben. Im Beispiel ist dies der Ordner C:\Temp\. Innerhalb von listFolderContent werden dann alle Unterordner in einer Schleife durchlaufen. Sagen wir, das erste Element in dieser Schleife ware C:\Temp\Unterordner1. Dann ruft die Prozedur sich selbst auf und übergibt als Parameter diesen Unterordner. Nehmen wir an, es gibt in diesem Verzeichnis keine weiteren Subfolder. Dann werden im Beispiel nur die enthaltenen Dateien aufgelistet und die Prozedur beendet sich.

Allerdings endet hier nur die Ausführung des zweiten Aufrufes und VBA macht mit der ersten Instanz des Prozeduraufrufes weiter. Hier wird dann nach C:\Temp\Unterordner1 nun das nächste Element – sagen wir C:\Temp\Unterordner2 abgearbeitet. Die Prozedur ruft sich erneut selbst auf und übergibt der neuen Prozedur-Instanz diesen Unterordner als Parameter. Dann werden alle Ordner hierunter aufgelsitet usw.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.