Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1868to1872
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

Unterverzeichnisse mit durchsuchen?

Unterverzeichnisse mit durchsuchen?
14.02.2022 15:02:05
Patrick
Hallo zusammen,
ich habe ein Makro, das Dateien von einem Quellverzeichnis in verschiedene Zielverzeichnisse kopiert. Im Quellverzeichnis wird dafür nach bestimmten Dateien gesucht und bei einem Match, wird die Datei kopiert. Bisher funktioniert das aber nur für das Quellverzeichnis selbst, nicht für Unterverzeichnisse.

Sub Dateien_Kopieren()
'Kopiert Dateien für Projekt A
'Variablendeklaration
Const quellVerzeichnis   As String = "C:\Zeichnungen_Quelle\"
Const verzeichnisPMA     As String = "C:\Zeichnungen_Test_PMA\"
Const verzeichnisRockson As String = "C:\Zeichnungen_Test_Rockson\"
Const verzeichnisBesecke As String = "C:\Zeichnungen_Test_Besecke\"
Const verzeichnisWSAM    As String = "C:\Zeichnungen_Test_WSAM\"
'Empfänger
Dim empfaenger1             As String
Dim empfaenger2             As String
empfaenger1 = Cells(4, 5)
empfaenger2 = Cells(4, 6)
'Dateiname
Dim dateinameQuelle As String
Dim dateinameZiel   As String
'Zeichnungsnummer
Dim zeichnungNummer As Range
'Abgleich der Zeichnungsnummer mit dem Dateinamen
Dim fso As Object, oFile As Object
Set fso = CreateObject("Scripting.FileSystemObject")
For Each oFile In fso.GetFolder(quellVerzeichnis).Files
For Each zeichnungNummer In Range("A4:A" & Cells(Rows.Count, "A").End(xlUp).Row)
If zeichnungNummer  "" Then
If InStr(oFile.Name, zeichnungNummer) Then
dateinameQuelle = quellVerzeichnis & oFile.Name
'Datei ins zielVerzeichnis1 kopieren
Select Case LCase(empfaenger1)
Case "pma"
dateinameZiel = verzeichnisPMA & oFile.Name
Case "rockson"
dateinameZiel = verzeichnisRockson & oFile.Name
Case "besecke"
dateinameZiel = verzeichnisBesecke & oFile.Name
Case "wsam"
dateinameZiel = verzeichnisWSAM & oFile.Name
End Select
If Not DateiExistiert(dateinameZiel) Then
FileCopy dateinameQuelle, dateinameZiel
End If
'Datei ins zielVerzeichnis1 kopieren
Select Case LCase(empfaenger2)
Case "pma"
dateinameZiel = verzeichnisPMA & oFile.Name
Case "rockson"
dateinameZiel = verzeichnisRockson & oFile.Name
Case "besecke"
dateinameZiel = verzeichnisBesecke & oFile.Name
Case "wsam"
dateinameZiel = verzeichnisWSAM & oFile.Name
End Select
If Not DateiExistiert(dateinameZiel) Then
FileCopy dateinameQuelle, dateinameZiel
End If
End If
End If
empfaenger1 = zeichnungNummer.Offset(1, 4)
empfaenger2 = zeichnungNummer.Offset(1, 5)
Next zeichnungNummer
Next oFile
End Sub
Function DateiExistiert(Dateipfad As String) As Boolean
'Zu prüfender String
Dim TestString As String
TestString = ""
On Error Resume Next
TestString = Dir(Dateipfad)
On Error GoTo 0
If TestString = "" Then
DateiExistiert = False
Else
DateiExistiert = True
End If
End Function
Kann mir jemand sagen wie ich meinen Code anpassen muss, damit auch Unterverzeichnisse mit durchsucht werden? Für ein wenig Unterstützung wäre ich sehr dankbar.
Viele Grüße
Patrick

20
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Unterverzeichnisse mit durchsuchen?
14.02.2022 16:14:32
Rudi
Hallo,
teste mal:

Sub Dateien_Kopieren()
'Kopiert Dateien für Projekt A
'Variablendeklaration
Const quellVerzeichnis   As String = "C:\Zeichnungen_Quelle\"
Const verzeichnisPMA     As String = "C:\Zeichnungen_Test_PMA\"
Const verzeichnisRockson As String = "C:\Zeichnungen_Test_Rockson\"
Const verzeichnisBesecke As String = "C:\Zeichnungen_Test_Besecke\"
Const verzeichnisWSAM    As String = "C:\Zeichnungen_Test_WSAM\"
'Empfänger
Dim empfaenger1          As String
Dim empfaenger2          As String
'Dateiname
Dim dateinameQuelle As String
Dim dateinameZiel   As String
Dim strFileName As String
'Zeichnungsnummer
Dim zeichnungNummer As Range
Dim vntOrdnerListe, vntOrdner
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("A4:A" & Cells(Rows.Count, "A").End(xlUp).Row)
empfaenger1 = zeichnungNummer.Offset(0, 4)
empfaenger2 = zeichnungNummer.Offset(0, 5)
strFileName = vbNullString
If zeichnungNummer  "" Then
For Each vntOrdner In vntOrdnerListe
strFileName = Dir(vntOrdner & "\*" & zeichnungNummer & "*", vbNormal)
If Len(strFileName) Then
dateinameQuelle = vntOrdner & "\" & strFileName
'Datei ins zielVerzeichnis1 kopieren
Select Case LCase(empfaenger1)
Case "pma"
dateinameZiel = verzeichnisPMA & strFileName
Case "rockson"
dateinameZiel = verzeichnisRockson & strFileName
Case "besecke"
dateinameZiel = verzeichnisBesecke & strFileName
Case "wsam"
dateinameZiel = verzeichnisWSAM & strFileName
End Select
If Not DateiExistiert(dateinameZiel) Then
FileCopy dateinameQuelle, dateinameZiel
End If
'Datei ins zielVerzeichnis1 kopieren
Select Case LCase(empfaenger2)
Case "pma"
dateinameZiel = verzeichnisPMA & strFileName
Case "rockson"
dateinameZiel = verzeichnisRockson & strFileName
Case "besecke"
dateinameZiel = verzeichnisBesecke & strFileName
Case "wsam"
dateinameZiel = verzeichnisWSAM & strFileName
End Select
If Not DateiExistiert(dateinameZiel) Then
FileCopy dateinameQuelle, dateinameZiel
End If
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
Gruß
Rudi
Anzeige
AW: Unterverzeichnisse mit durchsuchen?
14.02.2022 16:52:39
Patrick
Vielen Dank Rudi,
jetzt passiert gar nichts mehr. Ich habe noch meine Funktion ergänzt, die prüft ob eine Datei bereits vorhanden ist. So sieht mein vollständiger Code also jetzt aus.

Sub Dateien_Kopieren()
'Kopiert Dateien für Projekt A
'Variablendeklaration
Const quellVerzeichnis   As String = "C:\Zeichnungen_Quelle\"
Const verzeichnisPMA     As String = "C:\Zeichnungen_Test_PMA\"
Const verzeichnisRockson As String = "C:\Zeichnungen_Test_Rockson\"
Const verzeichnisBesecke As String = "C:\Zeichnungen_Test_Besecke\"
Const verzeichnisWSAM    As String = "C:\Zeichnungen_Test_WSAM\"
'Empfänger
Dim empfaenger1          As String
Dim empfaenger2          As String
'Dateiname
Dim dateinameQuelle As String
Dim dateinameZiel   As String
Dim strFileName As String
'Zeichnungsnummer
Dim zeichnungNummer As Range
Dim vntOrdnerListe, vntOrdner
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("A4:A" & Cells(Rows.Count, "A").End(xlUp).Row)
empfaenger1 = zeichnungNummer.Offset(0, 4)
empfaenger2 = zeichnungNummer.Offset(0, 5)
strFileName = vbNullString
If zeichnungNummer  "" Then
For Each vntOrdner In vntOrdnerListe
strFileName = Dir(vntOrdner & "\*" & zeichnungNummer & "*", vbNormal)
If Len(strFileName) Then
dateinameQuelle = vntOrdner & "\" & strFileName
'Datei ins zielVerzeichnis1 kopieren
Select Case LCase(empfaenger1)
Case "pma"
dateinameZiel = verzeichnisPMA & strFileName
Case "rockson"
dateinameZiel = verzeichnisRockson & strFileName
Case "besecke"
dateinameZiel = verzeichnisBesecke & strFileName
Case "wsam"
dateinameZiel = verzeichnisWSAM & strFileName
End Select
If Not DateiExistiert(dateinameZiel) Then
FileCopy dateinameQuelle, dateinameZiel
End If
'Datei ins zielVerzeichnis1 kopieren
Select Case LCase(empfaenger2)
Case "pma"
dateinameZiel = verzeichnisPMA & strFileName
Case "rockson"
dateinameZiel = verzeichnisRockson & strFileName
Case "besecke"
dateinameZiel = verzeichnisBesecke & strFileName
Case "wsam"
dateinameZiel = verzeichnisWSAM & strFileName
End Select
If Not DateiExistiert(dateinameZiel) Then
FileCopy dateinameQuelle, dateinameZiel
End If
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
Function DateiExistiert(Dateipfad As String) As Boolean
'Zu prüfender String
Dim TestString As String
TestString = ""
On Error Resume Next
TestString = Dir(Dateipfad)
On Error GoTo 0
If TestString = "" Then
DateiExistiert = False
Else
DateiExistiert = True
End If
End Function
Ich habe 3 Testdateien (PDF) im Verzeichnis C:\Zeichnungen_Quelle\Unterverzeichnis\ abgelegt. Sie heißen wie folgt:
Test_1954_01_Test.pdf
Test_3010_01_Test.pdf
Test_3310_01_Test.pdf
Meine Exceltabelle sieht wie folgt aus:
A4 1954_01.00 E4 PMA F4 Rockson
A5 3010_01.01 E5 WSAM F5 Besecke
A8 3310_01.00 E8 PMA F8 Rockson
Die Datei Test_1954_01_Test.pdf müsste jetzt also ins PMA und Rockson Verzeichnis kopiert werden. Die Test_3010_01_Test.pdf ins WSAM und Besecke Verzeichnis und die Test_3310_01_Test.pdf ins PMA und Rockson Verzeichnis.
Anzeige
AW: Unterverzeichnisse mit durchsuchen?
14.02.2022 17:09:31
Patrick
Hallo nochmal,
ich habe das Problem gefunden. Du vergleichst den Eintrag aus Spalte A 1:1 mit dem Dateinamen. Der Inhalt aus Spalte A ist aber nur ein Teilstring des Dateinamens. Könntest du das bitte noch einmal anpassen. Super wäre auch, wenn du eine Einschränkung auf den Dateityp pdf setzen könntest, denn es sollen nur PDFs kopiert werden.
Tausend Dank im Voraus!
AW: Unterverzeichnisse mit durchsuchen?
14.02.2022 18:23:11
Rudi
Hallo,
strFileName = Dir(vntOrdner & "\*" & zeichnungNummer & "*.pdf", vbNormal)
Es muss der Inhalt aus A genau so im Dateinamen vorkommen. Nur pdf werden berücksichtigt.
1954_01.00 kommt nicht in Test_1954_01_Test.pdf vor!!!!!
Gruß
Rudi
Anzeige
AW: Unterverzeichnisse mit durchsuchen?
14.02.2022 18:32:02
Patrick
Du hast vollkommen recht, da bin ich durcheinander gekommen. Sorry und danke für die Anpassung mit der Dateiendung.
Vielen vielen Dank für deinen Einsatz generell!
AW: Unterverzeichnisse mit durchsuchen?
15.02.2022 11:30:08
Patrick
Hallo nochmal,
einen Punkt hätte ich noch. Das wäre quasi das Sahnehäubchen, ich weiß allerdings nicht ob es so funktioniert wie ich es mir denke.
Manchmal wird bei den Zeichnungsnummern kein kompletter String vorgegeben wie 1954_01.00, sondern ein String mit Platzhaltern wie 1954_XX.XX als Beispiel. Jetzt klappt die Suche für diese Fälle natürlich nicht mehr, da der Dateiname diesen Aufbau ja nicht hat. Ist es irgendwie möglich die Platzhalter zu ersetzen, sprich jedes "X" durch die Wildcard für ein einzelnes Zeichen? Um diesen "neuen" Ausdruck müsste dann aber weiterhin eine "Like" Suche erfolgen.
Anzeige
AW: Unterverzeichnisse mit durchsuchen?
15.02.2022 15:03:20
Rudi
Hallo,
ersetze X durch ?.
strFileName = Dir(vntOrdner & "\*" & Replace(zeichnungNummer, "X", "?") & "*", vbNormal)
Gruß
Rudi
AW: Unterverzeichnisse mit durchsuchen?
16.02.2022 07:59:02
Patrick
Hallo Rudi,
vielen Dank, aber irgendwie werden damit nicht alle Dateien kopiert. Meine Codezeile sieht wie folgt aus:

strFileName = Dir(vntOrdner & "\*" & Replace(zeichnungNummer, "X", "?") & "*.pdf", vbNormal)
In Zelle A84 steht 1616_XX.XX als Inhalt. Das Makro müsste jetzt also alle Dateien wie 1616_01.20, 1616_10.40, 1616_33.12 etc. kopieren. Im Quellverzeichnis liegen ca. 70 Dateien, die solche Strings beinhalten. Diese werden aber nicht kopiert. Hier mal ein paar Beispieldateinamen, welche nicht kopiert werden.
13757_1616_40.00_REV.01 Crew Door Layout.pdf
13757_1616_30.00_REV.00 TENDER DOORS AFT LAYOUT
13757_1616_00.21_REV.00_COVER PLATES FOR TRANSPORT BUSHES; BATHING LADDER BUSHES
Hast du eine Idee woran es liegen könnte?
Anzeige
AW: Unterverzeichnisse mit durchsuchen?
16.02.2022 09:07:46
Patrick
Hallo nochmal,
ich habe eine Vermutung, bin mir aber nicht sicher ob ich damit recht habe. Kann folgendes das Problem sein? Mal angenommen ich habe 3 Dateien im Quellverzeichnis:
1616_10.01
1616_20.01
1616_30.01
Meine Zeichnungsnummer in Spalte A lautet nun 1616_XX.XX.
Kann es sein, dass er jetzt erkennt, dass die erste Zeile meinem Muster entspricht und diese ins Zielverzeichnis kopiert und anschließend aber denkt, dass die anderen beiden Dateien bereits im Zielverzeichnis liegen und deshalb nicht kopiert werden (weil der Aufbau ja wieder 1616_XX.XX ist)?
Anzeige
AW: Unterverzeichnisse mit durchsuchen?
16.02.2022 10:22:07
peterk
Hallo
Du musst das Ganze in eine Schleife packen. Ein Beispiel:

Sub Test()
Filename = Dir("C:\Temp\*.*xml")
While Filename  ""
Debug.Print Filename
Filename = Dir()
Wend
End Sub
Peter
AW: Unterverzeichnisse mit durchsuchen?
16.02.2022 10:26:00
Patrick
Hallo Peter,
vielen Dank für die Rückmeldung. Leider bin ich absoluter VBA Laie. Könntest du mir evtl. sagen wie ich das konkret in meinen Code einbauen muss? So sieht mein Code aus:

