Dateien in Ordner und Unterordner durchlaufen und beispielsweise umbenennen.
Mit der folgenden Prozedur kann ein Datei-Ordner durchlaufen werden, um mit allen enthaltenen Dateien eine Aktion austzführen.
Optional mit Unterordnern oder einem Muster, mit dem der Dateiname matchen muss.
Public Function LoopFilesInFolder(strFolder As String, Optional bIncludeSubs As Boolean, Optional ByVal strFilePattern As String = "*") As Boolean
' Loop über alle Dateien in einem Ordner, optional mit Unterordner, um Aktion mit der Datei auszuführen
' - strFolder: Pfad des Ordners
' - bIncludeSubs: (optional) Mit Unterordner (-> rekursiver Aufruf)
' - strFilePattern: (optional) Nur Dateien, die dem Muster entsprechen, werden berücksichtigt
Dim objMainfolder As Folder
Dim objSubfolders As Folders
Dim objSubfolder As Folder
Dim objFile As File
' Fehler, wenn Ordner nicht existiert
If Not fso.FolderExists(strFolder) Then
err.Raise vbObjectError + 1, , "Pfad '" & strFolder & "' nicht gefunden."
End If
Set objMainfolder = fso.GetFolder(strFolder)
' Dateien in main folder durchlaufen
For Each objFile In objMainfolder.Files
If LCase(objFile.Name) Like LCase(strFilePattern) Then
If Not ProcessFile(objFile) Then
Exit Function
End If
End If
DoEvents
Next
' Subfolder durchlaufen
If bIncludeSubs Then
Set objSubfolders = objMainfolder.subfolders
For Each objSubfolder In objSubfolders
If Not LoopFilesInFolder(objSubfolder.Path, True, strFilePattern) Then
Exit Function
End If
Next
End If
LoopFilesInFolder = True
End Function
FileSystemObject
Vorraussetzung ist die Einbindung der Bibliothek „Microsoft Scripting Runtime“ unter den Verweisen.
Auf Modulebene wird dann ein FileSystemObject deklariert:
' Deklaration auf Modulebene und nicht in LoopFilesInFolder(..), sonst wird das Objekt bei jedem rekursiven Aufruf neu erzeugt Dim fso As New FileSystemObject
Zu Beginn wird der Fehler abgefangen, wenn der Ordnername nicht existiert.
Dabei soll die Fehlermeldung nicht von der Funktion selbst ausgeworfen werden sondern an die aufrufende Prozedur übergeben werden.
Im folgenden werden alle Dateien im Ordner durchlaufen.
Wenn strFilePattern nicht angegeben wird, dann wird die Variable auf „*“ gesetzt, so dass alle Dateien matchen.
Sonst muss der Ausdruck LCase(objFile.Name) Like LCase(strFilePattern) zutreffen.
Das LCase() wird verwendet, um sicherzustellen, dass der Like-Vergleich nicht Case-sensitiv ist. Dies wird i.d.R. mit der Option Compare Anweisung erreicht, aber auf diese Weise ist man davon unabhängig.
Dann wird ProcessFile(objFile) aufgerufen. In dieser Funktion kann dann die gewünschte Aktion mit der Datei ausgeführt werden. In diesem Beispiel das Umbenennen der Datei:
Public Function ProcessFile(objFile As File) As Boolean On Error GoTo ErrHandle If InStr(objFile.Name, "alt") > 0 Then objFile.Name = Replace(objFile.Name, "alt", "neu") End If ProcessFile = True Exit Function ErrHandle: MsgBox "Fehler bei Datei '" & objFile.Name & "':" & vbCrLf & vbCrLf & err.Description End Function
Wenn der Dateiname „alt“ enthält, dann wird „alt“ durch „neu“ ersetzt.
Wenn ein Fehler auftritt (z.B. wenn die umzubenennende Datei geöffnet ist), dann wird eine Fehlermeldung gezeigt. Dadurch, dass alle Prozeduren Funktionen sind, die nur bei Erfolg True zurückgeben, wird erreicht, dass der ganze Prozess abgebrochen wird.
Rekursiver Aufruf
Um zu erreichen, dass Ordner mit Unterordnern in beliebige Tiefe durchlaufen werden, muss die Prozedur rekursiv sich selbst aufrufen. Dazu werden die Unterordner des Ordners durchlaufen und wiederum an LoopFilesInFolder(..) mit den gleichen Parametern übergeben.