Anzeige
Archiv - Navigation
1900to1904
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Alle Unterordner durchsuchen

Alle Unterordner durchsuchen
12.10.2022 09:23:05
Patrick
Hallo zusammen,
ich habe folgenden Code:

Sub ZeichnungsverteilungJAG()
'Zeichnungsverteilung im Projektordner JAG
'Quellverzeichnisse
Const quellVerzeichnis As String = "\\proj-srv.kroegerwerft.de\Projekte\JAG\Technische_Unterlagen\Zeichnungen\Fertige Zeichnungen\"
'Zielverzeichnisse
Const verzeichnisPMA     As String = "\\kroegerwerft.de\pub\Teams\Zeichnungsverteilung\PMA\"
Const verzeichnisRockson As String = "\\kroegerwerft.de\pub\Teams\Zeichnungsverteilung\Rockson\"
Const verzeichnisBesecke As String = "\\kroegerwerft.de\pub\Teams\Zeichnungsverteilung\Besecke\"
Const verzeichnisWSAM    As String = "\\kroegerwerft.de\pub\Teams\Zeichnungsverteilung\WSAM\"
'Archivverzeichnis
Const verzeichnisPMA_Archiv     As String = "\\kroegerwerft.de\pub\Teams\Zeichnungsverteilung\Archiv\PMA\"
Const verzeichnisRockson_Archiv As String = "\\kroegerwerft.de\pub\Teams\Zeichnungsverteilung\Archiv\Rockson\"
Const verzeichnisBesecke_Archiv As String = "\\kroegerwerft.de\pub\Teams\Zeichnungsverteilung\Archiv\Besecke\"
Const verzeichnisWSAM_Archiv    As String = "\\kroegerwerft.de\pub\Teams\Zeichnungsverteilung\Archiv\WSAM\"
'Empfänger
Dim empfaenger1 As String
Dim empfaenger2 As String
'Dateiname
Dim dateinameQuelle As String
Dim dateinameZiel   As String
Dim dateinameArchiv As String
Dim strFileName     As String
'Zeichnungsnummer
Dim zeichnungNummer As Range
Dim vntOrdnerListe, vntOrdner
'Wildcard Zwischenspeicher
Dim i As Long
Dim alleDateienStr As String
Dim alleDateienVar As Variant
Call OrdnerListe(quellVerzeichnis, vntOrdnerListe)
'Abgleich der Zeichnungsnummer mit dem Dateinamen
Dim FSO As Object, oFile As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
For Each zeichnungNummer In Range("A5:A" & Cells(Rows.Count, "A").End(xlUp).Row)
empfaenger1 = zeichnungNummer.Offset(0, 7)
empfaenger2 = zeichnungNummer.Offset(0, 8)
strFileName = vbNullString
'Spalte "W" kontrollieren
If zeichnungNummer  "" Then
For Each vntOrdner In vntOrdnerListe
strFileName = Dir(vntOrdner & "\*" & Replace(zeichnungNummer, "X", "?") & "*.pdf", vbNormal)
If Len(strFileName) Then
alleDateienStr = ""
While strFileName  ""
'Dateinamen zwischenspeichern falls Wildcards verwendet werden
alleDateienStr = alleDateienStr & strFileName & "|"
strFileName = Dir()
Wend
alleDateienVar = Split(alleDateienStr, "|")
For i = LBound(alleDateienVar) To UBound(alleDateienVar) - 1
strFileName = alleDateienVar(i)
dateinameQuelle = vntOrdner & "\" & strFileName
'Datei ins zielVerzeichnis1 kopieren
Select Case LCase(empfaenger1)
Case "pma"
dateinameZiel = verzeichnisPMA & strFileName
dateinameArchiv = verzeichnisPMA_Archiv & strFileName
Case "rockson"
dateinameZiel = verzeichnisRockson & strFileName
dateinameArchiv = verzeichnisRockson_Archiv & strFileName
Case "besecke"
dateinameZiel = verzeichnisBesecke & strFileName
dateinameArchiv = verzeichnisBesecke_Archiv & strFileName
Case "wsam"
dateinameZiel = verzeichnisWSAM & strFileName
dateinameArchiv = verzeichnisWSAM_Archiv & strFileName
End Select
If Not DateiExistiert(dateinameZiel) And Not DateiExistiert(dateinameArchiv) Then
On Error Resume Next
FileCopy dateinameQuelle, dateinameZiel
End If
'Datei ins zielVerzeichnis2 kopieren
Select Case LCase(empfaenger2)
Case "pma"
dateinameZiel = verzeichnisPMA & strFileName
dateinameArchiv = verzeichnisPMA_Archiv & strFileName
Case "rockson"
dateinameZiel = verzeichnisRockson & strFileName
dateinameArchiv = verzeichnisRockson_Archiv & strFileName
Case "besecke"
dateinameZiel = verzeichnisBesecke & strFileName
dateinameArchiv = verzeichnisBesecke_Archiv & strFileName
Case "wsam"
dateinameZiel = verzeichnisWSAM & strFileName
dateinameArchiv = verzeichnisWSAM_Archiv & strFileName
End Select
If Not DateiExistiert(dateinameZiel) And Not DateiExistiert(dateinameArchiv) Then
On Error Resume Next
FileCopy dateinameQuelle, dateinameZiel
End If
Next i
Exit For 'damit nicht weiter nach der Nummer gesucht wird
End If
Next vntOrdner
End If
Next zeichnungNummer
End Sub
Sub OrdnerListe(strFolder As String, vntOrdnerListe)
Dim FSO As Object, oSuFo As Object
Dim oFolder As Object, oDictF As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = FSO.GetFolder(strFolder)
Set oDictF = CreateObject("Scripting.dictionary")
oDictF(strFolder) = 0
For Each oSuFo In oFolder.subfolders
oDictF(oSuFo.Path) = 0
Call prcSubFolders(oSuFo, oDictF)
Next oSuFo
vntOrdnerListe = oDictF.keys
End Sub
Sub prcSubFolders(oFolder, oDictF)
Dim oSubFolder As Object
For Each oSubFolder In oFolder.subfolders
oDictF(oFolder.Path) = 0
prcSubFolders oSubFolder, oDictF
Next
End Sub
Public Function DateiExistiert(strDatei As String)
Dim objFSO As Object
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists(strDatei) = True Then
DateiExistiert = True
Else
DateiExistiert = False
End If
Set objFSO = Nothing
End Function
Ziel ist es, PDF Dateien nach einer bestimmten Logik von einem Ordner in einen anderen zu kopieren. Eine Spalte in der Excel Datei dient als Steuerung dazu. Das Ganze funktioniert auch sehr gut, solange sich die zu kopierenden Dateien nur maximal eine Ebene unterhalb meines Quellverzeichnisses (\\proj-srv.kroegerwerft.de\Projekte\JAG\Technische_Unterlagen\Zeichnungen\Fertige Zeichnungen\) befinden. Liegen die Dateien noch weiter verschachtelt in Unterordnern, so werden diese Ordner scheinbar ignoriert bei der Suche.
Hier nochmal etwas genauer.
B:\Projekte\JAG\Technische_Unterlagen\Zeichnungen\Fertige Zeichnungen\HBA_6 funktioniert als Quellverzeichnis
B:\Projekte\JAG\Technische_Unterlagen\Zeichnungen\Fertige Zeichnungen\HBA_6\6100 Owner_Guest funktioniert nicht als Quellverzeichnis
Wie müsste mein Code angepasst werden, damit alle möglichen Unterordner durchsucht werden? Kann mir da jemand helfen, VBA ist leider nicht mein Steckenpferd.
Danke und viele Grüße
Patrick

