Makro zum transponieren von Daten aus mehreren Dateien in eine Sammeldatei
Hallo allerseits,
da meine Kenntnisse mit VBA nicht wirklich ausgereift sind, hier mal mein Problem. Ich denke dass es über ein Makro zu realisieren ist, aber über das wie tappe ich noch im Dunkeln...
Ich hab eine Ansammlung von Dateien, die alle identisch aufgebaut sind, aus denen ich Daten (Werte, nicht die Formeln, vertikal angeordnet) in eine Excelsammeldatei transponoieren will (horizontale Anordnung).
In meiner Sammeldatei sind schon Daten erfasst, die um einige Werte aus den identischen Dateien ergänzt werden sollen. Ich habe mir das fogendermaßen vorgestellt:
In der Sammeldatei sind in der Spalte C (z.b Artikelnummern) eingetragen zu denen in den Spalten D-K Informationen eingetragen sind. Nun sollen also zu jedem Artikel ab der Spalte L die Daten ergänzt werden. In den Quelldateien ist immer in der Zelle B2 die Artikelnummer eingetragen und in den Zellen D5 - D10 die Werte (teilweise durch Formeln berechnet), die ich in meine Sammeldatei transponieren will. Das Makro sollte wie folgt vorgehen:
1. Schriit: Prüfen ob in meiner Sammeldatei z.B. in Zelle C5 eine Artikel-Nr vorhanden ist, wenn ja > 2. Schritt / wenn nein > Ende
2. Schritt: Prüfen ob Zelle L5 leer ist. wenn nein > Schritt 1 für die nächste Zeile (C6) / wenn ja > 3. Schritt
3. Schritt: Prüfen ob zu der Artikel-Nr aus z.B Zelle C5 eine Quelldatei existiert. Also prüfen ob in einer der .xls Quelldateien meines Ordners in der Zelle B2 die gesuchte Artikel-Nr eingetragen ist. wenn nein > Schritt 1 für die nächste Zeile / wenn ja > 4. Schritt
4. Schritt: Transponieren der Daten aus den Zellen D5-D10 aus der gefundenen Datei in meine Sammeldatei in die Zellen L5-Q5 (Zeile der geprüften Artikel-Nr.) danach wieder 1. Schritt
Wie schon gesagt, denke ich dass es machbar ist (falls ich mich irre lasse ich mich da gerne eines besseren belehren
, nur bekomme ich das im VBA nicht in den Griff...
Falls mir jemand helfen kann schon mal vielen Dank im Voraus!
Viele Grüße
Rio
da meine Kenntnisse mit VBA nicht wirklich ausgereift sind, hier mal mein Problem. Ich denke dass es über ein Makro zu realisieren ist, aber über das wie tappe ich noch im Dunkeln...
Ich hab eine Ansammlung von Dateien, die alle identisch aufgebaut sind, aus denen ich Daten (Werte, nicht die Formeln, vertikal angeordnet) in eine Excelsammeldatei transponoieren will (horizontale Anordnung).
In meiner Sammeldatei sind schon Daten erfasst, die um einige Werte aus den identischen Dateien ergänzt werden sollen. Ich habe mir das fogendermaßen vorgestellt:
In der Sammeldatei sind in der Spalte C (z.b Artikelnummern) eingetragen zu denen in den Spalten D-K Informationen eingetragen sind. Nun sollen also zu jedem Artikel ab der Spalte L die Daten ergänzt werden. In den Quelldateien ist immer in der Zelle B2 die Artikelnummer eingetragen und in den Zellen D5 - D10 die Werte (teilweise durch Formeln berechnet), die ich in meine Sammeldatei transponieren will. Das Makro sollte wie folgt vorgehen:
1. Schriit: Prüfen ob in meiner Sammeldatei z.B. in Zelle C5 eine Artikel-Nr vorhanden ist, wenn ja > 2. Schritt / wenn nein > Ende
2. Schritt: Prüfen ob Zelle L5 leer ist. wenn nein > Schritt 1 für die nächste Zeile (C6) / wenn ja > 3. Schritt
3. Schritt: Prüfen ob zu der Artikel-Nr aus z.B Zelle C5 eine Quelldatei existiert. Also prüfen ob in einer der .xls Quelldateien meines Ordners in der Zelle B2 die gesuchte Artikel-Nr eingetragen ist. wenn nein > Schritt 1 für die nächste Zeile / wenn ja > 4. Schritt
4. Schritt: Transponieren der Daten aus den Zellen D5-D10 aus der gefundenen Datei in meine Sammeldatei in die Zellen L5-Q5 (Zeile der geprüften Artikel-Nr.) danach wieder 1. Schritt
Wie schon gesagt, denke ich dass es machbar ist (falls ich mich irre lasse ich mich da gerne eines besseren belehren
Falls mir jemand helfen kann schon mal vielen Dank im Voraus!
Viele Grüße
Rio
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 154004
Url: https://administrator.de/forum/makro-zum-transponieren-von-daten-aus-mehreren-dateien-in-eine-sammeldatei-154004.html
Ausgedruckt am: 20.04.2025 um 02:04 Uhr
10 Kommentare
Neuester Kommentar
Hallo Rio1980!
Ich frage gleich mal gar nicht, weshalb es die Struktur mit mehreren gleich aufgebauten Dateien gibt ...
... aber das Mengengerüst könntest Du vielleicht einmal beschreiben - insbesondere: Passen alle relevanten Daten in den Arbeitsspeicher?
Und: Wie sieht den Dein Code bisher aus? In Deinem Pseudocode hätte ich jedenfalls am Ende des Schrittes 4 noch eine Erhöhung der Zeilennummer erwartet, ehe wieder Schritt 1 aufgerufen wird ...
Grüße
bastla
Ich frage gleich mal gar nicht, weshalb es die Struktur mit mehreren gleich aufgebauten Dateien gibt ...
... aber das Mengengerüst könntest Du vielleicht einmal beschreiben - insbesondere: Passen alle relevanten Daten in den Arbeitsspeicher?
Und: Wie sieht den Dein Code bisher aus? In Deinem Pseudocode hätte ich jedenfalls am Ende des Schrittes 4 noch eine Erhöhung der Zeilennummer erwartet, ehe wieder Schritt 1 aufgerufen wird ...
Grüße
bastla
Hallo Rio1980!
Die Frage nach den Mengen hatte als Hintergrund Performanceüberlegungen - für jeden nicht kompletten Datensatz der Sammeltabelle im Schnitt 100 Dateien öffnen zu müssen würde ich vermeiden wollen - daher die Frage, ob sich die Werte aus den 200 Dateien in einem Vorverarbeitungsschritt auslesen und zB in ein einem "Dictionary" im Arbeitsspeicher unterbringen ließen - oder zumindest in einer einzigen Temporärdatei ...
Grüße
bastla
Die Frage nach den Mengen hatte als Hintergrund Performanceüberlegungen - für jeden nicht kompletten Datensatz der Sammeltabelle im Schnitt 100 Dateien öffnen zu müssen würde ich vermeiden wollen - daher die Frage, ob sich die Werte aus den 200 Dateien in einem Vorverarbeitungsschritt auslesen und zB in ein einem "Dictionary" im Arbeitsspeicher unterbringen ließen - oder zumindest in einer einzigen Temporärdatei ...
Grüße
bastla
Hallo Rio1980!
Wie wird denn die Quelldatei gefunden? Soferne sich der Name aus der Artikelnummer ableiten lässt, hast Du natürlich Recht damit, dass nicht alle Dateien eingelesen werden müssen -
Für diesen Fall hatte ich zwischenzeitlich etwa folgenden (aus der Sammeldatei zu startenden) Ansatz (noch eher schütter kommentiert
) gebastelt (der sich natürlich auch auf das gezielte Öffnen einer bestimmten Datei wird anpassen lassen):
Falls die Excelversion < 2007 (und daher die Sammeldatei als ".xls" und nicht als ".xlsm" gespeichert) ist, sollte die Sammeldatei nicht im vorgegebenen Ordner liegen (oder gezielt anhand eines weiteren "
Grüße
bastla
Wie wird denn die Quelldatei gefunden? Soferne sich der Name aus der Artikelnummer ableiten lässt, hast Du natürlich Recht damit, dass nicht alle Dateien eingelesen werden müssen -
prüfen ob in einer der .xls Quelldateien meines Ordners in der Zelle B2 die gesuchte Artikel-Nr eingetragen ist.
hatte sich für mich allerdings danach angehört, als müsste die Quelldatei erst gesucht werden ...Für diesen Fall hatte ich zwischenzeitlich etwa folgenden (aus der Sammeldatei zu startenden) Ansatz (noch eher schütter kommentiert
Sub CollectAndTrans()
Ordner = "D:\Test"
Dim A()
Set d = CreateObject("Scripting.Dictionary")
Set fso = CreateObject("Scripting.FileSystemObject")
For Each File In fso.GetFolder(Ordner).Files
If UCase(fso.GetExtensionName(File.Name)) = "XLSX" Then
Set WB = Workbooks.Open(File.Path)
ReDim A(5) 'Array passend dimensionieren und dabei löschen
i = 0 'Index für Array initialilsieren
For Each Cell In WB.Worksheets(1).Range("D5:D10")
A(i) = Cell.Value 'Zellwert in Array übernehmen
i = i + 1
Next
'Jede ArtNr kommt nur einmal vor, daher keine Prüfung des Keys erforderlich -
'Artikel kann dem Dictionary hinzugefügt werden
d.Add CStr(WB.Worksheets(1).[B2]), A
WB.Close
End If
Next
R = 5 'ab Zeile 5 der Sammeltabelle
ArtNr = CStr(Cells(R, "C"))
Do Until ArtNr = "" 'bis keine Artikeldaten mehr gefunden werden
If Cells(R, "L") = "" Then
If d.Exists(ArtNr) Then Cells(R, "L").Resize(1, 6).Value = d.Item(ArtNr)
End If
R = R + 1
ArtNr = CStr(Cells(R, "C"))
Loop
End Sub
If
" von der Verarbeitung ausgeschlossen werden).Grüße
bastla
Hallo Rio1980!
In der zweiten Schleife wird die Artikelnummer aus Spalte C gelesen und als Schlüssel verwendet, um aus dem Dictionary (wenn denn ein Eintrag existiert - siehe Zeile 28) die zwischengespeicherten Werte auszulesen und ab Spalte L einzutragen.
Es wird also, abweichend von Deinem Algorithmus, nicht anhand der Artikelnummer die Datei gesucht und dann das Auslesen der Werte vorgenommen, sondern nach den bereits im ersten Schritt erfassten Daten (aller Dateien) im Dictionary gesucht - soferne auch immer alle Dateien in der Sammeldatei repräsentiert sind, ergäbe sich daraus kein Performance-Nachteil.
Hinsichtlich der Aktualisierungen und eines zu befürchtenden "Veraltens" der Daten im Dictionary wäre noch anzumerken, dass diese Datensammlung (im "Dictionary") immer neu erstellt und nur im Arbeitsspeicher abgelegt wird - daher würden nur Dateien, welche erst nachdem das Makro im Ablauf die Zeile 23 erreicht hat, hinzugefügt wurden, nicht berücksichtigt ...
Grüße
bastla
Oder muss ich nochwas anpassen was ich übersehen habe?
Zeile 9?Mir ist nicht ganz klar, wie das Makro die richtige Datei findet, die zur Artk-Nr passt und wie es erkennt in welche Zeile (muss die Zeile der geprüften Artikel-Nr sein) es die übernommenen Daten in die Zellen L-Q der entsprechenden Zeile eingügen soll.
Die Schleife in den Zeilen 8 bis 22 liest aus allen ".xlsx"-Dateien des vorgegebenen Ordners die Werte aus D5:D10 in ein Array ein und legt dieses im Dictionary mit dem Wert von B2 als Schlüssel ab.In der zweiten Schleife wird die Artikelnummer aus Spalte C gelesen und als Schlüssel verwendet, um aus dem Dictionary (wenn denn ein Eintrag existiert - siehe Zeile 28) die zwischengespeicherten Werte auszulesen und ab Spalte L einzutragen.
Es wird also, abweichend von Deinem Algorithmus, nicht anhand der Artikelnummer die Datei gesucht und dann das Auslesen der Werte vorgenommen, sondern nach den bereits im ersten Schritt erfassten Daten (aller Dateien) im Dictionary gesucht - soferne auch immer alle Dateien in der Sammeldatei repräsentiert sind, ergäbe sich daraus kein Performance-Nachteil.
Hinsichtlich der Aktualisierungen und eines zu befürchtenden "Veraltens" der Daten im Dictionary wäre noch anzumerken, dass diese Datensammlung (im "Dictionary") immer neu erstellt und nur im Arbeitsspeicher abgelegt wird - daher würden nur Dateien, welche erst nachdem das Makro im Ablauf die Zeile 23 erreicht hat, hinzugefügt wurden, nicht berücksichtigt ...
Grüße
bastla
Hallo Rio1980!
Hast Du wirklich "XLX"-Dateien? Ich wäre von "XLSX" oder "XLS" ausgegangen ...
automatisieren lassen.
Grüße
bastla
P.S.: Bitte poste Code unter Verwendung der entsprechenden ...
Hast Du wirklich "XLX"-Dateien? Ich wäre von "XLSX" oder "XLS" ausgegangen ...
In Zeile 28 müsste man es wohl auch auf 11 setzen
Was spricht dagegen, es gleich richtig zu machen? Das sollte sich auch mitIf d.Exists(ArtNr) Then Cells(R, "L").Resize(1, UBound(d.Item(ArtNr)) + 1).Value = d.Item(ArtNr)
Grüße
bastla
P.S.: Bitte poste Code unter Verwendung der entsprechenden ...