hirotake
Goto Top

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

Content-Key: 44637

Url: https://administrator.de/contentid/44637

Printed on: April 19, 2024 at 05:04 o'clock

Member: bastla
bastla Nov 16, 2006 at 14:08:56 (UTC)
Goto Top
Hallo hirotake!

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
Mitglied: 8644
8644 Nov 16, 2006 at 14:12:37 (UTC)
Goto Top
Hi,

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

Psycho
Member: hirotake
hirotake Nov 16, 2006 at 14:20:15 (UTC)
Goto Top
Hallo Psycho,

Hi,

willkommen im Forum!

Danke!

Eine Frage hätte ich auch noch:
Kommen die Dateien alle aus einem
Verzeichnis, oder wie werden sie
identifiziert?

Ja, die Dateien stehen alle in einem Verzeichnis. Ich könnte aber auch alle Tabellenblätter in eine Datei zusammenkopieren. Aktuell steht in den Quelldateien je Datei nur ein Tabellenblatt.

Beste Grüße
hirotake
Mitglied: 8644
8644 Nov 16, 2006 at 14:25:10 (UTC)
Goto Top
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
Member: hirotake
hirotake Nov 16, 2006 at 14:32:43 (UTC)
Goto Top
Hallo bastla,

Könntest Du konkret den Aufbau der
gewünschten Zieltabelle beschreiben?

Grundsätzlich schon. Aber dafür hole ich etwas aus. In der Quelltabelle habe in dem oberen
Bereich sozusagen Projektstammdaten, also B2 Projektnummer -> C2 Wert. In dem unteren Bereich habe ich die Werte nach Monaten. B34 Bezeichnung (Umsatz) C34-M34 Monatswerte (Jan-Jun).

Nun möchte ich in der Zieltabelle für jeden Umsatzwert, Materialwert, etc. eine neue Zeile haben. Dazu brauche ich aber auch jeweils die Stammdaten zu dem Wert aus den oberen Zellen der Tabelle. So dass sich viele der Werte (aus dem Stammdatenbereich) wiederholen werden.

Wie kann ich Dir die Muster zukommen lassen? Mailadresse? Oder wie wird das hier im Forum gehandelt?

Beste Grüße
hirotake
Member: bastla
bastla Nov 16, 2006 at 15:09:01 (UTC)
Goto Top
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:

ABCDEF
B2C2B4C4B34C34
B2C2B4C4B34D34
B2C2B4C4B34E34
..................
B2C2B4C4B34M34
B2C2B4C4B44C44
..................
B2C2B4C4B44M44
... 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
Mitglied: 8644
8644 Nov 16, 2006 at 15:25:44 (UTC)
Goto Top
@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
Member: hirotake
hirotake Nov 16, 2006 at 15:35:59 (UTC)
Goto Top
Member: hirotake
hirotake Nov 16, 2006 at 15:39:14 (UTC)
Goto Top
Hallo psycho,

leider nicht ganz einfach die Aufgabe. Die Vorlage musste ich aber leider so benutzen.

Auch für Dich bestimmt interessant, ich habe das Format der Zieldatei als downloadlink eingestellt (s.u.).

Schon mal danke für Eure Mühe.

Besten Gruß
hirotake
Member: bastla
bastla Nov 16, 2006 at 16:16:16 (UTC)
Goto Top
Hallo hirotake!

Wenn Du jetzt noch tatsächlich Daten aus den beiden Projekttabellen in die Zieltabelle eintragen könntest ...

Grüße
bastla
Member: hirotake
hirotake Nov 17, 2006 at 09:13:29 (UTC)
Goto Top
Hallo bastla,

anbei der Link zu der Zieltabelle.

http://www.filepot.de/download,743,Zieltabelle_werte.xls.html

Ich hoffe, es wird dadurch klar, wie der Aufbau sein soll. Im Prinzip wird für jeden Wert aus dem Block C24 bis O51 eine neue Zeile geschrieben, die alle Informationen aus den anderen Feldern enthält. Dazu muss nur zu jedem Wert jeweils das Datum (Zeilen 23, 33, 43) entsprechend ausgegeben werden und zu jedem Wert das Feld ZK.

Wer sich dieser Sache annehmen mag ist herzlich willkommen... face-wink

Beste Grüße
hirotake
Member: bastla
bastla Nov 18, 2006 at 14:55:27 (UTC)
Goto Top
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:

  • 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]
Member: hirotake
hirotake Nov 18, 2006 at 15:31:57 (UTC)
Goto Top
Hallo bastla,

danke schonmal für Deine Mühe. Ich verstehe zwar nicht alles, aber zum Teil kann ich die Logik nachvollziehen, vor allem mit Deinen Kommentaren. Nun habe ich das Makro gleich mal getestet...

Leider bekomme ich noch eine Fehlermeldung:

"Fehler beim Kompilieren: Variable nicht definiert."

Die Markierung bleibt dann bei " 'Zieldaten -> iZeile" stehen! <-- Was kann ich tun?

Beste Grüße,
hirotake

P.S. Wenn Du mal in Oldenburg bist, gebe ich nen Kaffee aus! face-wink
Member: bastla
bastla Nov 18, 2006 at 15:34:28 (UTC)
Goto Top
Hallo hirotake!

Das kommt davon, wenn man meint, eine funktionierende Lösung fürs Veröffentlichen noch verschönern zu sollen ...

Die Korrektur ist bereits oben eingearbeitet.

Danke für das Angebot - wird sich aber eher nicht so bald ausgehen.

Grüße
bastla
Member: hirotake
hirotake Nov 18, 2006 at 15:42:44 (UTC)
Goto Top
Hallo bastla,

superklasse -> funktioniert.

Nur habe ich in der neuen Datei keine "Überschriften" als Spaltenbezeichnung. Ist das nicht berücksichtigt, oder habe ich da noch was übersehen?

Gruß,

hirotake
Member: bastla
bastla Nov 18, 2006 at 15:47:28 (UTC)
Goto Top
Hallo hirotake!

Ein wenig Arbeit wollte ich Dir auch übrig lassen ... face-wink

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
Member: hirotake
hirotake Nov 18, 2006 at 18:26:45 (UTC)
Goto Top
Hallo bastla,

danke für die Mühe. Das Makro läuft soweit, nur dass ich bei den Besonderheiten in der Zieldatei die Werte in der Spalte R (eigentlich für Anzahlungen) landen.

Ich habe schon ein bißchen was probiert, aber lösen kann ich das Problem so nicht. In der Quelldatei stehen die Texte für die Besonderheiten in den Zellen B54-B56.

Gruß
hirotake
Member: bastla
bastla Nov 18, 2006 at 19:11:46 (UTC)
Goto Top
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
oZielBlatt.Cells(iZeile, iSpalte).Value = sBesonderheit
durch
oZielBlatt.Cells(iZeile, iSpalte + iDatenZeilenAnzahl * 2 + 1).Value = sBesonderheit

Grüße
bastla
Member: hirotake
hirotake Nov 21, 2006 at 15:19:56 (UTC)
Goto Top
Hallo bastla,

das war es nun endgültig! Damit habe ich den perfekten Import (bzw. die perfekte Zusammenführung in eine Zieldatei).

Tolle Arbeit, besten Dank und weiter so...

Beste Grüße

hirotake