Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: Dateien kopieren

Dateien kopieren
12.10.2020 08:33:36
Edgar
Hallo,
ich habe ein Problem, an dem ich schon fast eine Woche sitze, aber auch trotz intensiever Suche keine Lösung für mich gefunden habe. Mit FileSearch habe ich eine Lösung, aber FileSearch gibt es ja nicht mehr:
Ich habe einen Ordner DATEN in dem viele Unterordner (U01, U02, bis Unn) enthalten sind. das können durchaus 50 Unterordner sein). In jedem Unterordner sind mehrere Dateien enthalten, aber nur exact eine .XLSX Datei.
Ich möchte jetzt alle XLSX Dateien aus allen Unterordnern in einen Ordner C:\OUTPUT kopieren.
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Dateien kopieren
12.10.2020 09:21:36
Nepumuk
Hallo Edgar,
teste mal:
Option Explicit

Public Sub CopyFiles()
    Const FOLDER_PATH As String = "G:\DATEN\" 'Anpassen !!! Backslash am Ende nicht löschen
    Dim astrFolders() As String, strFilename As String
    Dim ialngFolders As Long
    astrFolders = GetFolders(FOLDER_PATH)
    For ialngFolders = LBound(astrFolders) To UBound(astrFolders)
        strFilename = Dir$(astrFolders(ialngFolders) & "*.xlsx")
        If strFilename <> vbNullString Then _
            Call FileCopy(Source:=astrFolders(ialngFolders) & strFilename, Destination:="C:\OUTPUT\" & strFilename)
    Next
End Sub

Private Function GetFolders(ByVal pvstrPath As String) As String()
    Dim astrFolders() As String
    Dim strFolder As String, strPath As String
    Dim ialngIndex1 As Long, ialngIndex2 As Long
    Redim Preserve astrFolders(ialngIndex1)
    astrFolders(ialngIndex1) = pvstrPath
    ialngIndex1 = 1
    ialngIndex2 = 1
    strPath = pvstrPath
    Do
        strFolder = Dir$(PathName:=strPath & "*", Attributes:=vbDirectory)
        Do Until strFolder = vbNullString
            If strFolder <> "." And strFolder <> ".." Then
                If GetAttr(PathName:=strPath & strFolder) And vbDirectory Then
                    Redim Preserve astrFolders(0 To ialngIndex1)
                    astrFolders(ialngIndex1) = strPath & strFolder & "\"
                    ialngIndex1 = ialngIndex1 + 1
                End If
            End If
            strFolder = Dir$
        Loop
        If ialngIndex1 = ialngIndex2 Then Exit Do
        strPath = astrFolders(ialngIndex2)
        ialngIndex2 = ialngIndex2 + 1
    Loop
    GetFolders = astrFolders
End Function

Gruß
Nepumuk
Anzeige
AW: Dateien kopieren
13.10.2020 07:52:38
Edgar
Hallo Nepumuk,
funktioniert super! Macht genau das was ich will. Ich habe nur noch zwei Änderungen gemacht:
1. Aufruf der Funktion mit zwei Variablen (Ein.- und Ausgabeverzeichnis)
2. Änderung der INPUT und OUTPUT Werte in Varialen, die ich übergebe.
Hab vielen Dank!
Edgar
AW: Dateien kopieren
13.10.2020 08:01:09
Edgar
Nachdem ich dank Nepumuks Hilfe mein Problem lösen konnte setze ich noch einen drauf. Ihr seht, Dateiverarbeitung unter Excel VBA ist nicht wirklich mein Ding. Ich versuche aber immer alles, was mir als Lösung angeboten wird, auch zu verstehen.
Jetzt befinden sich alle Excel Dateien in meinem OUTPUT Ordner.
Im nächsten (und letzten) Schritt möchte ich nacheinander alle WB aufmachen, einen Blattschutz deaktivieren, eine Änderung auf dem WS vornehmen, Blattschutz wieder aktivieren und WB schließen
Anzeige
AW: Dateien kopieren
13.10.2020 10:26:13
Nepumuk
Hallo Edgar,
aufgrund mangelnder Angaben nur ein Beispiel:
Option Explicit

Public Sub Beispiel()
    
    Const FOLDER_PATH As String = "H:\" ' Anpassen !!!
    
    Dim strFilename As String
    Dim objWorkbook As Workbook
    
    With Application
        .Calculation = xlCalculationManual
        .EnableEvents = False
        .ScreenUpdating = False
    End With
    
    strFilename = Dir$(FOLDER_PATH & "*.xls*")
    
    Do Until strFilename = vbNullString
        
        Set objWorkbook = Workbooks.Open(Filename:=FOLDER_PATH & strFilename)
        
        With objWorkbook.Worksheets(1)
            
            Call .Unprotect(Password:="GEHEIM")
            
            .Cells(1, 1).Value = "Hallo"
            
            Call .Protect(Password:="GEHEIM")
            
        End With
        
        Call objWorkbook.Close(SaveChanges:=True)
        
        strFilename = Dir$
        
    Loop
    
    Set objWorkbook = Nothing
    
    With Application
        .Calculation = xlCalculationAutomatic
        .EnableEvents = True
        .ScreenUpdating = True
    End With
End Sub

Gruß
Nepumuk
Anzeige
AW: Dateien kopieren
13.10.2020 16:18:08
Edgar
Danke auch dafür. Habe mittlerweile viel gelesen und gesucht. Bin auch fündig geworden. Habe die Code-Schnippsel an meine Bedürfnisse angepasst. Hat zwar etwas gedauert und ist sicherlich auf etwas umständlich, aber es funktioniert.
Was wollte ich rreichen?
Nach dem ersten Step, der alle Unterordner nacheinander öffnet und die darin enthaltene .XLSX Datei in den Ausgangsordner schiebt sollte Step2 folgen.
Step2 nimmt nacheinander jede .XLSX Datei im Ausgangsordner, öffnet WS1 und löscht darin Zeile5. Dann wird WS3 geöffnet und die Zeilen 5-6 an das Ende von Zeile 1-2 verschoben.
Die :XLSX Dateien werden anschließend in QlikView geladen und analysiert.
Anzeige
AW: Dateien kopieren
13.10.2020 16:30:42
Nepumuk
Hallo Edgar,
so ganz kann ich dir nicht folgen. Lade mal eine Mustermappe mit soll/ist hoch.
Gruß
Nepumuk
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Dateien aus Unterordnern kopieren und bearbeiten


Schritt-für-Schritt-Anleitung

Um alle .XLSX-Dateien aus mehreren Unterordnern in einen Zielordner zu kopieren, kannst Du den folgenden VBA-Code verwenden. Dieser Code kopiert alle Excel-Dateien aus einem angegebenen Pfad in den Ordner C:\OUTPUT.

  1. Öffne Excel und drücke ALT + F11, um den VBA-Editor zu öffnen.

  2. Klicke auf Einfügen > Modul, um ein neues Modul zu erstellen.

  3. Füge den folgenden Code in das Modul ein:

    Option Explicit
    
    Public Sub CopyFiles()
       Const FOLDER_PATH As String = "G:\DATEN\" ' Anpassen !!! Backslash am Ende nicht löschen
       Dim astrFolders() As String, strFilename As String
       Dim ialngFolders As Long
       astrFolders = GetFolders(FOLDER_PATH)
       For ialngFolders = LBound(astrFolders) To UBound(astrFolders)
           strFilename = Dir$(astrFolders(ialngFolders) & "*.xlsx")
           If strFilename <> vbNullString Then _
               Call FileCopy(Source:=astrFolders(ialngFolders) & strFilename, Destination:="C:\OUTPUT\" & strFilename)
       Next
    End Sub
    
    Private Function GetFolders(ByVal pvstrPath As String) As String()
       Dim astrFolders() As String
       Dim strFolder As String, strPath As String
       Dim ialngIndex1 As Long, ialngIndex2 As Long
       ReDim Preserve astrFolders(ialngIndex1)
       astrFolders(ialngIndex1) = pvstrPath
       ialngIndex1 = 1
       ialngIndex2 = 1
       strPath = pvstrPath
       Do
           strFolder = Dir$(PathName:=strPath & "*", Attributes:=vbDirectory)
           Do Until strFolder = vbNullString
               If strFolder <> "." And strFolder <> ".." Then
                   If GetAttr(PathName:=strPath & strFolder) And vbDirectory Then
                       ReDim Preserve astrFolders(0 To ialngIndex1)
                       astrFolders(ialngIndex1) = strPath & strFolder & "\"
                       ialngIndex1 = ialngIndex1 + 1
                   End If
               End If
               strFolder = Dir$
           Loop
           If ialngIndex1 = ialngIndex2 Then Exit Do
           strPath = astrFolders(ialngIndex2)
           ialngIndex2 = ialngIndex2 + 1
       Loop
       GetFolders = astrFolders
    End Function
  4. Passe den FOLDER_PATH an Deinen Bedarf an.

  5. Schließe den VBA-Editor und führe das Makro CopyFiles aus, um die Dateien zu kopieren.


Häufige Fehler und Lösungen

  • Fehler: „Datei nicht gefunden“
    Überprüfe, ob der angegebene FOLDER_PATH korrekt ist und existiert.

  • Fehler: „Zugriff verweigert“
    Stelle sicher, dass Du die notwendigen Berechtigungen hast, um auf die Dateien in den angegebenen Ordnern zuzugreifen.

  • Fehler: „VBA-Fehler 1004“
    Dies kann auftreten, wenn der Zielordner (C:\OUTPUT) nicht existiert. Erstelle diesen Ordner manuell, bevor Du das Makro ausführst.


Alternative Methoden

Eine weitere Möglichkeit, Dateien mit Excel VBA zu kopieren, ist die Verwendung von FileSystemObject. Hier ist ein Beispiel, wie Du das implementieren kannst:

Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFile Source:="G:\DATEN\*.xlsx", Destination:="C:\OUTPUT\"

Diese Methode ist einfacher, aber weniger flexibel, wenn es darum geht, nur bestimmte Dateien aus Unterordnern zu kopieren.


Praktische Beispiele

  1. Datei in mehrere Ordner kopieren
    Wenn Du eine Datei in mehrere Ordner kopieren möchtest, kannst Du den folgenden Code verwenden:

    Dim i As Long
    Dim targetFolders As Variant
    targetFolders = Array("C:\OUTPUT1\", "C:\OUTPUT2\", "C:\OUTPUT3\")
    
    For i = LBound(targetFolders) To UBound(targetFolders)
       FileCopy "C:\OUTPUT\DeineDatei.xlsx", targetFolders(i) & "DeineDatei.xlsx"
    Next i
  2. Ändern von Inhalten in kopierten Dateien
    Nachdem Du die Dateien in den Zielordner kopiert hast, kannst Du sie öffnen, Änderungen vornehmen und speichern:

    Dim wb As Workbook
    Set wb = Workbooks.Open("C:\OUTPUT\DeineDatei.xlsx")
    With wb.Worksheets(1)
       .Cells(1, 1).Value = "Neuer Wert"
    End With
    wb.Close SaveChanges:=True

Tipps für Profis

  • Nutze die Application.ScreenUpdating und Application.Calculation Eigenschaften, um die Performance zu verbessern, wenn Du viele Dateien bearbeitest.
  • Dokumentiere Deinen Code gut, um die Wartung zu erleichtern.
  • Verwende Error Handling, um unerwartete Fehler abzufangen und den Code robuster zu machen.

FAQ: Häufige Fragen

1. Wie kann ich eine Datei in mehrere Ordner kopieren?
Verwende eine Schleife mit den Zielordnern, um die Datei nacheinander zu kopieren.

2. Kann ich auch andere Dateitypen kopieren?
Ja, ändere einfach die Dateiendung im Dir$ Befehl auf den gewünschten Dateityp.

3. Wie kann ich die kopierten Dateien anschließend bearbeiten?
Nutze den Workbooks.Open Befehl, um die Datei zu öffnen und nimm die gewünschten Änderungen vor.

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