Sub DateienKopieren_1601()
'Zeichnungsverteilung im Projektordner 1601
'Quellverzeichnisse
Const quellVerzeichnis As String = "\\proj-srv.kroegerwerft.de\Projekte\1601\Technische_Unterlagen\Zeichnungen\Fertige Zeichnungen\"
'Zielverzeichnisse
Const verzeichnisPMA     As String = "C:\Zeichnungen_Test_PMA\"
Const verzeichnisRockson As String = "C:\Zeichnungen_Test_Rockson\"
Const verzeichnisBesecke As String = "C:\Zeichnungen_Test_Besecke\"
Const verzeichnisWSAM    As String = "C:\Zeichnungen_Test_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
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("A4:A" & Cells(Rows.Count, "A").End(xlUp).Row)
empfaenger1 = zeichnungNummer.Offset(0, 4)
empfaenger2 = zeichnungNummer.Offset(0, 5)
strFileName = vbNullString
If zeichnungNummer  "" Then
For Each vntOrdner In vntOrdnerListe
strFileName = Dir(vntOrdner & "\*" & Replace(zeichnungNummer, "X", "?") & "*.pdf", vbNormal)
If Len(strFileName) Then
dateinameQuelle = vntOrdner & "\" & strFileName
'Datei ins zielVerzeichnis1 kopieren
Select Case LCase(empfaenger1)
Case "pma"
dateinameZiel = verzeichnisPMA & strFileName
Case "rockson"
dateinameZiel = verzeichnisRockson & strFileName
Case "besecke"
dateinameZiel = verzeichnisBesecke & strFileName
Case "wsam"
dateinameZiel = verzeichnisWSAM & strFileName
End Select
If Not DateiExistiert(dateinameZiel) And Not DateiExistiert(dateinameArchiv) Then
FileCopy dateinameQuelle, dateinameZiel
End If
'Datei ins zielVerzeichnis2 kopieren
Select Case LCase(empfaenger2)
Case "pma"
dateinameZiel = verzeichnisPMA & strFileName
Case "rockson"
dateinameZiel = verzeichnisRockson & strFileName
Case "besecke"
dateinameZiel = verzeichnisBesecke & strFileName
Case "wsam"
dateinameZiel = verzeichnisWSAM & strFileName
End Select
If Not DateiExistiert(dateinameZiel) And Not DateiExistiert(dateinameArchiv) Then
FileCopy dateinameQuelle, dateinameZiel
End If
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
Function DateiExistiert(Dateipfad As String) As Boolean
'Zu prüfender String
Dim TestString As String
TestString = ""
On Error Resume Next
TestString = Dir(Dateipfad)
On Error GoTo 0
If TestString = "" Then
DateiExistiert = False
Else
DateiExistiert = True
End If
End Function

Anzeige
AW: Unterverzeichnisse mit durchsuchen?
16.02.2022 10:40:41
peterk
Hallo

strFileName = Dir(vntOrdner & "\*" & Replace(zeichnungNummer, "X", "?") & "*.pdf", vbNormal)
If Len(strFileName) Then
While strFileName  ""
dateinameQuelle = vntOrdner & "\" & strFileName
'Datei ins zielVerzeichnis1 kopieren
Select Case LCase(empfaenger1)
Case "pma"
dateinameZiel = verzeichnisPMA & strFileName
Case "rockson"
dateinameZiel = verzeichnisRockson & strFileName
Case "besecke"
dateinameZiel = verzeichnisBesecke & strFileName
Case "wsam"
dateinameZiel = verzeichnisWSAM & strFileName
End Select
If Not DateiExistiert(dateinameZiel) And Not DateiExistiert(dateinameArchiv) Then
FileCopy dateinameQuelle, dateinameZiel
End If
'Datei ins zielVerzeichnis2 kopieren
Select Case LCase(empfaenger2)
Case "pma"
dateinameZiel = verzeichnisPMA & strFileName
Case "rockson"
dateinameZiel = verzeichnisRockson & strFileName
Case "besecke"
dateinameZiel = verzeichnisBesecke & strFileName
Case "wsam"
dateinameZiel = verzeichnisWSAM & strFileName
End Select
If Not DateiExistiert(dateinameZiel) And Not DateiExistiert(dateinameArchiv) Then
FileCopy dateinameQuelle, dateinameZiel
End If
strFileName = Dir()
Wend
Exit For 'damit nicht weiter nach der Nummer gesucht wird

Anzeige
AW: Unterverzeichnisse mit durchsuchen?
16.02.2022 10:53:57
Patrick
Jetzt wird gar nichts mehr kopiert und es sieht wie eine Endlosschleife aus.

Sub DateienKopieren_1601()
'Zeichnungsverteilung im Projektordner 1601
'Quellverzeichnisse
Const quellVerzeichnis As String = "\\proj-srv.kroegerwerft.de\Projekte\1601\Technische_Unterlagen\Zeichnungen\Fertige Zeichnungen\"
'Zielverzeichnisse
Const verzeichnisPMA     As String = "C:\Zeichnungen_Test_PMA\"
Const verzeichnisRockson As String = "C:\Zeichnungen_Test_Rockson\"
Const verzeichnisBesecke As String = "C:\Zeichnungen_Test_Besecke\"
Const verzeichnisWSAM    As String = "C:\Zeichnungen_Test_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
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("A4:A" & Cells(Rows.Count, "A").End(xlUp).Row)
empfaenger1 = zeichnungNummer.Offset(0, 4)
empfaenger2 = zeichnungNummer.Offset(0, 5)
strFileName = vbNullString
If zeichnungNummer  "" Then
For Each vntOrdner In vntOrdnerListe
strFileName = Dir(vntOrdner & "\*" & Replace(zeichnungNummer, "X", "?") & "*.pdf", vbNormal)
If Len(strFileName) Then
While strFileName  ""
dateinameQuelle = vntOrdner & "\" & strFileName
'Datei ins zielVerzeichnis1 kopieren
Select Case LCase(empfaenger1)
Case "pma"
dateinameZiel = verzeichnisPMA & strFileName
Case "rockson"
dateinameZiel = verzeichnisRockson & strFileName
Case "besecke"
dateinameZiel = verzeichnisBesecke & strFileName
Case "wsam"
dateinameZiel = verzeichnisWSAM & strFileName
End Select
If Not DateiExistiert(dateinameZiel) And Not DateiExistiert(dateinameArchiv) Then
FileCopy dateinameQuelle, dateinameZiel
End If
'Datei ins zielVerzeichnis2 kopieren
Select Case LCase(empfaenger2)
Case "pma"
dateinameZiel = verzeichnisPMA & strFileName
Case "rockson"
dateinameZiel = verzeichnisRockson & strFileName
Case "besecke"
dateinameZiel = verzeichnisBesecke & strFileName
Case "wsam"
dateinameZiel = verzeichnisWSAM & strFileName
End Select
If Not DateiExistiert(dateinameZiel) And Not DateiExistiert(dateinameArchiv) Then
FileCopy dateinameQuelle, dateinameZiel
End If
strFileName = Dir()
Wend
Exit For 'damit nicht weiter nach der Nummer gesucht wird
End If
Next vntOrdner
End If
Next zeichnungNummer
End Sub

