Dateien aus Liste kopieren

JohnRambo

Cadet 2nd Year
Registriert
Okt. 2008
Beiträge
27
Hallo zusammen,

ich habe eine Excelliste mit Dateinamen von JPGs, die in unterschiedlichen Verzeichnissen liegen.
Ich bräuchte jetzt eine Möglichkeit oder Routine, die automatisch die Bilder anhand dieser Liste in einen definierten Ordner kopiert.
Es handelt sich um ca. 1000 Dateien, die auch Leerzeichen im Dateinamen beinhalten.
Könnte mir damit jemand helfen?
Danke im Voraus
 
tz und auch noch kostenlos... ;)

Normalerweise verlange ich dafür Geld...

Voraussetzungen:
MS Excel 2003 oder höher
Dateinamen incl. Verzeichnisse stehen in Spalte A
Tabellblatt mit den Daten ist ausgewählt
Pfadname abgeschlossen durch \ steht in Zelle D1 (zb.: C:\MEINEGEILENPORNOBILDCHEN\)

Ablauf:
ALT+F11 drücken
im Editor: Doppelklick auf die Tabelle mit den Daten
Code einfügen
Cursor in die Sub copyit bewegen
F5 dücken
Bei mir bedanken! ;)

Code:
Option Explicit
Sub copyit()
Dim i As Integer
  i = 1
  While Not IsEmpty(Cells(i, 1).Value)
    FileCopy Cells(i, 1), Cells(1, 4) & GetFilePart(Cells(i, 1))
    i = i + 1
  Wend
msgbox "Fäddich!"
End Sub

Function GetFilePart(file As String) As String
Dim i As Long
For i = Len(file) To 1 Step -1
    If Mid(file, i, 1) = "\" Then
        GetFilePart = Right(file, Len(file) - i)
        Exit Function
    End If
Next
End Function

Ich übernehme keine Haftung für etwaige Schäden an Gehirn, Speisen, Nachbars Katze oder deinen Daten.
PS.: Die Dateien werden kopiert.
 
Zuletzt bearbeitet:
Erstmal vielen Dank für die zügige Resonanz!

Natürlich besonders an CHaos :)

Leider habe ich nicht den Verzeichnispfad der Dateien. Also die Dateien liegen zwar alle auf gleicher Ordnerebene allerdings weiß ich nicht in welchen Ordnern.

also die Bilder liegen in sinngemäß folgendermaßen:
U:\....\Bilder\Irgend_ein_name1
U:\....\Bilder\Irgend_ein_name2
U:\....\Bilder\Irgend_ein_name3
etc.

und ich weiß nicht welches Bild in welchem Unterordner liegt, ich weiß nur dass sie verstreut in irgendwelchen davon liegen.

Oder hab ich nur falsch verstanden, dass man den Pfad braucht?

Die verlinkte Methode funktioniert scheinbar nicht. Möglicherweise wegen den Leerzeichen in den Dateinamen?
 
Den Pfad den du eingibst ist natürlich der ZIELPfad.

Der Quellpfad ist ja in Spalte A gegegeben. Dachte ich zumindest, wenn du natürlich nur den Dateinamen hast wird das Ganze noch einiges komplizierter...

Mache jetzt erstmal Mittag, dananch guck ich mal wie das hingebogen wird.
Ergänzung ()

Soar ey!

Kiss my ass! :P naja hoffentlich...

Also, bevor du das ausführst:
1) Die Daten werden weiterhin NUR kopiert!
2) In Spalte A stehen NUR die Namen der zu kopierenden Dateien.
3) In Zelle D1 steht der Zielordner in der Form C:\blahblah\
4) In Zelle D2 steht der Quellordner in der Form U:\...\Bilder\ Hier den tiefsten möglichen Ordner wählen, sonst dauert das ganze unnötig lange. Bsp: Die Bilder lagern in
U:\blah\Bilder1\
U:\blah\Bilder2\
usw.
Wäre der Ordner U:\blah\
5. In Spalte F werden die Dateinamen aus Spalte A ausgegeben, die nicht in den Ordner (bleiben wir beim Beispiel) U:\blah\ oder dessen Unterordner gefunden wurden.
6. Einfügen wie gewohnt, Cursor in Sub searchncopy und F5.
7. Je nachdem wie viele Dateien du in den Ordnern hast, kann das ganze ne ganze Weile dauern!!! Hatte nun wirklich keine Lust zeitoptimierten Code zu schreiben, weil es so auch gehen sollte. Wenn nicht melde dich.
8. Dauen drücken ;)

Code:
Option Explicit
Sub searchncopy()
Dim fs_source As Variant
Dim fs_source_nameonly As Collection
Dim tempstr As String
Dim k As Integer
Dim i As Integer
Dim j As Integer
Dim counter As Integer
Dim foundfile As Boolean

Set fs_source = Application.FileSearch

With fs_source
  .LookIn = Cells(2, 4).Value
  .SearchSubFolders = True
  .FileType = msoFileTypeAllFiles
  .Filename = "*"
  .Execute
  Set fs_source_nameonly = New Collection
  For i = 1 To fs_source.FoundFiles.Count
    fs_source_nameonly.Add GetFilePart(.FoundFiles(i))
  Next i
End With
i = 1
j = 1
While Not IsEmpty(Cells(i, 1).Value)
  counter = 0
  foundfile = False
  For k = 1 To fs_source_nameonly.Count
    If StrEqual(fs_source_nameonly(k), Cells(i, 1).Value) Then
      foundfile = True
      If counter = 0 Then
        FileCopy fs_source.FoundFiles(k), Cells(1, 4).Value & fs_source_nameonly(k)
        counter = counter + 1
      Else
        FileCopy fs_source.FoundFiles(k), Cells(1, 4).Value & Left(fs_source_nameonly(k), Len(fs_source_nameonly(k)) - 4) & "(" & counter & ")" & Right(fs_source_nameonly(k), 4)
        counter = counter + 1
      End If
    Else
'nix
    End If
  Next k
  If Not foundfile Then
    Cells(j, 6).Value = Cells(i, 1).Value
    j = j + 1
  End If
  i = i + 1
Wend
End Sub

Public Function GetFilePart(file As String) As String
Dim i As Long
For i = Len(file) To 1 Step -1
    If Mid(file, i, 1) = "\" Then
        GetFilePart = Right(file, Len(file) - i)
        Exit Function
    End If
Next
End Function

Public Function GetPfadPart(file As String) As String
Dim i As Long
For i = Len(file) To 1 Step -1
    If Mid(file, i, 1) = "\" Then
        GetPfadPart = Left(file, i)
        Exit Function
    End If
Next
End Function

Public Function StrEqual( _
    ByRef s1 As String, ByRef s2 As String, _
    Optional ByVal Compare As VbCompareMethod = vbBinaryCompare _
  ) As Boolean

  If LenB(s1) = LenB(s2) Then
    If Compare = vbBinaryCompare Then
      If LenB(s1) Then
        StrEqual = InStrB(1, s1, s2)
      Else
        StrEqual = True
      End If
    Else
      StrEqual = StrComp(s1, s2, Compare) = 0
    End If
  End If
End Function
 
Zuletzt bearbeitet:
Hat ca. ne Viertel Stunde gedauert, allerdings werden alle Dateinamen in die Spalte F geschrieben, obwohl die meisten Dateien definitiv in Unterordnern des in D2 angegebenen Pfades vorliegen.

Leider kann ich im Moment nicht weiterprobieren, aber trotzdem nochmal vielen Dank.

Falls Dir noch was einfällt würd ich mich natürlich sehr freuen.
 
Ok, ich habs natürlich getestet und bei mir funktioniert es.

Sind die Dateinamen wirklich korrekt? Also keine Leerzeichen am Anfang oder Ende, mit Endung oder ohne?

Joar ne Viertelstunde dauert das, weil ich einfach ganz blöd alle Dateien einlese. Ist vllt nicht das schlaueste aber es funktioniert. Am besten machst du mal nen Screenie von nem Ausschnitt der Tabelle, oder löscht nen Großteil und schickst mir das mal per Mail, dann könnte ich mir das anschauen.

Gehe davon aus, dass irgendwas mit denen Daten in der Tabelle nicht stimmt.
 
So endlich hats bei mir auch geklappt. Das Problem war, dass meine Dateien die Endung .JPG hatten und in der Liste stand .jpg

Danke für die Hilfe!!
 
Gern geschehen =)

Freut mich, dass ich helfen konnte.
 
Hallo CHaos,

habe gerade dein Script in der ersten Variante getestet und bin echt begeistert.
Kurz zur Erklärung: Wir haben bei uns 3D Daten mit dazugehörigen Zeichnungen.
Nun möchte ich die Zeichnungen aus unterschiedlichen Ordnern in einen Ordner kopieren.
Dazu habe ich eine Liste erstellt mit allen 3D Daten erstellt und die die Dateiendung auf das Zeichenformat geändert. Nun möchte ich die Liste mit deinem Script bearbeiten.
Das Problem ist, das in der Liste nun Dateien stehen die es tum Teil gar nicht gibt.
(Zeichnungen wurden nicht erstellt).

Wenn ich das Macro starte bricht es bei der erste Datei die es nicht gibt ab.
Kann mann (Du) das ändern, das es bis zum Ende der Liste durchläuft und die nicht gefundenen ignoriert?

vielen Dank im voraus

Ingo
 
Zurück
Oben