tw3aker
Goto Top

Inhalte vieler excel dateien auslesen und als Liste wiedergeben

Hallo miteinander,


Habe Frage: wie kann ich mit einer Excel Datei einen Ordner und dessen Unterordner auslesen.

Die Dateien haben immer an derselben Stelle ein Datum C4 stehen.

Es kann sein, dass einige Dateien mehr als ein Tabellenblatt haben. Die Datei sollte in der Lage sein, immer das erste Tabellen Blatt auszulesen.

Das Datum und die Inhalte von B6:B55;C6:C55;D6:D55;E6:E55 sofern werte sind, soll die Datei nach Datum gelistet diese in eine Tabelle listen. Diese Tabelle sollte fortlaufend sein. Das Datum sollte vor jede Zeile wiederholt werden, in der es Werte aus dem Tabellenblatt gibt. werden, um eine Verwechslungsgefahr zu vermeiden.

Die Namen der Tabellenblätter sind unbekannt.


LG by Bastian

Content-Key: 328662

Url: https://administrator.de/contentid/328662

Printed on: April 23, 2024 at 08:04 o'clock

Mitglied: 132272
132272 Feb 07, 2017 updated at 10:10:17 (UTC)
Goto Top
Member: tw3aker
tw3aker Feb 07, 2017 at 10:20:25 (UTC)
Goto Top
Danke für diese Information.

Genau aber mit dem Standartgedöns versuche ich seit zwei Tagen ein sauber funktionierendes VBA zu erstellen.

Leider mit nicht sehr viel Erfolg. Deswegen habe ich mich hier direkt im Forum gemeldet.

Gruß
Member: Kraemer
Kraemer Feb 07, 2017 at 10:22:04 (UTC)
Goto Top
Moin,

wie wäre es denn, wenn du dein Versuche hier mal posten würdest? Dann könnte man dir evtl. auch helfen.

Gruß Krämer
Member: tw3aker
tw3aker Feb 07, 2017 at 10:32:44 (UTC)
Goto Top
Dim fso As Object
Sub ImportData()
Dim col As New Collection, file As Variant, wb As Workbook, rngDest As Range
'Ordner der die Dateien enthält
Const FOLDER = "C:\Users\**\Desktop\test auslesen"
'Filesystemobject
Set fso = CreateObject("Scripting.FileSystemObject")
'alle Excel-Dateien rekursiv listen
getAllFiles fso.GetFolder(FOLDER), True, Array("xlsx", "xls"), col
'Screenupdates und eventuelle Dialoge für Batchbetrieb unterdrücken
Application.DisplayAlerts = False
Application.ScreenUpdating = False
With Sheets(1)
'nächste freie Zelle in Spalte A ermitteln
Set rngDest = .Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)
'Für jede Excel-Datei
For Each file In col
'Workbook öffnen
Set wb = Workbooks.Open(file)
'Range B20:B21 ins Sheet kopieren
wb.Sheets(1).Range("C2").Copy rngDest
wb.Sheets(2).Range("D4:D41").Copy rngDest
wb.Sheets(3).Range("F4:F41").Copy rngDest
wb.Sheets(4).Range("G4:G41").Copy rngDest
wb.Sheets(5).Range("H4:H41").Copy rngDest
'WB schließen
wb.Close False
'nächste freie Zelle setzen
Set rngDest = rngDest.Offset(5, 0)
Next
End With
'Screenupdates und Dialoge wieder einschalten
Application.ScreenUpdating = True
Application.DisplayAlerts = True
End Sub

Sub getAllFiles(ByVal fldr As Object, boolRecursion As Boolean, arrFileExtensions As Variant, ByRef col As Collection)
For Each file In fldr.Files
For i = 0 To UBound(arrFileExtensions)
If LCase(arrFileExtensions(i)) = LCase(fso.GetExtensionName(file.Path)) Then
col.Add file.Path
Exit For
End If
Next
Next
If boolRecursion Then
For Each subFolder In fldr.SubFolders
getAllFiles subFolder, True, arrFileExtensions, col
Next
End If
End Sub


Ziel ist, dass die Datei quasi in "Auswertung" alles schreibt, was sie im ausgewählten Ordner findet, sofern etwas in folgenden Bereichen steht.
"C2""D4:D41""F4:F41""G4:G41""H4:H41"

C2 ist ein Datum, das sollte in Spalte 1 ausgegeben werden, D;F;G;H; sind werte , sollten in Spalte 2,3,4,5 ausgegeben werden. Das Datum soll sich vor jedem Wert aus der Datei wiederholen.

Was zu berücksichtigen ist, dass die Datei auch die Unterordner durchsucht.

Danke und Gruß
Mitglied: 132272
Solution 132272 Feb 07, 2017 updated at 17:04:29 (UTC)
Goto Top
Und Zeile D3:H3 enthält Überschriften?

Wenn ja das hier tut das: auch mit allen Files eines Ordners (inkl. Unterordner) - getestet.

p.s. wenn man schon Code irgendwo kopiert sollte man auch die Quelle nennen
Excel Makro, VBA soll Pfad auslesen Ordner inkl. Unterordner die vorliegenden Excel Dateien öffnen und 2 bestimmt Zellen in eine neue Excel untereinander schreiben

Dim fso As Object
Sub ImportData()
    Dim col As New Collection, file As Variant, wb As Workbook, rngDest As Range, ws As Worksheet, rngSource As Range
    'Ordner der die Dateien enthält  
    Const FOLDER = "C:\Ordner"  
    'Filesystemobject  
    Set fso = CreateObject("Scripting.FileSystemObject")  
    'alle Excel-Dateien rekursiv listen  
    getAllFiles fso.GetFolder(FOLDER), True, Array("xlsx", "xls"), col  
    'Screenupdates und eventuelle Dialoge für Batchbetrieb unterdrücken  
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    
    With Sheets(1)
        'Für jede Excel-Datei  
        For Each file In col
            'nächste freie Zelle in Spalte A ermitteln  
            Set rngDest = .Cells(Rows.Count, "A").End(xlUp).Offset(1, 0)  
            'mit erstem Sheet des Workbooks arbeiten  
            With GetObject(file).Sheets(1)
                ' Wenn C2 nicht leer ist  
                If .Range("C2").Value <> "" Then  
                    'Daten ermitteln  
                    Set rngSource = .Range("D3:H" & .Cells(Rows.Count, "D").End(xlUp).Row)  
                    'Wenn Daten vorhanden sind  
                    If rngSource.Rows.Count > 1 Then
                        ' exclude die Überschriften  
                        Set rngSource = rngSource.Offset(1)
                        ' Kopiere die Daten ins Ziel  
                        rngSource.Copy
                        rngDest.Offset(0, 1).PasteSpecial xlPasteValuesAndNumberFormats
                        ' Setze Datum vor die Zeilen  
                        rngDest.Resize(rngSource.Rows.Count - 1).Value = .Range("C2").Value  
                    End If
                End If
                'Workbook schließen  
                .Parent.Close False
            End With
        Next
    End With
    'Screenupdates und Dialoge wieder einschalten  
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub

Sub getAllFiles(ByVal fldr As Object, boolRecursion As Boolean, arrFileExtensions As Variant, ByRef col As Collection)
    For Each file In fldr.Files
        For i = 0 To UBound(arrFileExtensions)
            If LCase(arrFileExtensions(i)) = LCase(fso.GetExtensionName(file.Path)) Then
                col.Add file.Path
                Exit For
            End If
        Next
    Next
    If boolRecursion Then
        For Each subFolder In fldr.SubFolders
            getAllFiles subFolder, True, arrFileExtensions, col
        Next
    End If
End Sub
Member: tw3aker
tw3aker Feb 07, 2017 at 11:49:29 (UTC)
Goto Top
Klasse! Danke! Hast recht, entschuldige, habe ich vergessen. Jetzt noch eine frage, da ich in den excel dateien Formeln habe, kann die auswerung auch nur den Wert also ohne Formel kopieren?? So habe ich aktuell sehr viele leerzeilen.
Member: tw3aker
tw3aker Feb 07, 2017 at 11:50:22 (UTC)
Goto Top
ja a3 bis i3 sind Überschriften
Mitglied: 132272
132272 Feb 07, 2017 at 12:12:00 (UTC)
Goto Top
kann die auswerung auch nur den Wert also ohne Formel kopieren??
Ja .Copy und .PasteSpecial sind deine Freunde.
Member: tw3aker
tw3aker Feb 07, 2017 at 12:19:48 (UTC)
Goto Top
Habe die Datei von dir, jetzt das ein zwei Mal ausprobiert. Da hat alles funktioniert. Jetzt kann ich sie aber nicht mehr ausführen: Laufzeitfehler 1004
Und melded die Set rngSource = .Range("D3:H" & .Cells(Rows.Count, "D").End(xlUp).Row)

das Paste muss ich hier einbauen oder??

rngSource.Copy rngDest.Offset(0, 1)

Danke und Gruß
Mitglied: 132272
132272 Feb 07, 2017 updated at 17:06:43 (UTC)
Goto Top
Jetzt kann ich sie aber nicht mehr ausführen: Laufzeitfehler 1004
Dann hängt bei dir was im Hintergrund. Abmelden oder alle Excelinstanzen im Taskmgr killen.
das Paste muss ich hier einbauen oder??
Siehe Änderung Code oben
' .......  
' Kopiere die Daten ins Ziel  
rngSource.Copy
rngDest.Offset(0, 1).PasteSpecial xlPasteValuesAndNumberFormats
Member: tw3aker
tw3aker Feb 07, 2017 at 17:46:09 (UTC)
Goto Top
Hey, tausend dank. Habe den Code geändert. Habe jetzt sogar zwischenzeitlich den PC gewechselt und weiterhin den Fehler gehabt.... anfangs hat die Datei mit genau den Excel Dateien einwandfrei funktioniert,.... verstehe ich nicht,... er öffnet im Hintergrund die erste Datei und dann stockt er und bringt mir den Laufzeit Fehler...
Kann das daran liegen, dass die Seite nicht immer auf dem ersten Tabellenblatt gespeichert wurde??
Letztlich brauche ich die Werte nur aus dem ersten Tabellen Blatt der Excel Dateien..

Vielen Dank und lieben Gruß
Mitglied: 132272
Solution 132272 Feb 07, 2017 updated at 17:57:20 (UTC)
Goto Top
Kann das daran liegen, dass die Seite nicht immer auf dem ersten Tabellenblatt gespeichert wurde??
Letztlich brauche ich die Werte nur aus dem ersten Tabellen Blatt der Excel Dateien..
Du widersprichst dir hier selber, obiger Code nimmer immer das Tabellenblatt das ganz links in der Liste der Tabs liegt, was du an
GetObject(file).Sheets(1)
sehen kannst.

Es wird eine deiner Dateien einfach fehlerhaft aufgebaut sein. Kann ich hier leider nicht sehen.

Mehr helfe ich dir gerne, ist dann aber nich mehr umsonst.
Member: tw3aker
tw3aker Feb 07, 2017 at 20:47:57 (UTC)
Goto Top
Wollte mich noch einmal ganz herzlich für deine Hilfe bedanken. Habe den Fehler gefunden. Liegt daran, dass einige Dateien noch auf .xls Format sind und der Rest .xlsx..... mit den .xls hat er ein Problem...

habe es jetzt so gebaut, dass die Datei erst Auswerten leert bei öffnen, dann die Werte abfragt.


Lieben Gruß und danke nochmal