Anzeige
Archiv - Navigation
1740to1744
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

Inhalte aus Dateien

Inhalte aus Dateien
16.02.2020 15:01:14
Fred
Hallo Excel-Experten,
Ich nutze seit längeren ein Script, welches mir Inhalt von Tabellenblatt "Liga" aller Dateien im bestimmten Ordner in mein Tabellenblatt "Gesamt" zusammenfügt.
Klappt im Prinzip.
Was mich ein bischen stört: Die aufgerufenen Dateien sind xlsx,die Inhalte der Tabellenblätter "Liga" haben jeweils ca. 3300 Zeilen, es werden keine Berechnungen durchgeführt und dennoch dauert der Import über 20 Sek., entsprechend lange, wenn ich über 20 Dateien mit solch einem Tabellenblatt im Ordner habe.
Meine Anfrage;
Kann sich mal jemand bitte das Script anschauen, evt. auf Tempo verbessern/optimieren?
Das Script
Sub Tabellen_aus_Dateien()
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: Neues Arbeitsblatt für die Ergebnisse erstellen
' Set oTargetSheet = ActiveWorkbook.Sheets.Add
Set oTargetSheet = ActiveWorkbook.Sheets("Gesamt")
lErgebnisZeile = 10 'Ergebnisse eintragen ab Zeile 10
'Schritt 2: Schleife über alle Excel Dateien in einem Verzeichnis
sPfad = "C:\Users\Fred Neumann\Desktop\Blog\Strategie1\03_5Jahre\"
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 = 3 To oSourceBook.Sheets("Liga").UsedRange.Rows.Count
'Keine Leerzeilen verarbeiten
If Trim(CStr(oSourceBook.Sheets("Liga").Cells(z, 3).Value))  "" Then
For s = 1 To oSourceBook.Sheets("Liga").UsedRange.Columns.Count
'Spalte 1 - Dateinamen
oTargetSheet.Cells(lErgebnisZeile, 1).Value = sDatei
'Spalte 2 bis n - Tabelleninhalte des Arbeitsblattes "Gesamt"
oTargetSheet.Cells(lErgebnisZeile, s + 1).Value = _
oSourceBook.Sheets("Liga").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
End Sub
Gruß
Fred

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Inhalte aus Dateien
16.02.2020 15:51:48
Nepumuk
Hallo Fred,
einfach per Autofilter die Leerzeilen ausblenden un die Daten in einem Rutsch kopieren. Anschließend in Spalte A den Dateinamen einfügen.
Gruß
Nepumuk
AW: Inhalte aus Dateien
16.02.2020 16:03:12
Fred
Hallo Nepumuk,
die zu importierenden Daten aus den Tabellenblättern "Liga" sind ab A3 (Spalten A:CM) lückenlos bis zum "offenen Ende, über 3000 Zeilen" lückenlos.
Der "Zusatz" mit dem Dateinamen in Spalte "A" ist eigentlich unwichtig.
Mit dem VBA wollte ich eigentlich das "händische" umgehen,- sind im Ordner immerhin über 20 Dateien, welche wöchentlich 2x aktualisiert werden .....
Gruß
Fred
AW: Inhalte aus Dateien
16.02.2020 16:08:56
Nepumuk
Hallo Fred,
dann kannst du doch diese Zeile löschen:
 If Trim(CStr(oSourceBook.Sheets("Liga").Cells(z, 3).Value))  "" Then

und den gesamten Bereich auf einmal kopieren.
Gruß
Nepumuk
Anzeige
AW: Inhalte aus Dateien
16.02.2020 16:21:20
Fred
Hallo Nepumuk,
ich habe
               'Keine Leerzeilen verarbeiten
If Trim(CStr(oSourceBook.Sheets("Liga").Cells(z, 3).Value))  "" Then
For s = 1 To oSourceBook.Sheets("Liga").UsedRange.Columns.Count
'Spalte 1 - Dateinamen
oTargetSheet.Cells(lErgebnisZeile, 1).Value = sDatei
und
End If
gelöscht.
Allerdings keine deutliche Verbesserung.
Gruß
Fred
AW: Inhalte aus Dateien
16.02.2020 16:34:30
Nepumuk
Hallo Fred,
teste mal:
Option Explicit

Sub Tabellen_aus_Dateien()
    
    Const sPfad As String = "C:\Users\Fred Neumann\Desktop\Blog\Strategie1\03_5Jahre\"
    
    Dim oTargetSheet As Worksheet
    Dim oSourceBook As Workbook
    Dim sDatei As String
    Dim lErgebnisZeile As Long
    Dim s As Long
    Dim z As Long
    
    Application.ScreenUpdating = False 'Das "Flackern" ausstellen
    
    'Schritt 1: Neues Arbeitsblatt für die Ergebnisse erstellen
    ' Set oTargetSheet = ActiveWorkbook.Sheets.Add
    Set oTargetSheet = ThisWorkbook.Worksheets("Gesamt")
    lErgebnisZeile = 10 'Ergebnisse eintragen ab Zeile 10
    
    'Schritt 2: Schleife über alle Excel Dateien in einem Verzeichnis
    
    sDatei = Dir$(CStr(sPfad & "*.xl*")) 'Alle Excel Dateien
    
    Do Until sDatei = vbNullString
        
        'Schritt 3: öffnen der Datei und Datenübertragung
        Set oSourceBook = Workbooks.Open(sPfad & sDatei, False, True) 'nur lesend öffnen
        
        Call oSourceBook.Sheets("Liga").UsedRange.Copy( _
            Destination:=oTargetSheet.Cells(lErgebnisZeile, 2))
        
        With oTargetSheet
            
            .Range(.Cells(lErgebnisZeile, 1), .Cells(.Cells(.Rows.Count, 2).End(xlUp).Row, 1)).Value = sDatei
            
            
            lErgebnisZeile = .Cells(.Rows.Count, 2).End(xlUp).Offset(1, 0).Row
            
        End With
        
        'Schritt 4: Datei wieder zu machen und nächste Schleifenrunde
        Call oSourceBook.Close(SaveChanges:=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
End Sub

Gruß
Nepumuk
Anzeige
Nepumuk, Super!
16.02.2020 16:41:55
Fred
Hallo Nepumuk,
GENIAL !!
Im Schnitt pro Datei-Inhalt ca. 1 Sek.
Super!!
und Danke!
Gruß
Fred
AW: Inhalte aus Dateien
16.02.2020 16:25:42
Fred
Nepumuk,
das Script sieht nun so aus:
Sub Tabellen_aus_Dateien()
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
Application.Calculation = xlCalculationManual
'Schritt 1: Neues Arbeitsblatt für die Ergebnisse erstellen
' Set oTargetSheet = ActiveWorkbook.Sheets.Add
Set oTargetSheet = ActiveWorkbook.Sheets("Gesamt")
lErgebnisZeile = 10 'Ergebnisse eintragen ab Zeile 10
'Schritt 2: Schleife über alle Excel Dateien in einem Verzeichnis
sPfad = "C:\Users\Fred Neumann\Desktop\Blog\Strategie1\03_5Jahre\"
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 = 3 To oSourceBook.Sheets("Liga").UsedRange.Rows.Count
' ab hier verändert_______________________________________
For s = 1 To oSourceBook.Sheets("Liga").UsedRange.Columns.Count
'Spalte 2 bis n - Tabelleninhalte des Arbeitsblattes "Tabelle1"
oTargetSheet.Cells(lErgebnisZeile, s + 1).Value = _
oSourceBook.Sheets("Liga").Cells(z, s).Value
Next s
lErgebnisZeile = lErgebnisZeile + 1
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
Application.Calculation = xlAutomatic
End Sub

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige