Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1812to1816
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Auslesen mehrerer Exceldateien

Auslesen mehrerer Exceldateien
10.02.2021 10:25:43
Alex_E
Hallo zusammen,
ich möchte Daten aus mehreren Excel-Dateien auslesen und in einer bestehenden Zieldatei, in einem Tabellenblatt fortlaufend einfügen. Ich habe dafür einen Code im Netz gefunden, der auch soweit ganz gut funktioniert. Allerdings dauert die Prozedur bei mehreren Dateien relativ lange. Ich habe mir sagen lassen, dass es daran liegt, dass das Makro einzelne Zellen kopiert und einfügt bzw. über Zeilen und Spalten geht. Es soll wohl besser sein, wenn das Makro einfach die jeweils genutzten Zeilen der Quelldateien ausließt und in die Zieldatei einfügt.
Ich habe jetzt schon mehrere Tage vergeblich versucht den Code entsprechend umzubauen. Meine VBA Kentnisse reichen hierfür leider nicht aus.
Gibt es hier eventuell liebe Menschen, die mir den Code wie oben beschrieben anpassen könnten?
Hier der aktuelle, funktionierende aber sehr langsame Code:
  • 
    Sub DateienEinlesen()
    On Error GoTo Err
    Dim oTargetSheet As Object
    Dim oSourceBook As Object
    Dim sPfad As String
    Dim sDatei As String
    Dim lErgebnisZeile As Long
    Dim s As Long
    Dim z As Long
    Application.ScreenUpdating = False 'Das "Flackern" ausstellen
    'Schritt 1: Arbeitsblatt für die Ergebnisse
    Set oTargetSheet = ThisWorkbook.Sheets("Bestellkonsolidierung")
    lErgebnisZeile = 2 'Ergebnisse eintragen ab Zeile 1
    'Schritt 2: Schleife über alle Excel Dateien in einem Verzeichnis
    sPfad = InputBox("Bitte Pfad eingeben", "Pfad") & "\"
    sDatei = Dir(CStr(sPfad & "*.xl*")) 'Alle Excel Dateien
    Do While sDatei  ""
    'Schritt 3: öffnen der Datei und Datenübertragung
    Set oSourceBook = Workbooks.Open(sPfad & sDatei, False, True) 'nur lesend öffnen
    'Datenübertragung alle genutzten Zeilen und Spalten
    For z = 2 To oSourceBook.Sheets("Data").UsedRange.Rows.Count
    'Keine Leerzeilen verarbeiten
    If Trim(CStr(oSourceBook.Sheets("Data").Cells(z, 1).Value))  "" Then
    For s = 1 To oSourceBook.Sheets("Data").UsedRange.Columns.Count
    'Spalte 1 - Dateinamen
    oTargetSheet.Cells(lErgebnisZeile, 1).Value = sDatei
    'Spalte 2 bis n - Tabelleninhalte des Arbeitsblattes "Tabelle1"
    oTargetSheet.Cells(lErgebnisZeile, s + 3).Value = _
    oSourceBook.Sheets("Data").Cells(z, s).Value
    Next s
    lErgebnisZeile = lErgebnisZeile + 1
    End If
    Next z
    'Schritt 4: Datei wieder zu machen und nächste Schleifenrunde
    oSourceBook.Close False 'nicht speichern
    'Nächste Datei
    sDatei = Dir()
    Loop
    Application.ScreenUpdating = True 'Das Bildschirm-Aktualisieren wieder einschalten
    'Variablen aufräumen
    Set oTargetSheet = Nothing
    Set oSourceBook = Nothing
    ThisWorkbook.Sheets("Bestellkonsolidierung").Select
    Exit Sub
    Err:
    MsgBox "Fehler in Sub" & Err.Number & ": " & Err.Description, vbCritical + vbOKOnly
    End Sub
    


  • Ich würde mich sehr freuen, wenn mir jemand helfen könnte.
    Vorab vielen Dank und viele Grüße
    Alex

    13
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: Auslesen mehrerer Exceldateien
    10.02.2021 10:34:15
    Alex_E
    Wichtig ist auch, dass die Daten aus den Quelldateien ohne die Überschriften in Zeile 1 kopiert werden und in der Zieldatei erst ab Zeile 2 eingefügt werden.
    AW: Auslesen mehrerer Exceldateien
    10.02.2021 12:18:34
    ralf_b
    zu deinem Geschwindigkeitsproblem habe ich eine Idee.
    Und zwar wenn du die innere schleife über die Spalten durch einen Bereich ersetzt.
    Also im Moment wird in jeder Zeile auch jede Zelle einzeln angefasst.
    du könntest einfach Ziel.cells(zeile,spalte).resize(spaltenanzahl).value = Quelle.cells(Zeile,spalte).resize(Spaltenanzahl).value nutzen.
    dann hast du die Zeile in einem Rutsch.
    gruß
    rb
    AW: Auslesen mehrerer Exceldateien
    10.02.2021 13:13:24
    Alex_E
    Hallo zusammen und vielen Dank für die Unterstützung.
    Ich habe jetzt nochmal versucht den Code anzupassen, aber irgend etwas scheint da nicht zu passen, aber leider ohne Erfolg. Jetzt ließt es scheinbar nur noch aus einer Datei und nur einer Spalte :-(
    Was mache ich falsch? Oder besser gefragt, wie geht es richtig?
    Sub DateienEinlesen()
    On Error GoTo Err
    Dim oTargetSheet As Object
    Dim oSourceBook As Object
    Dim sPfad As String
    Dim sDatei As String
    Dim lErgebnisZeile As Long
    Dim s As Long
    Dim z As Long
    Application.ScreenUpdating = False 'Das "Flackern" ausstellen
    'Schritt 1: Arbeitsblatt für die Ergebnisse
    Set oTargetSheet = ThisWorkbook.Sheets("Bestellkonsolidierung")
    lErgebnisZeile = 2 'Ergebnisse eintragen ab Zeile 1
    'Schritt 2: Schleife über alle Excel Dateien in einem Verzeichnis
    sPfad = InputBox("Bitte Pfad eingeben", "Pfad") & "\"
    sDatei = Dir(CStr(sPfad & "*.xl*")) 'Alle Excel Dateien
    Do While sDatei  ""
    'Schritt 3: öffnen der Datei und Datenübertragung
    Set oSourceBook = Workbooks.Open(sPfad & sDatei, False, True) 'nur lesend öffnen
    'Datenübertragung alle genutzten Zeilen und Spalten
    For z = 2 To oSourceBook.Sheets("Data").UsedRange.Rows.Count
    'Keine Leerzeilen verarbeiten
    If Trim(CStr(oSourceBook.Sheets("Data").Cells(z, 1).Value))  "" Then
    For s = 1 To oSourceBook.Sheets("Data").UsedRange.Columns.Count
    'Daten in Zieldatei schreiben
    oTargetSheet.Cells(2, 1).Resize(30).Value = _
    oSourceBook.Sheets("Data").Cells(2, 1).Resize(30).Value
    Next s
    lErgebnisZeile = lErgebnisZeile + 1
    End If
    Next z
    'Schritt 4: Datei wieder zu machen und nächste Schleifenrunde
    oSourceBook.Close False 'nicht speichern
    'Nächste Datei
    sDatei = Dir()
    Loop
    Application.ScreenUpdating = True 'Das Bildschirm-Aktualisieren wieder einschalten
    'Variablen aufräumen
    Set oTargetSheet = Nothing
    Set oSourceBook = Nothing
    ThisWorkbook.Sheets("Bestellkonsolidierung").Select
    Exit Sub
    Err:
    MsgBox "Fehler in Sub" & Err.Number & ": " & Err.Description, vbCritical + vbOKOnly
    End Sub
    Sub Überschriften()
    On Error GoTo Err
    'Überschriften löschen
    Dim i As Long
    Dim Zielsheet As Object
    'Auswahl Zieltabelle
    ActiveWorkbook.Sheets("Bestellkonsolidierung").Select
    Set Zielsheet = ActiveWorkbook.Sheets("Bestellkonsolidierung")
    Application.ScreenUpdating = False
    For i = Zielsheet.Cells(Rows.Count, 5).End(xlUp).Row To 2 Step -1
    If Cells(i, 5) = "Kartonfarbe" Then Rows(i).Delete
    Next i
    Application.ScreenUpdating = True
    Exit Sub
    Err:
    MsgBox "Fehler in Sub" & Err.Number & ": " & Err.Description, vbCritical + vbOKOnly
    End Sub
    
    Viele Grüße
    Alex
    Anzeige
    AW: Auslesen mehrerer Exceldateien
    10.02.2021 13:18:00
    ralf_b
    die innere Schleife solltest du ersetzen und nicht nur die Wertezuweisung.
    AW: Auslesen mehrerer Exceldateien
    10.02.2021 12:37:11
    Werner
    Hallo,
    da würde ich einfach den kompletten Bereich übertragen, inklusive der leeren Zellen/Zeilen.
    Ganz am Schluß, nach Abschluß der Datenübertagung, im Zielblatt mit der SpecialCells Methode (xlCemmtypeBlanks) die Leerzellen/Zeilen löschen.
    Gruß Werner
    AW: Auslesen mehrerer Exceldateien
    10.02.2021 12:55:42
    Piet
    Hallo
    ich weiss nicht ob der Frager genug vom Code versteht um das zu realisieren. Bitte diesen Code mal in einer KOPIERTEN Datei testen. Ohne Gewaehr das er einwandfrei funktioniert.
    ZUm löschen möchte ich anmerken das man doch nur die Zeilen löscht, die komplett Leer sind. Sonst verschieben sich ja die anderen Daten! Ist das korrekt? Zur Zeit löscht das Makro noch nichts!
    mfg Piet
    Sub DateienEinlesen()
    On Error GoTo Err
    Dim oTargetSheet As Object
    Dim oSourceBook As Object
    Dim sPfad As String
    Dim sDatei As String
    Dim lErgebnisZeile As Long
    Dim s As Long
    Dim z As Long
    Application.ScreenUpdating = False 'Das "Flackern" ausstellen
    'Schritt 1: Arbeitsblatt für die Ergebnisse
    Set oTargetSheet = ThisWorkbook.Sheets("Bestellkonsolidierung")
    'alte Daten in Bestellkonsolidierung löschen
    oTargetSheet.UsedRange.Offset(1, 0).Delete shift:=xlUp
    'Schritt 2: Schleife über alle Excel Dateien in einem Verzeichnis
    sPfad = InputBox("Bitte Pfad eingeben", "Pfad") & "\"
    sDatei = Dir(CStr(sPfad & "*.xl*")) 'Alle Excel Dateien
    Do While sDatei  ""
    'Schritt 3: öffnen der Datei und Datenübertragung
    Set oSourceBook = Workbooks.Open(sPfad & sDatei, False, True) 'nur lesend öffnen
    'Datenübertragung alle genutzten Zeilen und Spalten
    lErgebnisZeile = oTargetSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1
    oSourceBook.Sheets("Data").UsedRange.Copy _
    oTargetSheet.Cells(lErgebnisZeile, 1)
    '** leere Zeilen löschen?
    'Schritt 4: Datei wieder zu machen und nächste Schleifenrunde
    oSourceBook.Close False 'nicht speichern
    'Nächste Datei
    sDatei = Dir()
    Loop
    Application.ScreenUpdating = True 'Das Bildschirm-Aktualisieren wieder einschalten
    'Variablen aufräumen
    Set oTargetSheet = Nothing
    Set oSourceBook = Nothing
    ThisWorkbook.Sheets("Bestellkonsolidierung").Select
    Exit Sub
    Err:
    MsgBox "Fehler in Sub" & Err.Number & ": " & Err.Description, vbCritical + vbOKOnly
    End Sub
    

    Anzeige
    AW: Auslesen mehrerer Exceldateien
    10.02.2021 16:44:04
    Alex_E
    Hallo Piet,
    vielen Dank für deine Antwort. Du hast es völlig richtig verstanden. Meine Kenntnisse reichen in dem Fall leider nicht aus, um den Code entsprechend umzubauen.
    Dein Code funktioniert leider nicht ganz so wie es soll. Aktuell wird aus der ersten Quelldatei die erste Zeile mit den Überschriften und dann erst wieder ab Zeile 3 Daten übertragen und aus der zweiten Quelldatei wieder die Überschriften und dann erst ab Zeile 4. So gehen die ersten Zeilen der zweiten Datei komplett verloren. Wie es bei mehr Dateien aussieht habe ich jetzt noch nicht getestet.
    Meine Quelldateien Haben immer dieselbe Struktur. Im Tabellenblatt "Data" sind in den Spalten A bis AD, Daten und zum Teil auch Formeln enthalten. Die Anzahl der befüllten Zeilen kann je nach Quelldatei unterschiedlich sein. Zur Orientierung könnte die Spalte "P" verwendet werden. Hier stehen immer werte drin. wenn eine Zeile kopiert werden soll. Es sollen also nur die Zeilen Übertragen werden, bei denen in Spalte "P" ein Wert enthalten ist.
    Die Zieldatei ist eine separate Exceldatei. Die Daten sollen als Werte, immer im Tabellenblatt "Bestellkonsolidierung" fortlaufend untereinander eingefügt werden.
    Ich hoffe, dass ich die Infos verständlich erklären konnte.
    Vielen Dank und viele Grüße
    Alex
    Anzeige
    AW: Auslesen mehrerer Exceldateien
    10.02.2021 16:51:19
    Alex_E
    Es würde auch passen, wenn die Daten aus den Quelldateien erst ab der zweiten Zeile kopiert werden und auch erst ab der zweiten Zeile im Zielsheet eingefügt werden. Die Überschriften kann ich ja im Zielsheet immer stehen lassen, weil die immer gleich sind und den Überschriften in den Quelldateien entsprechen.
    AW: Auslesen mehrerer Exceldateien
    10.02.2021 17:37:26
    Werner
    Hallo,
    teste mal:
    Public Sub DatenEinlesen()
    Dim oTargetSheet As Worksheet, oSourceBook As Workbook
    Dim sPfad As String, sDatei As String, loZeile As Long
    Dim loSpalte As Long, loZeileZiel As Long
    Application.ScreenUpdating = False
    Set oTargetSheet = ThisWorkbook.Sheets("Bestellkonsolidierung")
    sPfad = InputBox("Bitte Pfad eingeben", "Pfad") & "\"
    sDatei = Dir(CStr(sPfad & "*.xl*"))
    Do While sDatei  ""
    Set oSourceBook = Workbooks.Open(sPfad & sDatei, False, True)
    With oSourceBook.Worksheets("Data")
    loZeile = .Cells(.Rows.Count, "B").End(xlUp).Row
    loSpalte = .Cells(1, .Columns.Count).End(xlToLeft).Column
    .Range(.Cells(2, 1), .Cells(loZeile, loSpalte)).Copy
    With oTargetSheet
    loZeileZiel = .Cells(.Rows.Count, 2).End(xlUp).Offset(1).Row
    .Cells(loZeileZiel, 1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats
    End With
    End With
    oSourceBook.Close False
    Loop
    With oTargetSheet
    loZeileZiel = .Cells(.Rows.Count, "B").End(xlUp).Row
    If WorksheetFunction.CountBlank(.Range("A1:A" & loZeileZiel)) > 0 Then
    .Range("A1:A" & loZeileZiel).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    End If
    End With
    Application.CutCopyMode = False
    Set oTargetSheet = Nothing: Set oSourceBook = Nothing
    End Sub
    
    Gruß Werner
    Anzeige
    AW: Auslesen mehrerer Exceldateien
    11.02.2021 12:21:57
    Alex_E
    Hallo Werner,
    vielen Dank für deine Hilfe. Diese Anpassung funktioniert leider auch nicht. Jetzt wird beim öffnen bzw. auslesen der Quelldateien, jedes mal gefragt ob Makros aktiviert werden sollen und es kommt auch eine Meldung, dass die Zwischenablage voll ist und ob die Daten nach Schließen beibehalten werden sollen. Das passiert auch leider in Dauerschleife, so dass man die Prozedur abbrechen muss. Anschließend sehe ich, dass nur Daten aus einer Quelldatei übertragen wurden :-(. Das passiert mit dem alten aber langsamen Code nicht.
    Viele Grüße
    Alex
    AW: Auslesen mehrerer Exceldateien
    11.02.2021 12:54:55
    Werner
    Hallo,
    dann halt nach jedem Kopiervorgang den Zwischenspeicher löschen.
    Und vor dem Loop hatte ich sDatei = Dir() vergessen.
    Public Sub DatenEinlesen()
    Dim oTargetSheet As Worksheet, oSourceBook As Workbook
    Dim sPfad As String, sDatei As String, loZeile As Long
    Dim loSpalte As Long, loZeileZiel As Long
    Application.ScreenUpdating = False
    Set oTargetSheet = ThisWorkbook.Sheets("Bestellkonsolidierung")
    sPfad = InputBox("Bitte Pfad eingeben", "Pfad") & "\"
    sDatei = Dir(CStr(sPfad & "*.xl*"))
    Do While sDatei  ""
    Set oSourceBook = Workbooks.Open(sPfad & sDatei, False, True)
    With oSourceBook.Worksheets("Data")
    loZeile = .Cells(.Rows.Count, "B").End(xlUp).Row
    loSpalte = .Cells(1, .Columns.Count).End(xlToLeft).Column
    .Range(.Cells(2, 1), .Cells(loZeile, loSpalte)).Copy
    With oTargetSheet
    loZeileZiel = .Cells(.Rows.Count, 2).End(xlUp).Offset(1).Row
    .Cells(loZeileZiel, 1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats
    Application.CutCopyMode = False
    End With
    End With
    oSourceBook.Close False
    sDatei = Dir()
    Loop
    With oTargetSheet
    loZeileZiel = .Cells(.Rows.Count, "B").End(xlUp).Row
    If WorksheetFunction.CountBlank(.Range("A1:A" & loZeileZiel)) > 0 Then
    .Range("A1:A" & loZeileZiel).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    End If
    End With
    Application.CutCopyMode = False
    Set oTargetSheet = Nothing: Set oSourceBook = Nothing
    End Sub
    
    Gruß Werner
    Anzeige
    AW: Auslesen mehrerer Exceldateien
    11.02.2021 15:28:19
    Alex_E
    Hallo Werner,
    auch diese Anpassung funktioniert leider nicht. Die Meldungen zum Zwischenspeicher sind jetzt weg. Allerdings wird immer noch die Meldung bzgl enthaltener Makros in den Quelldateien augegeben/angezeigt. Nach dem man dies das erste mal aktiviert hat, kommt dann ein debugg Fehler und es wird folgende Zeile im Code markiert:
    .Range("A1:A" & loZeileZiel).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    
    Ich kann leider nicht ganz nachvollziehen welche Zeile im Code für was steht. Eventuell muss ich da irgendwelche Range auf meine Dateien anpassen?
    Es werden jetzt leider gar keine Daten übertragen :-(
    Viele Grüße
    Alex
    Anzeige
    AW: Auslesen mehrerer Exceldateien
    11.02.2021 16:52:17
    Werner
    Hallo,
    der Code ist von mir getestet und läuft. Da kommt weder irgendeine Meldung wegen Makros, noch eine Fehlermeldung. Im Übrigen wäre es auch nicht schlecht mitzuteilen, welche Fehlermeldung denn kommt.
    Und mehr kann ich dazu nicht sagen, da ich weder deine Zielmappe noch eine deiner Quellmappen kenne.
    Gruß Werner

    Links zu Excel-Dialogen

    Beliebteste Forumthreads (12 Monate)

    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Anzeige