8
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Alle Unterordner durchsuchen
12.10.2022 10:32:06
peterk
Hallo

Sub prcSubFolders(oFolder, oDictF)
Dim oSubFolder As Object
For Each oSubFolder In oFolder.subfolders
' oDictF(oFolder.Path) = 0  Ist Falsch!!!
oDictF(oSubFolder.Path) = 0
prcSubFolders oSubFolder, oDictF
Next
End Sub
Peter
AW: Alle Unterordner durchsuchen
12.10.2022 12:50:46
Patrick
Danke Peter, das sieht schon besser aus, aber irgendwie werden nicht alle Dateien gefunden. In der Excel Tabelle werden Platzhalter (X) für gewisse Zahlen verwenden. Wird das Muster 16XX_XX.XX angegeben, so soll nach allen möglichen Kombinationen in allen Ordnern gesucht werden. Ich sehe aber, dass nicht alle Dateien berücksichtigt werden. Ich weiß nicht woran es liegt, vielleicht bricht er intern bei einem Fehler ab?
Anzeige
AW: Alle Unterordner durchsuchen
12.10.2022 14:15:50
peterk
Hallo
2 Dinge sind mir aufgefallen:
* On Error sollte sparsam verwendet werden und nur dort wo es wirklich Sinn macht, daher im Nachgang auch wieder ausschalten

