mehrere Exceldateien in eine Excel Datei zusammenfassen
Hallo alle zusammen,
habe folgebdes Problem, versuche es kurz zusammenzufassen.
habe ca. 370 Excel Dateien die ich gerne zu einer machen will, um die später besser auswerten zu können.
Die Dateinamen sind wie folgt aufgebaut: 151~0006@284774.xls, 151~0007@284774.xls, 151~0008@284774.xls usw. alle Dateien sind gleich aufgebaut und von jeder datei bräuchte ich die Zelleninhalte von C54:C332 und, um die Datensätze wieder identifizieren zu können die Zelle B9, die über jeden Datesatz stehen soll. Die ich aber schon manuell eingetragen habe, sollen aber trotzdem mitgeschrieben werden, falls man Nachforschung betreiben möchte/muss.
das. Beispiel unten haut leider nicht ganz hin, da er die datensätze durcheinander kopiert und ich die später nicht mehr identifizieren kann.
Sub Makro1()
Dim Rohdaten(36) As String
Dim AnzahlDateien
Dim ZuÖffnendeDateien, W, Pfad, excelMesswerteDate
ZuÖffnendeDateien = Application.GetOpenFilename("MPT Meßwerte (*.xls), *.xls", _
, "MPT .xls-Datei auswählen", , True)
If IsArray(ZuÖffnendeDateien) Then
For Each W In ZuÖffnendeDateien
AnzahlDateien = AnzahlDateien + 1
For j = 1 To Len(W)
If Left(Right(W, j), 1) = Application.PathSeparator Then
Exit For
Else
End If
Next j
Rohdaten(AnzahlDateien) = Right(W, j - 1)
Pfad = Left(W, Len(W) - Len(Rohdaten(AnzahlDateien)))
Rohdaten(AnzahlDateien) = _
Left(Rohdaten(AnzahlDateien), Len(Rohdaten(AnzahlDateien)) - 4)
Next W
Else
End If
ThisWorkbook.Activate
Sheets.Add
ActiveSheet.Name = "Tabelle1"
For k = 1 To AnzahlDateien
excelMesswerteDatei = Pfad & Rohdaten(k) & ".xls"
Workbooks.OpenText Filename:= _
excelMesswerteDatei _
, Origin:=xlWindows, StartRow:=54, DataType:=xlDelimited, TextQualifier _
:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:= _
False, Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(Array _
(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8 _
, 1)), DecimalSeparator:=".", ThousandsSeparator:=" ", TrailingMinusNumbers:=False
Range("C54:C332").Select
Selection.Copy
ThisWorkbook.Activate
Sheets("Tabelle1").Select
Cells(2, k + 1).Select
ActiveSheet.Paste
Next k
End Sub
Für eure Unterstützung wäre ich sehr dankbar...
habe folgebdes Problem, versuche es kurz zusammenzufassen.
habe ca. 370 Excel Dateien die ich gerne zu einer machen will, um die später besser auswerten zu können.
Die Dateinamen sind wie folgt aufgebaut: 151~0006@284774.xls, 151~0007@284774.xls, 151~0008@284774.xls usw. alle Dateien sind gleich aufgebaut und von jeder datei bräuchte ich die Zelleninhalte von C54:C332 und, um die Datensätze wieder identifizieren zu können die Zelle B9, die über jeden Datesatz stehen soll. Die ich aber schon manuell eingetragen habe, sollen aber trotzdem mitgeschrieben werden, falls man Nachforschung betreiben möchte/muss.
das. Beispiel unten haut leider nicht ganz hin, da er die datensätze durcheinander kopiert und ich die später nicht mehr identifizieren kann.
Sub Makro1()
Dim Rohdaten(36) As String
Dim AnzahlDateien
Dim ZuÖffnendeDateien, W, Pfad, excelMesswerteDate
ZuÖffnendeDateien = Application.GetOpenFilename("MPT Meßwerte (*.xls), *.xls", _
, "MPT .xls-Datei auswählen", , True)
If IsArray(ZuÖffnendeDateien) Then
For Each W In ZuÖffnendeDateien
AnzahlDateien = AnzahlDateien + 1
For j = 1 To Len(W)
If Left(Right(W, j), 1) = Application.PathSeparator Then
Exit For
Else
End If
Next j
Rohdaten(AnzahlDateien) = Right(W, j - 1)
Pfad = Left(W, Len(W) - Len(Rohdaten(AnzahlDateien)))
Rohdaten(AnzahlDateien) = _
Left(Rohdaten(AnzahlDateien), Len(Rohdaten(AnzahlDateien)) - 4)
Next W
Else
End If
ThisWorkbook.Activate
Sheets.Add
ActiveSheet.Name = "Tabelle1"
For k = 1 To AnzahlDateien
excelMesswerteDatei = Pfad & Rohdaten(k) & ".xls"
Workbooks.OpenText Filename:= _
excelMesswerteDatei _
, Origin:=xlWindows, StartRow:=54, DataType:=xlDelimited, TextQualifier _
:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:= _
False, Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(Array _
(1, 1), Array(2, 1), Array(3, 1), Array(4, 1), Array(5, 1), Array(6, 1), Array(7, 1), Array(8 _
, 1)), DecimalSeparator:=".", ThousandsSeparator:=" ", TrailingMinusNumbers:=False
Range("C54:C332").Select
Selection.Copy
ThisWorkbook.Activate
Sheets("Tabelle1").Select
Cells(2, k + 1).Select
ActiveSheet.Paste
Next k
End Sub
Für eure Unterstützung wäre ich sehr dankbar...
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 62052
Url: https://administrator.de/forum/mehrere-exceldateien-in-eine-excel-datei-zusammenfassen-62052.html
Ausgedruckt am: 12.04.2025 um 13:04 Uhr
14 Kommentare
Neuester Kommentar
Hallo konmaster!
Bessere Antwort wäre gewesen (falls die verwendete Office-Version nicht der Geheimhaltung unterliegt): "Habe Excel 2007 und daher mit der Zeilenanzahl kein Problem ..."
Ansonsten hast Du je Excel-Datei 280 Werte, welche Du nicht in einer Zeile unterbringen kannst, bzw, wenn sie in Spalten stehen sollen und "nur 230 Spalten in Anspruch nehmen..." so zu interpretieren ist, dass nur 230 der 370 Dateien verwendet werden sollen, dann war Deine obige Problembeschreibung irreführend.
Grüße
bastla
Bessere Antwort wäre gewesen (falls die verwendete Office-Version nicht der Geheimhaltung unterliegt): "Habe Excel 2007 und daher mit der Zeilenanzahl kein Problem ..."
Ansonsten hast Du je Excel-Datei 280 Werte, welche Du nicht in einer Zeile unterbringen kannst, bzw, wenn sie in Spalten stehen sollen und "nur 230 Spalten in Anspruch nehmen..." so zu interpretieren ist, dass nur 230 der 370 Dateien verwendet werden sollen, dann war Deine obige Problembeschreibung irreführend.
Grüße
bastla
... bzw, wenn es Dir grundsätzlich möglich war, mit Deinem Code Daten zu erhalten, vielleicht zwischendurch ein Versuch: Ändere die Zeile
auf
und versuch es dann nochmals.
Grüße
bastla
[Edit] Hatte Deinen vorigen Kommentar noch nicht gesehen ... [/Edit]
Dim Rohdaten(36) As String
Dim Rohdaten(250) As String
Grüße
bastla
[Edit] Hatte Deinen vorigen Kommentar noch nicht gesehen ... [/Edit]
Hallo konmaster!
Ergänze den folgenden Code-Block (alt)
zu dieser Fassung:
Zur Sicherheit kannst Du noch in einer der "Dim"-Zeilen oben am Ende ", ID" anfügen.
In der Zwischenzeit habe ich noch eine Alternativ-Lösung versucht:
Kopiere alle (230) Dateien, aus denen Daten übernommen werden sollen, in einen neuen Ordner, zB "D:\Datensammlung". Erstelle eine neue Exceldatei nicht im selben Ordner und füge dort das folgende VBA-Programm in ein Modul ein:
Speichere die Datei und führe den Code aus (wird vermutlich etwas dauern ...). Eventuell musst Du die Formatierungen in der Sammeldatei anpassen, zB per "Format übertragen" (Pinsel-Symbol) aus einer Originaldatei.
Grüße
bastla
P.S.: Habe momentan nicht mehr Zeit, daher dieser Lösungsansatz "auf Verdacht" ...
Ergänze den folgenden Code-Block (alt)
Range("C54:C332").Select
Selection.Copy
ThisWorkbook.Activate
Sheets("Tabelle1").Select
Cells(2, k + 1).Select
ActiveSheet.Paste
<b>ID = Range("B9").Value</b>
Range("C54:C332").Select
Selection.Copy
ThisWorkbook.Activate
Sheets("Tabelle1").Select
Cells(2, k + 1).Select
ActiveSheet.Paste
<b>Cells(1, k + 1).Value = ID</b>
In der Zwischenzeit habe ich noch eine Alternativ-Lösung versucht:
Kopiere alle (230) Dateien, aus denen Daten übernommen werden sollen, in einen neuen Ordner, zB "D:\Datensammlung". Erstelle eine neue Exceldatei nicht im selben Ordner und füge dort das folgende VBA-Programm in ein Modul ein:
Sub Zusammenfassen()
Const sSourcePath = "D:\Datensammlung"
Set wbGes = ActiveWorkbook
Set fso = CreateObject("Scripting.FileSystemObject")
C = 2 '(ab Spalte B in der Sammeltabelle eintragen)
For Each oFile In fso.GetFolder(sSourcePath).Files
'nur .xls-Dateien bearbeiten
If LCase(Right(oFile.Name, 4)) = ".xls" Then
Application.Workbooks.Open (oFile.Path)
ID = ActiveWorkbook.Worksheets(1).Range("B9").Value
aTemp = ActiveWorkbook.Worksheets(1).Range("C54:C332")
ActiveWorkbook.Close
wbGes.Worksheets(1).Cells(1, C).Value = ID
wbGes.Worksheets(1).Range(Cells(2, C), _
Cells(2 + UBound(aTemp) - 1, C)) = aTemp
C = C + 1
End If
Next 'Datei
wbGes.Worksheets(1).Activate
'Gesamt-Datei speichern
wbGes.Save
MsgBox "Fertig."
End Sub
Grüße
bastla
P.S.: Habe momentan nicht mehr Zeit, daher dieser Lösungsansatz "auf Verdacht" ...
Hallo,
ich versuche mich auch grad an einer Vielzahl von Dateien mit unterschiedlichem range. Bei der größten Datei reicht der range von A1 über vier Spalten und 2042 Zeilen.
[code]
ID = ActiveWorkbook.Worksheets(1).Range("A1:Cells[2042]", "[4]").Value
[/code]
Die ursprüngliche Codezeilen sehen so aus:
[code]
ID = ActiveWorkbook.Worksheets(1).Range("C54:C332").Value
aTemp = ActiveWorkbook.Worksheets(1).Range("C54:C332")
[/code]
Der Debugger schllägt in folgender Zeile Alarm:
[code]
wbGes.Worksheets(1).Range ("A1:Cells[3000]", "[4]"), _
Cells(2 + UBound(aTemp) - 1, C) = aTemp
[/code]
Wie definiere ich range richtig?
Wird die Formatierung aus der alten Datei im Normalfall mit übernommen?
bolshi
ich versuche mich auch grad an einer Vielzahl von Dateien mit unterschiedlichem range. Bei der größten Datei reicht der range von A1 über vier Spalten und 2042 Zeilen.
[code]
ID = ActiveWorkbook.Worksheets(1).Range("A1:Cells[2042]", "[4]").Value
[/code]
Die ursprüngliche Codezeilen sehen so aus:
[code]
ID = ActiveWorkbook.Worksheets(1).Range("C54:C332").Value
aTemp = ActiveWorkbook.Worksheets(1).Range("C54:C332")
[/code]
Der Debugger schllägt in folgender Zeile Alarm:
[code]
wbGes.Worksheets(1).Range ("A1:Cells[3000]", "[4]"), _
Cells(2 + UBound(aTemp) - 1, C) = aTemp
[/code]
Wie definiere ich range richtig?
Wird die Formatierung aus der alten Datei im Normalfall mit übernommen?
bolshi
Hallo bolshi!
Damit wird ein Array mit den Werten des Bereichs erstellt, was Deine nächste Frage ("Wird die Formatierung aus der alten Datei im Normalfall mit übernommen?") auch gleich beantworten sollte ...
Im übrigen fände ich es sinnvoll, Dein Vorhaben in einem neuen Beitrag darzustellen (nicht zuletzt auch, da sich außer uns beiden wohl kaum jemand in diesen Thread hier verirren dürfte) ...
Grüße
bastla
Wie definiere ich range richtig?
Wenn Du offensichtlich bereits die gewünschte Zeilen-/Spaltenanzahl kennst, kannst Du das etwa so schreiben:aTemp = ActiveWorkbook.Worksheets(1).Range(Cells(1, 1), Cells(2042, 4)).Value
Im übrigen fände ich es sinnvoll, Dein Vorhaben in einem neuen Beitrag darzustellen (nicht zuletzt auch, da sich außer uns beiden wohl kaum jemand in diesen Thread hier verirren dürfte) ...
Grüße
bastla