Kopieren von dateien

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: Kopieren von dateien
von: Alex K
Geschrieben am: 01.07.2015 14:31:53

Hallo,
ich habe einen Code mit dem ich Dateien anhand einer Liste Kopieren kann.
nun habe ich aber Daten bekommen die ab und an zu meinen Zeichnungsnummern (40400894) noch zusätze dranhaben (40400894_a-1)
Nun soll es so sein , dass ich in meiner Liste die nummer 40400894 stehen habe und dann aber die Datei 40400894_a-1.pdf benötige. ich habe schonmal hilfe bekommen und den Code auf meine Bedürfnisse angepasst ich bekomme Halt dann dauernd einen Fehler.

Sub Schaltfläche2_Klicken()
Dim strPfad1 As String, strPfad2 As String, sFile As String
Dim z As Range
strPfad1 = Range("F4").Value
strPfad2 = Range("F9").Value
Set z = ActiveSheet.Range("A2")
sFile = z.Text & "*" & ".pdf"
'Abbruch, wenn A2 schon leer ist:
If z.Value <> "" Then
    Do
        FileCopy strPfad1 & sFile, strPfad2 '###hier kommt der Fehler auf###
        Set z = z.Offset(1, 0)
    Loop Until z.Value = ""
End If
End Sub

Bild

Betrifft: AW: Kopieren von dateien
von: Michael
Geschrieben am: 01.07.2015 16:58:00
Hi Alex,
FileCopy unterstützt anscheinend keine Wildcards (* usw.), also bietet sich der Weg über die DOS-Shell an.
Übrigens brauchst Du Dich nicht zu wundern, wenn sich abgesehen von der Fehlermeldung nichts tut, denn Du durchläufst zwar den Range, weist den Wert aber nirgends mehr an sFile zu.
Probier das mal:

Sub Schaltfläche2_Klicken()
Dim strPfad1 As String, strPfad2 As String, sFile As String
Dim z As Range
strPfad1 = Range("F4").Value
strPfad2 = Range("F9").Value
Set z = ActiveSheet.Range("A2")
sFile = z.Text & "*" & ".pdf"
While z.Value <> ""
   If Shell("cmd.exe /C copy " & strPfad1 & sFile & " " & strPfad2) = 0 Then MsgBox "Fehler"
   
   ' FileCopy strPfad1 & sFile, strPfad2 '###hier kommt der Fehler auf###
   Set z = z.Offset(1, 0)
   sFile = z.Text & "*" & ".pdf"
Wend
End Sub

Mit einer While-Schleife spart man sich das überflüssige If...
Die Shell gibt irgendeine Prozeßnummer zurück, z.B. 2345, oder 0, falls ein Fehler aufgetreten ist.
Happy Exceling,
Michael
P.S.: Bin gerade selber mit einem Verzeichnis mit Leerzeichen drübergestolpert: die Shell trennt einzelne Parameter mit Leerzeichen, d.h., *wenn* Du Dateinamen bzw. Verzeichnisse mit Leerzeichen hast, mußt Du die einzelnen Parameter in "" setzen, etwa so:
If Shell("cmd.exe /C copy " & chr(34) & strPfad1 & sFile & chr(34) _
         & " " & chr(34) & strPfad2 & chr(34)) = 0 Then MsgBox "Fehler"


Bild

Betrifft: AW: Kopieren von dateien
von: Alex K
Geschrieben am: 02.07.2015 07:09:11
Hallo Michael,
ich habe es umgesetzt es Läuft zwar ohne Fehler durch jedoch wird nichts Kopiert bzw. nichts im Ziel Ordner strPfad2 eingefügt

Bild

Betrifft: AW: Kopieren von dateien
von: Michael
Geschrieben am: 02.07.2015 11:13:41
Hallo Alex,
das ist mir zunächst auch passiert, weil der Zielordner Leerzeichen enthielt. Hast Du die Zeile unten mit den chr(34) mal eingefügt? chr(34) ist das Anführungszeichen ("); im Prinzip kann man es in VBA ja auch notieren, indem man es "doppelt" schreibt, aber die Schreibweise erscheint mir so schlecht lesbar, daß ich lieber den Umweg mit 34ern nehme...
Was soll ich sagen? Bei mir hat's getan.
Nachfolgend das Selbe in Grün mit dem Scripting Host; der schreibt sich deutlich umständlicher, man kann aber nachvollziehen, was passiert (deshalb die msgbox, die Du dann rauskommentieren kannst).

Option Explicit
Sub Schaltfläche2_Klicken()
Dim myShell As Object, myExec As Object
Dim aufruf As String, ausgabe As Variant
Dim strPfad1 As String, strPfad2 As String, sFile As String
Dim z As Range, zeile&
strPfad1 = Range("F4").Value
strPfad2 = Range("F9").Value
Set z = Range("A2")
sFile = z.Text & "*" & ".pdf"
While z.Value <> ""
   aufruf = "cmd.exe /C copy " & Chr(34) & strPfad1 & sFile & Chr(34) _
         & " " & Chr(34) & strPfad2 & Chr(34)
   Set myShell = CreateObject("WScript.Shell")
   Set myExec = myShell.Exec(aufruf)
   ausgabe = myExec.StdOut.ReadAll ' ist ein langer Text mit Zeilenumbruch
   MsgBox ausgabe                  ' wie hier nachzuvollziehen ist
   ausgabe = Split(ausgabe, vbCrLf)
   zeile = UBound(ausgabe)         ' unterste Zeile
   aufruf = ausgabe(zeile - 1)     ' vorletzte Zeile
   If Mid(aufruf, 1, 1) = "0" Then MsgBox "Fehler"
   Set myShell = Nothing
   Set z = z.Offset(1, 0)
   sFile = z.Text & "*" & ".pdf"
Wend
End Sub
Übrigens: hast Du absolute Pfade verwendet? Also beginnend mit Laufwerksbuchstaben á la C:\Test\
Falls es an so was liegen sollte, kannst Du die WShell-Variante zum Fehlersuchen einsetzen und die andere, wenn Du ihn gefunden hast...
Hm, "Fehlercode" ist wahrscheinlich so eine Sache: ich nehme an, Werte ungleich 0 werden auch dann zurückgegeben, falls keine Datei gefunden wurde, weil der Befehl "an sich" erfolgreich ausgeführt wurde.
Also, viel Spaß beim Testen und happy exceling,
Michael

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Kopieren von dateien"