If Not DateiExistiert(dateinameZiel) And Not DateiExistiert(dateinameArchiv) Then
On Error Resume Next
FileCopy dateinameQuelle, dateinameZiel
On Error Goto 0
End If

Wenn die Datei in einem deiner Folder gefunden wurde suchst Du nicht mehr weiter

Exit For 'damit nicht weiter nach der Nummer gesucht wird
Da Du aber Wildcards verwendest kann eine ähnliche Datei in einem anderen Verzeichnis liegen, wird aber nicht mehr durchsucht
Beispiel: 1600_00.01 wird in einem deiner Verzeichnisse gefunden bricht die weiterer Suche ab, 1600_00.02 in einem tieferen Verzeichnis wird nicht mehr gefunden, da ja auch nicht gesucht wird.
Peter
Anzeige
AW: Alle Unterordner durchsuchen
13.10.2022 07:58:46
Patrick
Hallo Peter,
vielen Dank für die Rückmeldung. Punkt 1 (On Error) konnte ich natürlich leicht beheben, bei Punkt 2 weiß ich allerdings nicht wie ich das Problem lösen kann. Könntest du mich hierbei evtl. noch einmal unterstützen? Ich wäre dir sehr dankbar dafür.
Viele Grüße
Patrick
AW: Alle Unterordner durchsuchen
13.10.2022 09:41:47
peterk
Hallo
Lösch doch einfach die Zeile "Exit for" oder gibt es die selbe Datei in mehreren Unterverzeichnissen?
Peter
AW: Alle Unterordner durchsuchen
13.10.2022 11:00:35
Patrick
Hi Peter,
stimmt, das passt.
Eine Frage hätte ich noch. Weißt du wie ich "einbauen" könnte, dass bestimmte Ordner nicht berücksichtigt werden wie "alt" oder "Meeting"?
Viele Grüße
Patrick
Anzeige
AW: Alle Unterordner durchsuchen
13.10.2022 13:25:51
peterk
Hallo
So:

Sub OrdnerListe(strFolder As String, vntOrdnerListe)
Dim FSO As Object, oSuFo As Object
Dim oFolder As Object, oDictF As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
Set oFolder = FSO.GetFolder(strFolder)
Set oDictF = CreateObject("Scripting.dictionary")
oDictF(strFolder) = 0
For Each oSuFo In oFolder.subfolders
If (InStr(1, oSuFo.Path, "ALT", vbTextCompare) + InStr(1, oSuFo.Path, "MEETING", vbTextCompare)) = 0 Then
oDictF(oSuFo.Path) = 0
Call prcSubFolders(oSuFo, oDictF)
End If
Next oSuFo
vntOrdnerListe = oDictF.keys
End Sub
Sub prcSubFolders(oFolder, oDictF)
Dim oSubFolder As Object
For Each oSubFolder In oFolder.subfolders
If (InStr(1, oSubFolder.Path, "ALT", vbTextCompare) + InStr(1, oSubFolder.Path, "MEETING", vbTextCompare)) = 0 Then
oDictF(oSubFolder.Path) = 0
prcSubFolders oSubFolder, oDictF
End If
Next
End Sub
Aber Vorsicht: Wenn der Ordner z.B. "Zeichnungen_Alternativ" heisst, wird er auch nicht übernommen.
Peter
Anzeige
AW: Alle Unterordner durchsuchen
13.10.2022 13:28:05
Patrick
Alles klar, super. Vielen Dank für deine Mühe!

13 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige