online 1
gast (50)

/ Forum / Tabellenkalkulation

TabellenkalkulationTabellenkalkulation

Fragevon vbanull vom 18.08.2022, 12:28 Options

Lösung

Excel-Dateien zusammenfassen

Hallo,

ich bin neu hier und möchte mit VBA folgendes tun:

Ich habe in einem Verzeichnis 50 Excel Dateien.

Alle Dateien haben spaltenmäßig den gleichen Aufbau aber die Anzahl der Zeilen ist unterschiedlich. Es gibt jeweils nur eine Registerkarte

Ich möchte folgendes tun:

Alle Daten der Dateien in einer neuen Sammel-Datei zusammenfassen. In einer neuen Spalte soll der jeweilige Quell-Dateiname stehen.

Kann mir jemand helfen?

Gruss
Klaus


Antwort schreiben

Antwort 1 von Hajo_Zi vom 18.08.2022, 12:36 Options

Hallo Klaus,

das ist bestimt per VBA möglich. Aber welche Excel Version? Das sol alles in eine Tabelle untereinander? Jede Tabelle enthält eine Überschriftenzeile in Zeile 1?

Gruß Hajo

Antwort 2 von vbanull vom 18.08.2022, 12:52 Options

Hallo Hajo,

Excel 2010. Alles Untereinander. Und in jeder Zeile dann in der neuen Spalte den Dateinamen der Ursprungstabelle ...

Überschriftenzeile ist jeweils auch da. Die kann man einfach mitkopieren und später manuell rausschmeißen. Weglassen wäre aber natürlich noch besser wenn es via VBA mit vertretbarem Aufwand machbar ist ...

Gruss
Klaus

Antwort 3 von Hajo_Zi vom 18.08.2022, 13:08 Options

Hallo Klaus,

in vba ist alles machbar. Der Aufwand die Überschriften Zeilen ab Folgetabelle entfallen zu lassen oder mit zu kopieren ist der gleiche.
Das Programm Ansicht ist schon der Aufwand.
Die Beiträge dienen erstmal nur der Klärung des Sachverhaltes, bevor der Code zusammen kopiert wird und Teile ergänzt wird.
Zum Ablauf, wo soll das Makro abgelegt werden?
Hier würde ich Dir vorschlagen das in eine Datei in dem Ordner abzulegen, diese wäre dann auch die ersten zeilen in der Tabelle und es bräuchte nicht der Ordner für die Ablage eingegeben werden, da dieser dann ja bekannt.
Die zusammenfassung würde dann auch in diesem Ordner abgelegt werden.
Welchen Datenamen soll die neue Datei bekommen?
Muss geprüft werden ob diese Datei schon vorhanden ist?
Du merkst an meinen umfangreichen Beiträgen, das dies Programm nicht so zwischen 12:00 Uhr und Mittag erstellt wird.

Gruß Hajo

Antwort 4 von Hajo_Zi vom 18.08.2022, 13:18 Options

Hallo Klaus,

den Code kann ich auch erst am Abend erstellen, da hier keine Version >2003.

Gruß Hajo

Antwort 5 von vbanull vom 18.08.2022, 13:30 Options

Hallo Hajo,

in dem Verzeichnis sind nur die 50 Excel-Dateien.

Makro und die Ergebnisdatei kann man auch dort ablegen

Das Makro wäre idealerweise in einer Datei die z.b. Makro_Zusammenfassen.xlsm heißt.

Die zusammengefaßten Daten könnte man ablegen in der Datei Ergebnis.xls oder so ähnlich.

Mir ist klar , das das nicht auf die Schnelle geht aber vielleicht kannst Du einen ähnlichen VBA-Code aus deiner Sammlung anpassen. Mein VBA-Wissen ist sehr bescheiden da ich mehr mit SQL arbeite. Ich will auch niemanden über Gebühr strapazieren ...


Hintergrund der ganzen Aktion:
Bei ARIVA.de kann man historische Börsendaten je Aktie runterladen.

Beispiel:
http://www.ariva.de/quote/historic.m?secu=291&boerse_id=6

Das Downloaden geht noch manuell. Aber das Zusammenfassen in eine Excel-Tabelle ist manuell zu fehlerbelastet und zu aufwendig.

Die fertige Excel-Tabelle möchte ich dann in eine DB importieren.

Gruss
Klaus

Antwort 6 von Hajo_Zi vom 18.08.2022, 13:41 Options

Hallo Klaus,

ich gehe also davon aus es gibt zusätzliche Dateien. Warum nicht eine?
1. Datei mit Makro
2. Datei mit Zusammenfassung
beide Datweien sind schon da.
Es wird die Datei mit Makro geöfffnet und das Makro gestartet. ZU Beginn wird die Datei "Ergebnis.xls" geöffnet und alles ab Zeile 2 gelöschet und dann die Daten aus den 50ff Dateien kopiert.
Dazu braucht es nicht 2 Dateien. Das Makro könnte auch in der Datei "Ergebnis.xls" sein.
Es sind alles XLSX Dateien? oder auch xXLS?
Die Reihenfolge der Daten in der Datei "Ergebnis.xls "i st Egal?

Gruß Hajo

Antwort 7 von vbanull vom 18.08.2022, 13:46 Options

Super ;-)

Bis später... muss jetzt wech.

Antwort 8 von vbanull vom 18.08.2022, 14:01 Options

Hallo Hajo,

Ergebnis und Makrodatei darf natürlich auch eine Datei sein ... man könnte das Makro auch in die erste Einzeldatei schreiben (wäre aber vielleicht nicht unbedingt opti)

die Dateien aus dem Download sind eigentlich csv-Dateien (da kann ich aber xlsx daraus machen)

die Reihenfolge in der Ergebnisdatei spielt absolut keine Rolle

wichtig ist nur, daß in jeder Zeile der Quelldateiname steht, da im Quelldateinamen die WKN (Wertpapierkennnummer) enthalten ist

sobald eine Datei verarbeitet wurde könnte man diese auch löschen - dadurch wird es vielleicht einfacher

die Makro/Ergebnisdatei kann auch in einem anderem Verzeichnis sein, dann kann könnte man die Quelldateien nach und nach einlesen und gleich löschen - wird es dadurch einfacher zum Programmieren?

Bis später
Klaus

Antwort 9 von Hajo_Zi vom 18.08.2022, 14:19 Options

Hallo Klaus,

die Datein brauchen nicht gelöscht werden.
Mit CSV Dateien habe ich noch nicht gearbeitet, solche habe ich auch nicht.
Ich gehe dan von XLSX aus. Aber am späten Nachmitag.
Ein anndere Order wäre schlect, da dann wieder der Ordner eingegeben werden muss bzw. fest im Code programiert werden muss.

Gruß Hajo

Antwort 10 von Hajo_Zi vom 18.08.2022, 16:07 OptionsLösung

Lösung
Hallo Klaus,


jetzt bin ich an meinem Home-Pc und da arbeitet es sich gleich besser.
Für den Code beachten.
Im VBA Editor, Extra, Verweise
' Verweis: Microsoft Scripting Runtime
Das Makro Start ist das Start Maro. Das Makro gehört in die Datei "Ergebnis.XLS"
Die Überschriftenzeile ist dort schon vorhanden und es werden ale XLSX Dateien eingelesen.

Option Explicit

' Dieser Source stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.
' Der VB Code ist aus dem Beitrag http://www.activevb.de/tipps/vb6tipps/tipp0492.html
' Verweis: Microsoft Scripting Runtime
' Originalcode
'Dim i As Long
'With Application.FileSearch
'    .NewSearch
'    .LookIn = ActiveWorkbook.Path   'Suchverzeichnis
'    .SearchSubFolders = False       'True wäre mit Unterverzeichnissen
'    .Filename = "*.csv"             'Dateien die mit .csv änden
'    .Execute                        'suche ausführen
'    For i = 1 To .FoundFiles.Count
'        Application.StatusBar = "-->>   Einlesen der Datei:  " & i & " / " & .FoundFiles.Count & "  <<--"
'        Call importieren_und_verschieben(.FoundFiles(i))
'    Next i
'End With
'
Dim LoJ As Long                                     ' Variable für Zeile

