Die Aufgabenstellung ist schon etwas umfangreicher, da wäre mein Vorschlag die ganzen Punkte sortiert in eingene Subs/Funktionen zu organisieren. Aktuell blickt ja kein Mensch mehr durch!
Grundsätzlich sollte der Einsprungspunkt kurz und knackig sein, sowas wie das hier:
Option Explicit
Public Sub Example()
Dim strSelectedPath As String
strSelectedPath = "C:\PP\Standort\Abteilung\Bereich\Bilder" '< bei dir kommt das durch den Auswahl-Dialog herein
Dim colFiles As VBA.Collection
If SearchFiles(strSelectedPath, colFiles) = 0 Then
Call MsgBox("Keine Treffer.", vbExclamation)
Exit Sub
End If
Dim vntFullFilename As Variant
For Each vntFullFilename In colFiles
Call HandleFile(CStr(vntFullFilename))
Next
End Sub
- SearchFiles() >> Führt die (rekursive) Suche nach den gewünschten Dateien durch und liefert das Ergebnis.
- CheckFile() >> Enthält die Logik, welche entscheidet ob eine Datei ein Treffer ist, oder nicht.
- HandleFile() >> Führt die notwendigen Aktion aus - z.B. Hintergrundbild setzen.
>> Wenn du aus irgendwelchen Ausdrücken störende Zeichen entfernen musst, dann sollte man diese Logik in eine Funktion z.B. NormalizeName() - oder ähnlich - packen. Der übergibst du den Unrat und sie spuckt als Ergebnis den Wert mit ersetzen Zeichen aus, mit dem man dann weiter arbeitet.
Private Sub HandleFile(FullFilename As String)
' TODO:
If InStr(FullFilename, "thumbs.dp") = 0 Then
'...
End If
End Sub
Private Function CheckFile(FullFilename As String) As Boolean
' TODO: implement filter logic
CheckFile = Right$(FullFilename, 4) = ".png"
End Function
Private Function SearchFiles(Path As String, FoundFiles As VBA.Collection) As Long
If FoundFiles Is Nothing Then
Set FoundFiles = New VBA.Collection
End If
Dim strPath As String
Dim strFilename As String
strPath = IIf(Right$(Path, 1) <> "\", Path & "\", Path)
On Error GoTo ErrHandler
strFilename = Dir$(strPath, vbDirectory)
On Error GoTo 0
Dim fileAttr As VbFileAttribute
Dim colDirectories As VBA.Collection
Set colDirectories = New VBA.Collection
Do While strFilename <> vbNullString
On Error GoTo ErrHandler
fileAttr = -1
fileAttr = GetAttr(strPath & strFilename)
On Error GoTo 0
If (fileAttr And vbDirectory) = vbDirectory And Not (fileAttr And vbSystem) = vbSystem Then
If strFilename = "." Or strFilename = ".." Then
GoTo Continue_Do
End If
Call colDirectories.Add(strPath & strFilename)
ElseIf (fileAttr And vbNormal) = vbNormal And Not (fileAttr And vbSystem) = vbSystem Then
If CheckFile(strPath & strFilename) Then
Call FoundFiles.Add(strPath & strFilename)
End If
End If
Continue_Do:
strFilename = Dir$()
Loop
DoEvents
Dim vntDirectory As Variant
For Each vntDirectory In colDirectories
Call SearchFiles(CStr(vntDirectory), FoundFiles)
Next
SearchFiles = FoundFiles.Count
Exit Function
ErrHandler:
'TODO: implement proper logging
Debug.Print Format$(Now, "yyyy-mm-dd"); Tab(12); "'"; Err.Source; "'"; _
Tab(2); "Path: '"; strPath & strFilename; "'"; _
Tab(4); "=> '"; Err.Description; "'"
Resume Next
End Function
Auf diese Weise kannst du später auch das ganze recht unkompliziert erweitern - z.B. wenn solch eine Suche länger dauern sollte, ein Provider, welcher in Excel den Fortschritt in der Statusleiste aktualisiert.
Grüße
PS: Die angedeutete if in HandleFile() gehört eigentlich auch in CheckFile(), denn das ist Teil der Validierung, also der Fragestellung, ob die gerade betrachtete Datei ein Treffer ist, oder nicht.
Die if steht dort also nur, damit du einen Orientierungspunkt zu deinem Code hast. Da gehört also eigentlich das hinein was in der if drin steht.
|