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.