Sub Start()
    ' alles Löschen außer Zeile 1
    Application.ScreenUpdating = False
    If ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row > 1 Then
        Rows("2:" & ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row).Delete
    End If
    LoJ = 2
    SearchInFolder ThisWorkbook.Path
    Application.ScreenUpdating = True
End Sub

Private Sub SearchInFolder(ByVal Folderspec As String)  ' auslesen aufrufen mit Ordnername
    Dim StTyp As String                                 ' Dateityp
    Dim FSO As New FileSystemObject
    Dim SearchFolder As Folder
    Dim FD As Folder, FI As File
    Dim EachFil As Files, EachFold As Folders
    Dim LoI As Long                                     ' Laufvariable zum schreiben der Ordner
    Dim Loletzte As Long                                ' Variable für letzte Zeile
    Dim InSpalte As Integer                             ' Variable für Spalte
    StTyp = "xlsx"
    Set SearchFolder = FSO.GetFolder(Folderspec)
    Set EachFil = SearchFolder.Files            ' Dateien in der jeweiligen Root
'   Dateien auslesen
    For Each FI In EachFil                      ' Schleife über alle Dateien
'       Dateityp feststellen
        If UCase(Right(FI.Name, Len(FI.Name) - InStrRev(FI.Name, "."))) = UCase(StTyp) Then
            If UCase(Right(FI.Name, 4)) = "XLSX" Then
                Workbooks.Open ThisWorkbook.Path & "\" & FI.Name
                Loletzte = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
                InSpalte = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column
                Range(Range("A1"), Cells(Loletzte, InSpalte)).Copy ThisWorkbook.Worksheets(1).Cells(LoJ, 2)
                With ThisWorkbook.Worksheets(1)
                    .Range(.Cells(LoJ, 1), .Cells(LoJ + Loletzte - 1, 1)) = ActiveWorkbook.Name
                End With
                LoJ = LoJ + Loletzte
                ActiveWorkbook.Close False
            End If
        End If
    Next FI
    Set EachFil = Nothing
    Set EachFold = Nothing
    Set FSO = Nothing
End Sub


Gruß Hajo

Antwort 11 von vbanull vom 18.08.2022, 16:40 Options

Hallo Hajo,

ich sach nur: Wooooooooooooooooow!

hat auf Anhieb funktioniert ... oh Mann dafür hätte ich lange gebraucht und es am Ende doch nicht auf die Reihe bekommen

das Script ist auch sau schnell!

für was ist der Haken gut bei Verweis: Microsoft Scripting Runtime?

Das Script kann ich übrigens öfter nutzen und ich denke auch andere User ...

Tausend Dank
Klaus

Antwort 12 von Hajo_Zi vom 18.08.2022, 16:44 Options

Hallo Klaus,

den Verweis braucht die Funktion zum auslesen des Verzeichisses. Ab 2007 gibt es "Application.FileSearch" nicht mehr.

Gruß Hajo

Antwort 13 von vbanull vom 18.08.2022, 17:13 Options

Hallo Hajo,

alles klar.

Ich habe jetzt alle 50 Dateien zusammengefaßt - sind jetzt über 125.000 Zeilen!

Excel 2003 war noch auf 65.536 (2^16) beschränkt

man kann über MS lästern wie man will - gute Qualität liefern sie schon ab - und ne klasse Community gibt es auch in den meisten Bereichen ;)

Nochmals Danke
Klaus

Ähnliche Themen

Excel Zeilen zusammenfassen und zählen
ThaNeub  25.05.2009 - 502 Hits - 2 Antworten

mehrere Dateien in einer zusammenfassen
Mona1980  24.06.2009 - 444 Hits - 10 Antworten

Excel-Tabellen aus mehreren Datein in ein Tabellenblatt zusammenfassen
hpoelleritzer  12.01.2010 - 767 Hits - 1 Antwort

Hinweis

Diese Frage ist schon etwas älter, Sie können daher nicht mehr auf sie antworten. Sollte Ihre Frage noch nicht gelöst sein, stellen Sie einfach eine neue Frage im Forum..

Neue Einträge

Version: supportware 1.9.150 / 10.06.2022, Startzeit:Mon Jan 26 07:32:25 2026