Anzeige
AW: Unterverzeichnisse mit durchsuchen?
16.02.2022 11:25:10
peterk
Hallo
Es sollte zumindest ein File kopiert werden ;-)
Endlos Schleife: Leider JA, da in der Sub DateiExistiert auch "Dir" verwendet wird ist meine schöne Schleife zum Tote verurteilt :-(
Ich melde mich wieder.
Peter
AW: Unterverzeichnisse mit durchsuchen?
16.02.2022 11:48:19
Patrick
Danke schon mal, Peter!
Ich habe noch ein anderes Problem, evtl. hast du da auch eine Idee. Ich möchte gerne nachdem eine Zeile abgearbeitet wurde ein Kennzeichen in Spalte W setzen, damit diese Datei beim nächsten Lauf ausgeschlossen wird.
Beispiel:
A4: 1616_00.00 und W4: leer
Beim ersten Durchlauf des Makros soll diese Datei ins Zielverzeichnis kopiert werden. Im Anschluss soll in Spalte W4 "ja" eingetragen werden. Das Makro müsste dann also zusätzlich immer prüfen, ob in Spalte W "ja" steht. Ist dies der Fall, soll die Datei beim nächsten Ausführen des Makros nicht kopiert werden.
AW: Unterverzeichnisse mit durchsuchen?
16.02.2022 14:08:08
peterk
Hallo
Probier mal (da ich Deine Ordnerstruktur nicht habe, konnte ich es nicht testen)

Sub DateienKopieren_1601()
'Zeichnungsverteilung im Projektordner 1601
'Quellverzeichnisse
Const quellVerzeichnis As String = "\\proj-srv.kroegerwerft.de\Projekte\1601\Technische_Unterlagen\Zeichnungen\Fertige Zeichnungen\"
'Zielverzeichnisse
Const verzeichnisPMA     As String = "C:\Zeichnungen_Test_PMA\"
Const verzeichnisRockson As String = "C:\Zeichnungen_Test_Rockson\"
Const verzeichnisBesecke As String = "C:\Zeichnungen_Test_Besecke\"
Const verzeichnisWSAM    As String = "C:\Zeichnungen_Test_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("A4:A" & Cells(Rows.Count, "A").End(xlUp).Row)
empfaenger1 = zeichnungNummer.Offset(0, 4)
empfaenger2 = zeichnungNummer.Offset(0, 5)
'Spalte "W" kontrollieren
If zeichnungNummer.Offset(0, 22) = "Ja" Then
zeichnungNummer = ""
End If
strFileName = vbNullString
If zeichnungNummer  "" Then
For Each vntOrdner In vntOrdnerListe
strFileName = Dir(vntOrdner & "\*" & Replace(zeichnungNummer, "X", "?") & "*.pdf", vbNormal)
If Len(strFileName) Then
alleDateienStr = ""
While strFileName  ""
'Dateinamen zwischnespeichern 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
Case "rockson"
dateinameZiel = verzeichnisRockson & strFileName
Case "besecke"
dateinameZiel = verzeichnisBesecke & strFileName
Case "wsam"
dateinameZiel = verzeichnisWSAM & strFileName
End Select
If Not DateiExistiert(dateinameZiel) And Not DateiExistiert(dateinameArchiv) Then
FileCopy dateinameQuelle, dateinameZiel
End If
'Datei ins zielVerzeichnis2 kopieren
Select Case LCase(empfaenger2)
Case "pma"
dateinameZiel = verzeichnisPMA & strFileName
Case "rockson"
dateinameZiel = verzeichnisRockson & strFileName
Case "besecke"
dateinameZiel = verzeichnisBesecke & strFileName
Case "wsam"
dateinameZiel = verzeichnisWSAM & strFileName
End Select
If Not DateiExistiert(dateinameZiel) And Not DateiExistiert(dateinameArchiv) Then
FileCopy dateinameQuelle, dateinameZiel
End If
'Spalte "W" markieren
zeichnungNummer.Offset(0, 22) = "Ja"
Next i
Exit For 'damit nicht weiter nach der Nummer gesucht wird
End If
Next vntOrdner
End If
Next zeichnungNummer
End Sub
Peter
AW: Unterverzeichnisse mit durchsuchen?
16.02.2022 14:31:30
Patrick
Tausend Dank schon mal, Peter!
Eine kleine Bitte hätte ich noch. Du schreibst jetzt Ja in Spalte W, wenn die Datei übertragen wurde. Du löscht aber auch gleichzeitig die Zeichnungsnummer in Spalte A. Diese müsste aber enthalten bleiben, alleine schon aus Übersichtsgründen. Könntest du die Prüfung so umbauen, dass einfach nur gegen Spalte W geprüft wird (sprich wenn Spalte W = "Ja", dann überspringe diese Zeile)?
Vielleicht hast du auch noch zu einer anderen Fragestellung eine Idee. Ich möchte aber nicht den Anschein erwecken, dass ich deinen Einsatz hier ausnutze. Wenn dir das zu viel ist, ist das kein Problem für mich. Eigentlich wäre das optimale Ergebnis für mich, dass Dateien grundsätzlich nur einmalig kopiert werden, es sei denn ihr Änderungsdatum verändert sich (sprich es existiert ein neueres Änderungsdatum). Hast du da evtl. eine Idee zu? Falls zusätzliche Verzeichnisse dafür benötigt werden (z.B. ein Archivverzeichnis), könnte ich diese natürlich anlegen.
AW: Unterverzeichnisse mit durchsuchen?
16.02.2022 15:27:32
Patrick
Hallo nochmal, das erste "Problem" habe ich jetzt selbst lösen können. Ich prüfe jetzt nur gegen Spalte W und lösche die Zeichnungsnummer in Spalte A nicht mehr. Das Schreiben von "Ja" findet nur statt, wenn auch wirklich eine Datei kopiert wurde. So ist es optimal für mich. Hier mein Code:

Sub DateienKopieren_1601()
'Zeichnungsverteilung im Projektordner 1601
'Quellverzeichnisse
Const quellVerzeichnis As String = "\\proj-srv.kroegerwerft.de\Projekte\1601\Technische_Unterlagen\Zeichnungen\Fertige Zeichnungen\"
'Zielverzeichnisse
Const verzeichnisPMA     As String = "C:\Zeichnungen_Test_PMA\"
Const verzeichnisRockson As String = "C:\Zeichnungen_Test_Rockson\"
Const verzeichnisBesecke As String = "C:\Zeichnungen_Test_Besecke\"
Const verzeichnisWSAM    As String = "C:\Zeichnungen_Test_WSAM\"
'Empfänger
Dim empfaenger1 As String
Dim empfaenger2 As String
'Dateiname
Dim dateinameQuelle As String
Dim dateinameZiel   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
For Each zeichnungNummer In Range("A4:A" & Cells(Rows.Count, "A").End(xlUp).Row)
empfaenger1 = zeichnungNummer.Offset(0, 4)
empfaenger2 = zeichnungNummer.Offset(0, 5)
strFileName = vbNullString
If zeichnungNummer.Offset(0, 22)  "Ja" 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
Case "rockson"
dateinameZiel = verzeichnisRockson & strFileName
Case "besecke"
dateinameZiel = verzeichnisBesecke & strFileName
Case "wsam"
dateinameZiel = verzeichnisWSAM & strFileName
End Select
If Not DateiExistiert(dateinameZiel) Then
FileCopy dateinameQuelle, dateinameZiel
zeichnungNummer.Offset(0, 22) = "Ja"
End If
'Datei ins zielVerzeichnis2 kopieren
Select Case LCase(empfaenger2)
Case "pma"
dateinameZiel = verzeichnisPMA & strFileName
Case "rockson"
dateinameZiel = verzeichnisRockson & strFileName
Case "besecke"
dateinameZiel = verzeichnisBesecke & strFileName
Case "wsam"
dateinameZiel = verzeichnisWSAM & strFileName
End Select
If Not DateiExistiert(dateinameZiel) Then
FileCopy dateinameQuelle, dateinameZiel
zeichnungNummer.Offset(0, 22) = "Ja"
End If
Next i
Exit For 'damit nicht weiter nach der Nummer gesucht wird
End If
Next vntOrdner
End If
Next zeichnungNummer
End Sub
Dann wäre nur noch das Sahnehäubchen mit dem Änderungsdatum offen...
AW: Unterverzeichnisse mit durchsuchen?
16.02.2022 16:22:21
peterk
Hallo
2. Frage:

If Not DateiExistiert(dateinameZiel) Then
FileCopy dateinameQuelle, dateinameZiel
zeichnungNummer.Offset(0, 22) = "Ja"
Else
If FileDateTime(dateinameQuelle) > FileDateTime(dateinameZiel) Then
FileCopy dateinameQuelle, dateinameZiel
zeichnungNummer.Offset(0, 22) = "Ja"
End If
End If
Peter
AW: Unterverzeichnisse mit durchsuchen?
16.02.2022 16:00:34
peterk
Hallo
1. Teil:

empfaenger1 = zeichnungNummer.Offset(0, 4)
empfaenger2 = zeichnungNummer.Offset(0, 5)
strFileName = vbNullString
'Spalte "W" kontrollieren
If (zeichnungNummer  "") And (zeichnungNummer.Offset(0, 22)  "Ja") Then
For Each vntOrdner In vntOrdnerListe
Peter

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige