Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA: MoveFile - Datei behalten

Forumthread: VBA: MoveFile - Datei behalten

VBA: MoveFile - Datei behalten
12.12.2018 23:31:47
Alex
Hallo zusammen,
ich bin gerade dabei in VBA ein Skript zu erstellen, mit dessen Hilfe ich meine Festplatte nach bestimmten Dateien durchsuchen kann. Diese sollen mittels MoveFile in einen speziellen Zielordner verschoben werden.
Es kann jedoch passieren, dass eine Datei mehrfach in verschiedenen Ordnern bzw. Unterordner existiert. Ich möchte die Dateien aber nicht schlicht überschreiben, sondern möchte die Gelegenheit haben, diese manuell zu überprüfen.
Ich suche daher eine Möglichkeit, die Dateien - sofern vorhanden - im Quellordner umzubenennen, und zwar mit Hilfe einer fortlaufenden Nummer.
Folgendes funktionierendes Skript habe ich bisher erstellt (sobald aber eine Datei im Zielordner existiert, erscheint der bzw. mittels 'On Error Resume Next' wird die Datei übersprungen.
Über Hilfestellung und Tipps würde ich mich freuen ...
Public FSO As New FileSystemObject
Sub Test1()
Dim Ordner As Folder
Dim Datei As File
Const Startordner = "C:\ZZZ_Startordner"
Const Zielordner = "C:\ZZZ_Zielordner"
Set Ordner = FSO.GetFolder(Startordner)
For Each Ordner In FSO.GetFolder(Startordner).SubFolders
For Each Datei In Ordner.Files
Quellordner = Ordner & "\"
Speicherdatum = FileDateTime(Datei)
Jahr = Mid(Speicherdatum, 7, 4)
Monat = Mid(Speicherdatum, 4, 2)
Tag = Left(Speicherdatum, 2)
Dateityp = FSO.GetExtensionName(Datei)
ZielordnerNeu = Zielordner & "\" & Dateityp & "\" & Jahr & "\" & Monat & "\" & Tag & _
If Dir(Zielordner, vbDirectory) = "" Then
MkDir (Zielordner)
End If
If Dir(Zielordner & "\" & Dateityp & "\", vbDirectory) = "" Then
MkDir (Zielordner & "\" & Dateityp & "\")
End If
If Dir(Zielordner & "\" & Dateityp & "\" & Jahr & "\", vbDirectory) = "" Then
MkDir (Zielordner & "\" & Dateityp & "\" & Jahr & "\")
End If
If Dir(Zielordner & "\" & Dateityp & "\" & Jahr & "\" & "\" & Monat & "\",  _
vbDirectory) = "" Then
MkDir (Zielordner & "\" & Dateityp & "\" & Jahr & "\" & Monat & "\")
End If
If Dir(Zielordner & "\" & Dateityp & "\" & Jahr & "\" & "\" & Monat & "\" & Tag & "\ _
", vbDirectory) = "" Then
MkDir (Zielordner & "\" & Dateityp & "\" & Jahr & "\" & Monat & "\" & "\" & Tag & "\ _
")
End If
'On Error Resume Next
If Dateityp = "docx" Then FSO.MoveFile Quellordner & Datei.Name, ZielordnerNeu &  _
Datei.Name
Next Datei
Next Ordner
End Sub

Anzeige

2
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA: MoveFile - Datei behalten
13.12.2018 08:25:43
Daniel
du kennst doch die DIR-Funktion (zumindest verwendest du sie in deinem Code)
mit der kannst du doch prüfen, ob eine Datei ein einen Ordner vorhanden ist und wenn ja, mit NAME alterName AS neuerName umbenennen.
Gruß Daniel
AW: VBA: MoveFile - Datei behalten
13.12.2018 14:14:46
Alex
Hallo Daniel,
die Dir-Funktion ist geläufig, ich komme aber nicht weiter, wenn die Funktion zurückmeldet, dass die Datei bereits vorhanden ist.
Mein Ansatz ist Folgender (inkl. entsprechender Schleife):
Dim i AS Integer
i = 1
If Dir(Quellordner & Datei.Name)  "" Then Name Quellordner & Datei.Name AS Quellordner & Datei & i.Name
Das Ganze eingebunden in eine Schleife (falls die Datei mehr als einmal in meinem Dateien-Wust vorhanden ist).
Hier erhalte ich jedoch schon im Vorfeld die Hinweismeldung "ungültiger Bezeichner".
Wenn ich das gelöst bekommen würde, habe ich das nächste Problem:
- wie binde ich dann den Code ein?
If Dateityp = "docx" Then FSO.MoveFile Quellordner & Datei.Name, ZielordnerNeu & Datei.Name
Da müsste ich ja die neue Dateibezeichnung einfügen (Datei & i -> aber nur, wenn vorher eine Umbenennung stattgefunden hat).
Entweder denke ich zu kompliziert oder ich bin hier an meine VBA-Grenzen gestoßen ...
Anzeige
;
Anzeige

Infobox / Tutorial

Dateien mit VBA verschieben und umbenennen


Schritt-für-Schritt-Anleitung

  1. VBA-Editor öffnen: Drücke ALT + F11, um den VBA-Editor in Excel zu öffnen.
  2. Modul erstellen: Klicke mit der rechten Maustaste auf dein Projekt im Projektfenster, wähle Einfügen und dann Modul.
  3. Code eingeben: Füge den folgenden VBA-Code in das Modul ein:
Public FSO As New FileSystemObject

Sub MoveAndRenameFiles()
    Dim Ordner As Folder
    Dim Datei As File
    Const Startordner = "C:\ZZZ_Startordner"
    Const Zielordner = "C:\ZZZ_Zielordner"
    Set Ordner = FSO.GetFolder(Startordner)

    For Each Ordner In FSO.GetFolder(Startordner).SubFolders
        For Each Datei In Ordner.Files
            Dim Quellordner As String
            Quellordner = Ordner & "\"
            Dim ZielordnerNeu As String
            ZielordnerNeu = Zielordner & "\" & FSO.GetExtensionName(Datei) & "\"

            If Not FSO.FolderExists(ZielordnerNeu) Then
                MkDir ZielordnerNeu
            End If

            ' Umbenennen, falls die Datei bereits existiert
            Dim i As Integer
            i = 1
            Do While FSO.FileExists(ZielordnerNeu & Datei.Name)
                Datei.Name = Left(Datei.Name, Len(Datei.Name) - Len(FSO.GetExtensionName(Datei))) & "_" & i & "." & FSO.GetExtensionName(Datei)
                i = i + 1
            Loop

            ' Datei verschieben
            FSO.MoveFile Quellordner & Datei.Name, ZielordnerNeu & Datei.Name
        Next Datei
    Next Ordner
End Sub
  1. Code anpassen: Stelle sicher, dass die Pfade Startordner und Zielordner korrekt sind.
  2. Makro ausführen: Schließe den VBA-Editor und führe das Makro über Entwicklertools -> Makros aus.

Häufige Fehler und Lösungen

  • Fehler: Ungültiger Bezeichner: Achte darauf, dass alle Variablen korrekt deklariert sind und keine typografischen Fehler im Code vorhanden sind.

  • Fehler: Datei existiert bereits: Verwende eine Schleife, um die Datei mit einer fortlaufenden Nummer umzubenennen, bevor du sie verschiebst.


Alternative Methoden

Eine andere Möglichkeit, Dateien zu verschieben, ist die Verwendung von FileCopy gefolgt von Kill, um die ursprüngliche Datei zu löschen. Dies kann nützlich sein, wenn du eine Sicherheitskopie der Datei an einem anderen Ort haben möchtest.

FSO.CopyFile Quellordner & Datei.Name, ZielordnerNeu & Datei.Name
FSO.DeleteFile Quellordner & Datei.Name

Praktische Beispiele

Wenn du beispielsweise alle .docx-Dateien ins Zielverzeichnis verschieben möchtest, kannst du die Bedingung in deinem Code anpassen:

If FSO.GetExtensionName(Datei) = "docx" Then
    ' Code zum Umbenennen und Verschieben
End If

Tipps für Profis

  • Verwende On Error Resume Next mit Bedacht: Dies kann hilfreich sein, um Fehler zu ignorieren, aber sei vorsichtig, da es auch zu unerwarteten Ergebnissen führen kann.

  • Dateipfade dynamisch gestalten: Nutze das Environ-Objekt, um Umgebungsvariablen in Pfaden zu verwenden, z.B. C:\Users\" & Environ("USERNAME") & "\Documents".


FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass alle Dateien verschoben werden? Verwende eine Schleife, die alle Unterordner durchläuft, und prüfe, ob die Dateien im Zielverzeichnis vorhanden sind.

2. Was ist der Unterschied zwischen MoveFile und CopyFile? MoveFile verschiebt die Datei an einen neuen Speicherort, während CopyFile eine Kopie der Datei erstellt und die Originaldatei behalten wird.

3. Kann ich den Code anpassen, um nur bestimmte Dateitypen zu verschieben? Ja, passe die If-Bedingung an, um nur die gewünschten Dateitypen zu behandeln, wie im Beispiel oben gezeigt.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige