12.9k Aufrufe
Gefragt in Tabellenkalkulation von vbanull Einsteiger_in (59 Punkte)
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

13 Antworten

0 Punkte
Beantwortet von hajo_zi Experte (9.1k Punkte)
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
0 Punkte
Beantwortet von vbanull Einsteiger_in (59 Punkte)
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
0 Punkte
Beantwortet von hajo_zi Experte (9.1k Punkte)
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
0 Punkte
Beantwortet von hajo_zi Experte (9.1k Punkte)
Hallo Klaus,

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

Gruß Hajo
0 Punkte
Beantwortet von vbanull Einsteiger_in (59 Punkte)
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
0 Punkte
Beantwortet von hajo_zi Experte (9.1k Punkte)
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
0 Punkte
Beantwortet von vbanull Einsteiger_in (59 Punkte)
Super ;-)

Bis später... muss jetzt wech.
0 Punkte
Beantwortet von vbanull Einsteiger_in (59 Punkte)
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
0 Punkte
Beantwortet von hajo_zi Experte (9.1k Punkte)
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
0 Punkte
Beantwortet von hajo_zi Experte (9.1k Punkte)
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
...