Ordner auslesen (Unterordner) und die Inhalte (Ordner/Datein) verschieben und den Dateinamen erweitern

  • Sonstige

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von FBM.

    Ordner auslesen (Unterordner) und die Inhalte (Ordner/Datein) verschieben und den Dateinamen erweitern

    Guten Abend,
    ich hoffe ihr könnt mir weiterhelfen.
    Ich möchte einen Ordner Auslesen im dem ganz viele weitere Ordner sind, die wiederum Dateien enthalten. Nun sollen die ganzen Ordnernamen erweitert werden (also aus "Ordner1" wird "Ordner1New"), bei allen gleich. Das selbe mit den darin enthaltende Dateien.
    Und zusätzlich sollen die umbenannten Ordner/Dateien gleich neu abgespeichert werden.

    Also hier ein Beispiel:
    C:\new\Ordner242 mit Datei "1421.txt" "w5215.txt" "5325235.txt"
    C:\new\Ordner453 mit Datei "rw646.txt" "346665.txt"
    C:\new\Ordner824 mit Datei "34546.txt"

    soll werden zu:

    M:\123\Ordner242-abc mit Datei "1421-ab.txt" "w5215-ab.txt" "5325235-ab.txt"
    M:\123\Ordner453-abc mit Datei "rw646-ab.txt" "346665-ab.txt"
    M:\123\Ordner824-abc mit Datei "34546-ab.txt"


    Eigentlich müsste man das ja mit FileCopy / Name machen können, aber an diesem Auslesen scheiter ich irgendwie.

    Habe nicht so viel Erfahrung mit VBA, hoffe das ihr mir helfen könnt.
    Viele Dank!!
    fbm
    VBA oder VBS?
    Ich probiers mal mit VBS, das lässt sich auch in VBA ausführen.

    Visual Basic-Quellcode

    1. Set FS=CreateObject("Scripting.FileSystemObject")
    2. FolderAppendix="-abc"
    3. FileAppendix="-ab"
    4. ProcessFolder FS.GetFolder("C:\New"), "M:\123"
    5. Sub ProcessFolder (Folder, NewFolderName)
    6. If Not FS.FolderExists(NewFoldername) Then FS.CreateFolder(NewFolderName)
    7. For Each Fld in Folder.SubFolders
    8. ProcessFolder Fld, NewFolderName & "\" & Fld.Name & FolderAppendix
    9. Next
    10. For Each File In Folder.Files
    11. File.Copy NewFolderName & File.Name & FileAppendix
    12. Next
    13. End Sub
    Ist ungetestet und aus dem Kopf geschrieben.
    Debuggen musst du selbst.
    Aber das Prinzip (FileSystemObject und rekursiver Aufruf) müsste daraus hervorgehen.

    Edit:
    Ich sehe gerade, dass ich den FileAppendix an der falschen Stelle montiere.
    Musst halt den Filenamen selber zerlegen und wieder zusammenbauen.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Der Unterschied zwischen VBS und VBA ist minimal.
    Eigentlich musst du nur Zeile 1 und 4 in eine Sub packen, die du aufrufst.

    Du kannst aber in VBA etwas sauberer definieren.

    Visual Basic-Quellcode

    1. Private Const FolderAppendix="-abc"
    2. Private Const FileAppendix="-ab"
    3. Private FS as Object
    4. Public Sub ProcessBaseFolder()
    5. Set FS=CreateObject("Scripting.FileSystemObject")
    6. ProcessFolder FS.GetFolder("C:\New"), "M:\123"
    7. End Sub
    8. Private Sub ProcessFolder (ByVal Folder As Object, ByVal NewFolderName As String)
    9. If Not FS.FolderExists(NewFoldername) Then FS.CreateFolder(NewFolderName)
    10. For Each Fld in Folder.Folders
    11. ProcessFolder Fld, NewFolderName & "\" & Fld.Name & FolderAppendix
    12. Next
    13. For Each File In Folder.Files
    14. File.Copy NewFolderName & File.Name & FileAppendix
    15. Next
    16. End Sub
    Für den Aufruf von ProcessBaseFolder findest du ja hoffentlich eine Möglichkeit.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ach so, ok, aber müsste er nicht "ProcessBaseFolder" jetzt eh Ausführen wenn ich das Programm über einen Button oder so starte.
    Er Arbeitet doch Theoretisch das Programm schritt für schritt ab oder liege ich da falsch? Oder meinst du genau das?

    Also ich habe nämlich genau das jetzt gemacht, bekomme jetzt aber immer den Laufzeitfehler 438 (Objekt unterstützt diese Eigenschaft oder Methode nicht). Kann es sein das ich eine neuere Version von Office benötige, habe nämlich auf diesen PC nur die 2003 Version installiert oder könnte es am Objekt liegen? >. <

    Nochmal vielen Dank für deine mühe.

    FBM schrieb:

    wenn ich das Programm über einen Button oder so starte.
    Über einen Button startest du kein "Programm", sondern eine Prozedur.
    In dem Fall musst du die Einsprungprozedur Button1_Click (oder analog) nennen.

    Falls du mit Button F5 im VBE meinst, musst du zumindest den Cursor in die Prozedur setzen.


    FBM schrieb:

    Laufzeitfehler 438
    Ich sag ja: Debuggen musst du selbst.
    In welcher Zeile taucht der Fehler auf?

    Es kann schon sein, dass ich eine der Methoden nicht korrekt geschrieben habe.
    Die Referenz findest du hier:
    msdn.microsoft.com/en-us/library/bkx696eh(v=vs.84).aspx
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Ja stimmt, Prozedur. Ich habe halt den Button ein Makro zugewiesen "Tabelle1.ProcessBaseFolder".

    Also der Fehler taucht in der Zeile auf:

    Visual Basic-Quellcode

    1. ProcessFolder Fld, NewFolderName & "\" & Fld.Name & FolderAppendix


    Bis zu Zeile davor läuft es und wenn ich die 3 Zeilen entferne:

    Visual Basic-Quellcode

    1. For Each Fld In Folder.Folders
    2. ProcessFolder Fld, NewFolderName & "\" & Fld.Name & FolderAppendix
    3. Next


    Läuft das ganze auch durch, verschiebt dann natürlich nur Dateien die sich im Hauptordner befinden und erstellt nicht die neuen Unterordner.
    Habe schon versucht Klammern zu setzten, weil ich ähnliche Beispiele gefunden habe, aber leider ändert das nichts. Eigentlich sieht es ja auch ganz logisch aus. : /
    Ist ja auch richtig so.

    Also das Programm läuft jetzt durch, aber die Dateien in den Unterordnern werden zwar rüber kopiert aber nicht unbenannt.
    Habe jetzt die Zeile wie folgt um bearbeitet:

    Visual Basic-Quellcode

    1. For Each Fld In Folder.subFolders
    2. Fld.Copy NewFolderName & "\" & Fld.Name & FolderAppendix
    3. Next


    Ist das soweit richtig?

    Könntest du mir ein Tipp geben wie er jetzt auch noch die Dateien (in den Unterordnen) umbenennt?
    Dachte es könnte auch gehen indem ich einfach, aus "Folder.Files" "Folder.subFiles" mache, aber so scheint das nicht zu gehen.
    Ich würde mal behaupten: Er kopiert die Dateien, auch mit Appendix, aber einen Ordner zu tief und mit Ordnernamen als Prefix :)
    Ich hab jetzt mal deine Aufgabe Hausaufgaben gemacht und bin im Singlestep durch den Debugger:

    Visual Basic-Quellcode

    1. Private Const FolderAppendix = "-abc"
    2. Private Const FileAppendix = "-ab"
    3. Private FS As Object
    4. Public Sub ProcessBaseFolder()
    5. Set FS = CreateObject("Scripting.FileSystemObject")
    6. ProcessFolder FS.GetFolder("C:\New"), "C:\123"
    7. End Sub
    8. Private Sub ProcessFolder(ByVal Folder As Object, ByVal NewFolderName As String)
    9. If Not FS.FolderExists(NewFolderName) Then FS.CreateFolder (NewFolderName)
    10. For Each Fld In Folder.SubFolders
    11. ProcessFolder Fld, NewFolderName & "\" & Fld.Name & FolderAppendix
    12. Next
    13. For Each File In Folder.Files
    14. DotPos = InStrRev(File.Name, ".")
    15. NewFilename = Left(File.Name, DotPos - 1) & FileAppendix & Mid(File.Name, DotPos)
    16. File.Copy NewFolderName & "\" & NewFilename
    17. Next
    18. End Sub
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --