Exceldateien per Makro zusammenführen
Zusammenführung von ca. 50 Dateien mit fester Struktur, aber ohne eindeutige Zeilen/Spaltenstruktur in eine neue Tabelle
Hallo,
ich bin neu im Forum und die Suche hat mir in meinem speziellen Fall leider nicht helfen können.
Ich habe verschiedene Plandateien (Projekte) und möchte diese Daten in eine neue Tabelle zusammenführen.
Die Struktur der Quelle ist bspw. B2 (Text/Bezeichnung) und C2 (Wert) dann B4 (Text/Bezeichnung) und C4 (Wert). Möglich ist aber auch B34 (Bezeichnung) und Werte in C34-M34 und C44-M44...
Ich denke damit wird das Problem schon offensichtlich. Die neue Tabelle soll in den Spalten mit den Bezeichnungen gefüllt werden, aber für jeden Wert aus den Bereichen C34-M34 und C44-M44 eine neue Zeile mit den kompletten restlichen Daten füllen.
Vielleicht kann mir jemand helfen, ich kenne mich so schon nicht mit Makros aus und dieses Thema ist eindeutig zu komplex für mich.
Gerne kann ich auch ein oder zwei Beispieldateien als Muster zur Verfügung stellen.
Beste Grüße
hirotake
Hallo,
ich bin neu im Forum und die Suche hat mir in meinem speziellen Fall leider nicht helfen können.
Ich habe verschiedene Plandateien (Projekte) und möchte diese Daten in eine neue Tabelle zusammenführen.
Die Struktur der Quelle ist bspw. B2 (Text/Bezeichnung) und C2 (Wert) dann B4 (Text/Bezeichnung) und C4 (Wert). Möglich ist aber auch B34 (Bezeichnung) und Werte in C34-M34 und C44-M44...
Ich denke damit wird das Problem schon offensichtlich. Die neue Tabelle soll in den Spalten mit den Bezeichnungen gefüllt werden, aber für jeden Wert aus den Bereichen C34-M34 und C44-M44 eine neue Zeile mit den kompletten restlichen Daten füllen.
Vielleicht kann mir jemand helfen, ich kenne mich so schon nicht mit Makros aus und dieses Thema ist eindeutig zu komplex für mich.
Gerne kann ich auch ein oder zwei Beispieldateien als Muster zur Verfügung stellen.
Beste Grüße
hirotake
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 44637
Url: https://administrator.de/forum/exceldateien-per-makro-zusammenfuehren-44637.html
Ausgedruckt am: 23.04.2025 um 07:04 Uhr
19 Kommentare
Neuester Kommentar
Hallo hirotake!
Könntest Du konkret den Aufbau der gewünschten Zieltabelle beschreiben?
Grüße
bastla
Ich denke damit wird das Problem schon offensichtlich.
Leider nein. Insbesondere erschließt sich mir der Zusammenhang zwischen den Zeilen 2 bzw 4 und der Zeile 34 nebst 44 nicht.Könntest Du konkret den Aufbau der gewünschten Zieltabelle beschreiben?
Gerne kann ich auch ein oder zwei Beispieldateien als Muster zur Verfügung stellen.
Das wäre sicher nützlich.Grüße
bastla

Hi,
willkommen im Forum!
Eine Frage hätte ich auch noch:
Kommen die Dateien alle aus einem Verzeichnis, oder wie werden sie identifiziert?
Psycho
willkommen im Forum!
Eine Frage hätte ich auch noch:
Kommen die Dateien alle aus einem Verzeichnis, oder wie werden sie identifiziert?
Psycho

Also ich hab das so verstanden:
In Spalte B steht immer die Bezeichnung und dahinter in unterschiedlich vielen Spalten (C...) die Werte. Diese sollen nun in der neuen Tabelle zu einem Wert in Spalte C zusammengefasst werden. Richtig?
Psycho
In Spalte B steht immer die Bezeichnung und dahinter in unterschiedlich vielen Spalten (C...) die Werte. Diese sollen nun in der neuen Tabelle zu einem Wert in Spalte C zusammengefasst werden. Richtig?
Psycho
Hallo hirotake!
Abgesehen davon, dass ich für die Spalten C-M auf 11 Monatswerte (Jan-Nov?) komme, kann ich weiterhin nicht wirklich nachvollziehen, wie das Ergebnis aussehen soll. Meinst Du es etwa so:
... und das für alle einzelnen Dateien?
Vielleicht sollte ich tatsächlich erst einen Blick in die Tabellen werfen ...
Für den Upload könntest Du zb http://www.filepot.de/ verwenden.
Grüße
bastla
Abgesehen davon, dass ich für die Spalten C-M auf 11 Monatswerte (Jan-Nov?) komme, kann ich weiterhin nicht wirklich nachvollziehen, wie das Ergebnis aussehen soll. Meinst Du es etwa so:
A | B | C | D | E | F |
B2 | C2 | B4 | C4 | B34 | C34 |
B2 | C2 | B4 | C4 | B34 | D34 |
B2 | C2 | B4 | C4 | B34 | E34 |
... | ... | ... | ... | ... | ... |
B2 | C2 | B4 | C4 | B34 | M34 |
B2 | C2 | B4 | C4 | B44 | C44 |
... | ... | ... | ... | ... | ... |
B2 | C2 | B4 | C4 | B44 | M44 |
Vielleicht sollte ich tatsächlich erst einen Blick in die Tabellen werfen ...
Für den Upload könntest Du zb http://www.filepot.de/ verwenden.
Grüße
bastla

@bastla:
ich hab zwei Dateien von ihm bekommen. Das macht die Sache nicht einfacher!
Falls er sch heute nicht mehr meldet und du noch Lust hast, lasse ich sie dir zukommen.
Psycho
ich hab zwei Dateien von ihm bekommen. Das macht die Sache nicht einfacher!
Falls er sch heute nicht mehr meldet und du noch Lust hast, lasse ich sie dir zukommen.
Psycho
Hallo hirotake!
Das folgende VBA-Programm fasst die von Dir zur Verfügung gestellten Beispieldateien nach dem Muster Deiner Zieldatei zusammen.
Alle mit "'###" gekennzeichneten Zeilen enthalten Werte, die ev anzupassen sind, insbesondere aufgrund der folgenden Hinweise:
Unterhalb der Markierung "'############################" musst Du keine Änderungen vornehmen.
Grüße
bastla
[Edit]
Dim-Statement für "iZeile" richtig platziert
(Die"iZeile"-Zuweisung hatte ich aus Gründen der Übersichtlichkeit nach oben verschoben.)
[/Edit]
[Edit2]
Nach
oZielBlatt.Cells(iZeile, iSpalte).Value = sBesonderheit
fehlte noch die Zeile
iSpalte = iSpalte + 1
Das Problem war mir nicht aufgefallen, da die Musterdateien keine "Besonderheiten" eingetragen hatten.
Wegen der Änderung der Position der "Besonderheiten" (siehe unten) wird diese zusätzliche Zeile nun tatsächlich nicht benötigt.
[/Edit2]
Das folgende VBA-Programm fasst die von Dir zur Verfügung gestellten Beispieldateien nach dem Muster Deiner Zieldatei zusammen.
Alle mit "'###" gekennzeichneten Zeilen enthalten Werte, die ev anzupassen sind, insbesondere aufgrund der folgenden Hinweise:
- Die zu bearbeitenden Dateien ("Quell-Dateien") werden im "QuellPfad" anhand eines Kennzeichens im Dateinamen (Annahme: "_PSB_") gesucht.
- Eingetragen werden alle Daten in die "Tabelle1" der beim Start des Programms ausgewählten Datei.
- Die Einträge in die Zieldatei beginnen in der "Startspalte" (als Nummer einzutragen; derzeit: 1 für Spalte A) und der ersten Zeile, in welcher die Zelle der Startspalte noch leer ist. Die Suche nach leeren Zellen beginnt in "iZeile" (derzeit: 2). Durch diese Suche wird verhindert, dass bei späteren Datenübernahmen bereits vorhandene Zeilen überschrieben werden.
- Sollten in der Quelldatei mehrere "Besonderheiten" eingetragen sein, werden diese in einer Zelle der Zieltabelle, getrennt durch einen "Delimiter" (derzeit " | "), zusammengefasst.
- Trotz des uneinheitlichen Aufbaues der Quelldaten (in den Blöcken 1 und 2 bis Spalte M/N, in Block 3 bis Spalte O/P) werden als Vereinfachung in allen Blöcken die Spalten zwischen der ersten Datenspalte "DatenMinSpalte" (numerisch; derzeit: 3 für Spalte C) und der letzten Datenspalte "DatenMaxSpalte" (numerisch; derzeit: 15 für Spalte O) überprüft und nicht leere Zellen übernommen (Wert sowie Zahlenformat und Ausrichtung).
Unterhalb der Markierung "'############################" musst Du keine Änderungen vornehmen.
Option Explicit
Sub Collect()
'zu bearbeitende Quell-Dateien
Const sQuellPfad As String = "D:\ADM\" '###
Const sKennzeichen As String = "_PSB_" '###
'Quelldaten
'Stammdaten
Const sStamm As String = "E4:E5,E7:E10,E12:E13,E15:E19,O15:O16,K19" '###
Const sBesonderheiten As String = "B54:B56" '###
Const sDelim As String = " | " '### Trennzeichen bei mehreren Besonderheiten
'Quell-Datenzeilen
Dim iDatenZeile(3, 4) As Integer
Dim iDatenBlockAnzahl As Integer, iDatenZeilenAnzahl As Integer
iDatenZeile(1, 0) = 23 '###
iDatenZeile(1, 1) = 24 '###
iDatenZeile(1, 2) = 25 '###
iDatenZeile(1, 3) = 28 '###
iDatenZeile(1, 4) = 31 '###
iDatenZeile(2, 0) = 33 '###
iDatenZeile(2, 1) = 34 '###
iDatenZeile(2, 2) = 35 '###
iDatenZeile(2, 3) = 38 '###
iDatenZeile(2, 4) = 41 '###
iDatenZeile(3, 0) = 43 '###
iDatenZeile(3, 1) = 44 '###
iDatenZeile(3, 2) = 45 '###
iDatenZeile(3, 3) = 48 '###
iDatenZeile(3, 4) = 51 '###
iDatenBlockAnzahl = UBound(iDatenZeile, 1)
iDatenZeilenAnzahl = UBound(iDatenZeile, 2)
'Quell-Datenspalten
Const iDatenMinSpalte As Integer = 3 '### ab Spalte C
Const iDatenMaxSpalte As Integer = 15 '### bis Spalte O
Dim iDatenSpaltenAnzahl As Integer
iDatenSpaltenAnzahl = (iDatenMaxSpalte - iDatenMinSpalte) / 2 + 1
'Zieldatei
Dim oZielBlatt As Object
Set oZielBlatt = ThisWorkbook.Worksheets("Tabelle1") '### Blattnamen festlegen
'Zieldaten
Const iStartSpalte As Integer = 1 '### ab Spalte A
Dim iZeile As Integer
iZeile = 2 '### Erste mögliche Datenzeile der Zieldatei
'################################################################
Dim fso As Object
Dim oQuellDatei As Object, sQuellDatei As String
Dim iQuellDateienAnzahl As Integer
iQuellDateienAnzahl = 0
Dim oQuellBlatt As Object
Dim rStammWerte As Object, oStammWert As Object
Dim oBesonderheit As Object, sBesonderheit As String
Dim iSpalte As Integer
Dim iBlock As Integer, z As Integer, s As Integer
'Zeile für erste Eintragung bestimmen
Do While oZielBlatt.Cells(iZeile, iStartSpalte).Value <> ""
iZeile = iZeile + 1
Loop
Set fso = CreateObject("Scripting.FileSystemObject")
For Each oQuellDatei In fso.GetFolder(sQuellPfad).Files
sQuellDatei = oQuellDatei.Name
If InStr(sQuellDatei, sKennzeichen) Then 'Kennzeichen im Dateinamen enthalten?
Workbooks.Open oQuellDatei.Path
iQuellDateienAnzahl = iQuellDateienAnzahl + 1
'Stammdaten lesen (inkl. Zusammenfassung Besonderheiten)
Set oQuellBlatt = Workbooks(sQuellDatei).Worksheets(1)
Set rStammWerte = oQuellBlatt.Range(sStamm).Cells
sBesonderheit = ""
For Each oBesonderheit In oQuellBlatt.Range(sBesonderheiten).Cells
If oBesonderheit.Value <> "" Then
If sBesonderheit = "" Then
sBesonderheit = oBesonderheit.Value
Else
sBesonderheit = sBesonderheit & sDelim & oBesonderheit.Value
End If
End If
Next
'Alle Datenzeilen durchsuchen
For iBlock = 1 To iDatenBlockAnzahl
For s = 1 To iDatenSpaltenAnzahl
For z = 1 To iDatenZeilenAnzahl
'Falls Eintrag vorhanden, Zeile in Zieltabelle erzeugen
If oQuellBlatt.Cells(iDatenZeile(iBlock, z), iDatenMinSpalte + s * 2 - 2) <> "" Then
'Stammdaten eintragen
iSpalte = iStartSpalte
For Each oStammWert In rStammWerte.Cells
With oZielBlatt.Cells(iZeile, iSpalte)
.Value = oStammWert.Value
.NumberFormat = oStammWert.NumberFormat
.HorizontalAlignment = oStammWert.HorizontalAlignment
End With
iSpalte = iSpalte + 1
Next
oZielBlatt.Cells(iZeile, iSpalte).Value = sBesonderheit
'Daten und ausgewählte Formate übernehmen
With oZielBlatt.Cells(iZeile, iSpalte + z * 2 - 2)
.Value = oQuellBlatt.Cells(iDatenZeile(iBlock, z), iDatenMinSpalte + s * 2 - 2).Value
.NumberFormat = oQuellBlatt.Cells(iDatenZeile(iBlock, z), iDatenMinSpalte + s * 2 - 2).NumberFormat
.HorizontalAlignment = oQuellBlatt.Cells(iDatenZeile(iBlock, z), iDatenMinSpalte + s * 2 - 2).HorizontalAlignment
End With
With oZielBlatt.Cells(iZeile, iSpalte + z * 2 - 1)
.Value = oQuellBlatt.Cells(iDatenZeile(iBlock, z), iDatenMinSpalte + s * 2 - 1).Value
.NumberFormat = oQuellBlatt.Cells(iDatenZeile(iBlock, z), iDatenMinSpalte + s * 2 - 2).NumberFormat
.HorizontalAlignment = oQuellBlatt.Cells(iDatenZeile(iBlock, z), iDatenMinSpalte + s * 2 - 2).HorizontalAlignment
End With
With oZielBlatt.Cells(iZeile, iSpalte + iDatenZeilenAnzahl * 2)
.Value = oQuellBlatt.Cells(iDatenZeile(iBlock, 0), iDatenMinSpalte + s * 2 - 2).Value
.NumberFormat = oQuellBlatt.Cells(iDatenZeile(iBlock, 0), iDatenMinSpalte + s * 2 - 2).NumberFormat
.HorizontalAlignment = oQuellBlatt.Cells(iDatenZeile(iBlock, 0), iDatenMinSpalte + s * 2 - 2).HorizontalAlignment
End With
iZeile = iZeile + 1 'Zeilennummer für nächste Zeile der Zieltabelle
End If
Next 'z
Next 's
Next 'iBlock
Workbooks(sQuellDatei).Close SaveChanges:=False
End If
Next 'oQuellDatei
MsgBox iQuellDateienAnzahl & " Dateien bearbeitet."
End Sub
Grüße
bastla
[Edit]
Dim-Statement für "iZeile" richtig platziert
(Die"iZeile"-Zuweisung hatte ich aus Gründen der Übersichtlichkeit nach oben verschoben.)
[/Edit]
[Edit2]
Nach
oZielBlatt.Cells(iZeile, iSpalte).Value = sBesonderheit
fehlte noch die Zeile
iSpalte = iSpalte + 1
Das Problem war mir nicht aufgefallen, da die Musterdateien keine "Besonderheiten" eingetragen hatten.
Wegen der Änderung der Position der "Besonderheiten" (siehe unten) wird diese zusätzliche Zeile nun tatsächlich nicht benötigt.
[/Edit2]
Hallo hirotake!
Ein wenig Arbeit wollte ich Dir auch übrig lassen ...
Die Überschriften hast Du aber ohnehin schon in Deiner Zieldatei - einfach ganze Zeile kopieren ...
(Ich war davon ausgegangen, dass Du die Zieldatei laufend ergänzen und daher immer die gleiche Datei verwenden wirst - daher auch das "Unten anstückeln" der Daten.)
Grüße
bastla
Ein wenig Arbeit wollte ich Dir auch übrig lassen ...
Die Überschriften hast Du aber ohnehin schon in Deiner Zieldatei - einfach ganze Zeile kopieren ...
(Ich war davon ausgegangen, dass Du die Zieldatei laufend ergänzen und daher immer die gleiche Datei verwenden wirst - daher auch das "Unten anstückeln" der Daten.)
Grüße
bastla
Hallo hirotake!
Die Platzierung entstammte der Grundüberlegung, alle gleich bleibenden Daten zusammenzufassen.
Um wieder die ursprüngliche Anordnung zu erhalten, ersetze bitte die Zeile
durch
Grüße
bastla
Die Platzierung entstammte der Grundüberlegung, alle gleich bleibenden Daten zusammenzufassen.
Um wieder die ursprüngliche Anordnung zu erhalten, ersetze bitte die Zeile
oZielBlatt.Cells(iZeile, iSpalte).Value = sBesonderheit
oZielBlatt.Cells(iZeile, iSpalte + iDatenZeilenAnzahl * 2 + 1).Value = sBesonderheit
Grüße
bastla