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
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