ich bin auf der Suche nach einer Lösung/einem Makro für folgendes Problem:
Ich habe mehrere Dateien, welche ich mittels PowerQuery zu einer Gesamttabelle zusammenführe. Die Gesamttabelle enthält in den Spalten A1 bis U1 Überschriften, danach folgen die Date zeilenweise. In den Spalten D bis P kommen oftmals gleiche Werte vor, wohingegen die Werte in den Spalten A,R,S,T,Q und U differieren.
Mein Ziel ist es nun, via Makro o. Ä. gleiche Daten in einem Zielarbeitsblatt zum Teil an bestimmten Stellen, zum Teil untereinander auszuweisen (s. Beispiel), bestenfalls nach datum (U) sortiert. Dies soll für jeden Datensatz mit gleichen Werten (Spalte G,E,D) geschehen. Gleichzeitig soll der Komplette Inhalt (U) lesbar sein ohne die Zelle anklicken zu müssen (automatische Größe).
Für Lösungsvorschläge wäre ich dankbar, meine Ausgangstabelle enthälte mehrere tausend Zeilen.
- Sortieren der Spalte Q - Die eindeutigen "Schlüssel"-Kombinationen aus den Spalten G, D und E lassen sich einfach und schnell per Dictionary erfassen. - Autofilter setzen für jeden Schlüssel aus dem Dic. - Der Rest ist dann stupide Fleißarbeit: Daten blockweise transferieren - dafür sind dann keinerlei vertiefte VBA-Kenntnisse erforderlich.
18.04.2024, 17:43 (Dieser Beitrag wurde zuletzt bearbeitet: 18.04.2024, 17:45 von Ralf A.)
mal abgesehen davon, dass Dein Beispiel nicht zur Beschreibung passt und wenn Du keine Lust hast was passendes zu präsentieren, ich hab keine Lust was passendes zu basteln, bleibt die Frage: warum extra VBA? Warum erledigst Du das nicht auch in PQ?
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben. Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.
Ciao, Ralf
Folgende(r) 1 Nutzer sagt Danke an Ralf A für diesen Beitrag:1 Nutzer sagt Danke an Ralf A für diesen Beitrag 28 • derHoepp
bei deinem Beispiel sind noch einige Fragen offen. Könnte man per Makro erledigen. Ich sehe in der Zieltabelle in Spalte E Werte aus der Gesamttabelle. Aber aus welcher Zeile??? Soll nur eine Zeile kopiert werden, und wenn ja welche??? Das ist im Beispiel nicht ersichtlich.
Ab Zeile 23 stehen Werte als ganzer Block, nur aus verschiedenen Spalten der Gesamttabelle. Müssen diese Werte immer in die Zeile 23 kopiert werden, oder ist das variabel??
Sollen in der Zieltabelle nur die Daten in Spalte A aufsteigend sortiert werden? Oder alle Spalten?? Das sollte man vorher wissen, damit wir nicht umsonst arbeiten.
19.04.2024, 10:09 (Dieser Beitrag wurde zuletzt bearbeitet: 19.04.2024, 10:11 von Stoffo.)
Hallo,
zunächst vielen Dank für die konstruktiven Antworten.
@EarlFred: Danke für die Rückmeldung habe mich mit Dictionaries noch nicht befasst, werde mich aber mal belesen. Hinsichtlich des Autofilters bin ich nicht sicher ob dieser mein Anliegen hinreichend abbilden kann (s. Kommentar zum Beitrag von Gast 123). Wie ist da deine Einschätzung? Die stupide Fleißarbeit würde ich gerne weitestgehend automatisieren wollen, daher der Ansatz via VBA. Ggf. ist eine VBA (o.Ä.) Umsetzung die Dictionaries und automatisierung ermöglicht realisierbar?
@ Ralf A: Habe mir Mühe gegeben mein Anliegen möglichst nachvollziehbar darzulegen, daher kann ich deine "Laune" diesbezüglich nicht nachvollziehen. Erläutere mir gerne wo deine Probleme liegen und ich versuche meine Schilderungen/das Beispiel konkreter zu formulieren. VBA deshalb, da es für als der sinnvollste Weg erscheint, bin jedoch auch für jeden anderen Lösungsweg offen. Abgesehen vom Daten zusammenführen sind meine PQ-Kenntnisse jedoch begrenzt.
@Gast 123: Danke für die Rückmeldung. Bei den Werten aus den Spalten E3:E18 der Zieltabelle ist letztlich egal aus welcher Zeile der Gesamttabelle sie stammen, da es sich in der Gesamttabelle um identische Daten handelt. Es geht also darum, dass diese Blöcke (Im Beispiel bspw. A2:U5; A6:U7; A8:U10) jeweils nach Q aufsteigend sortiert werden. Die einzelnen Blöcke sollen dann bspw. als separate Arbeitsblätter o. Ä. in einer Zieltabelle aufgelistet werden, damit ich diese im Anschluss drucken kann und je Zieltabelle nur einen Block der Gesamttabelle drucke. Die Sortierung richtet sich also nach zusammenhängenden Blöcken und zusätzlich einer aufsteigenden sortierung nach Spalte Q. Nachtrag: Ja, ein Kopieren ab Zeile 23 ist immer erforderlich.
(19.04.2024, 10:09)Stoffo schrieb: …Wie ist da deine Einschätzung? Die stupide Fleißarbeit würde ich gerne weitestgehend automatisieren wollen, daher der Ansatz via VBA….
Meine Einschätzung auf Grundlage meiner Interpretation der Aufgabe, die ich trotz Unschärfen meine grundlegend begriffen zu haben, habe ich dir gegeben, ich wüsste nicht, warum ich die nochmals kundtun oder ändern sollte, sofern du nicht eine präzisierte Beschreibung nachlieferst. Ich habe schon verstanden, dass du das mit VBA lösen willst, daher bezog sich „stupide Fleißarbeit“ auf das Schreiben des Codes für die von mir beschriebenen Schritte. Das ist keine Herausforderung, sondern einfach lästig, weswegen das dein Part wird.
19.04.2024, 17:33 (Dieser Beitrag wurde zuletzt bearbeitet: 19.04.2024, 17:35 von Ralf A.)
(19.04.2024, 10:09)Stoffo schrieb: @ Ralf A: Habe mir Mühe gegeben mein Anliegen möglichst nachvollziehbar darzulegen, daher kann ich deine "Laune" diesbezüglich nicht nachvollziehen. Erläutere mir gerne wo deine Probleme liegen und ich versuche meine Schilderungen/das Beispiel konkreter zu formulieren. VBA deshalb, da es für als der sinnvollste Weg erscheint, bin jedoch auch für jeden anderen Lösungsweg offen. Abgesehen vom Daten zusammenführen sind meine PQ-Kenntnisse jedoch begrenzt.
Dann will ich Dir mal meine "Laune" erklären... Ich kann bisher nur vermuten, was Du willst. Und ich vermute, dass im Zielblatt, Spalte E in den Zeilen 3 bis 18 Filter gesetzt werden sollen. Genau weiß ich das aber nicht. Deshalb:
1. Im Zieldatenblatt hast Du in Spalte E, Zeilen 3 bis18, 4 Blöcke die angeblich jeweils EINEN Wert einer Spalte der Gesamttabelle beinhalten sollen. Welchen, das kann ich nicht erkennen. Zumal keiner der in Ziel angegebenen Werte in Gesamt enthalten ist. 2. Ist diese Blockdarstellung überhaupt erwünscht oder soll sie mir irgendwas sagen? Welche der von den im Zielblatt angegebenen Darstellungen ist denn nun das Ziel? Die obere oder die untere Darstellung? Oder doch beide? Wie sollen oben die Werte ermittelt werden? 3. Ab Zeile 23 im Zielblatt zeigst Du eine andere Ansicht als darüber. Ebenfalls mit Werten, die nicht oder zumindest nicht eindeutig zuzuordnen sind. Wenn Du schon Werte verwendest, dann verwende welche, die in der Quelle und im Ziel eindeutig zuzuordnen sind und das Ziel der Lösung eindeutig repräsentieren.
Der sicherste Ansatz für einen Irrtum ist der Glaube, alles im Griff zu haben. Nur, weil ich den Recorder bedienen kann, macht mich das noch lange nicht zum Musiker.
hier mal eine Beispieldatei von mir. Ich bin gespannt ob damit das Problem gelöst ist?? Hinweis: die Daten in Zieltabelle Spalte D werden aus Zeile 2 Gesamttabelle kopiert.
21.04.2024, 09:23 (Dieser Beitrag wurde zuletzt bearbeitet: 21.04.2024, 09:23 von Stoffo.)
Hallo zusammen,
zunächst weiterhin vielen Dank für eure Bemühungen. Ich habe nun ein wenig rumgebastelt und bin zumindest einen Schritt weiter. Anbei ein erster Makroentwurf:
Code:
Sub DatenAufteilen()
Dim GesamtTabelle As Worksheet Dim letzteZeile As Long Dim i As Long, j As Long, k As Long Dim eindeutigeDatensaetze As Object Dim datensatz As String Dim zielBlatt As Worksheet Dim zielZeile As Long
' Arbeitsblatt für die Gesamttabelle festlegen Set GesamtTabelle = ThisWorkbook.Worksheets("Gesamttabelle") ' Name des Arbeitsblatts mit den Gesamtdaten
' Dictionary für eindeutige Datensätze erstellen Set eindeutigeDatensaetze = CreateObject("Scripting.Dictionary")
' Letzte Zeile in der Gesamttabelle ermitteln letzteZeile = GesamtTabelle.Cells(Rows.Count, 1).End(xlUp).Row
' Schleife über die Daten in der Gesamttabelle For i = 2 To letzteZeile ' Überschriften in der ersten Zeile Daten ab der zweiten Zeile ' Eindeutigen Datensatz zusammensetzen (von Spalte D bis P) datensatz = "" For j = 4 To 16 ' Spalte D-P datensatz = datensatz & GesamtTabelle.Cells(i, j).Value & "|" Next j
' Überprüfen, ob der Datensatz bereits existiert If Not eindeutigeDatensaetze.exists(datensatz) Then ' Eindeutigen Datensatz in das Dictionary eintragen eindeutigeDatensaetze.Add datensatz, True
' Neues Arbeitsblatt für den Datensatz erstellen Set zielBlatt = ThisWorkbook.Worksheets.Add zielBlatt.Name = "Datensatz_" & eindeutigeDatensaetze.Count
' Daten in das Ziel-Arbeitsblatt kopieren For j = 1 To 13 ' zielBlatt.Cells(j + 2, 5).Value = GesamtTabelle.Cells(i, j + 3).Value ' Offset um 3 Spalten nach rechts, da wir bei Spalte D beginnen Next j
' Einträge aus den anderen Spalten einfügen zielZeile = 23 ' Startzeile für die Einträge aus den anderen Spalten For k = i To letzteZeile ' Überprüfen, ob der Datensatz zu dem aktuellen Datensatz des Zielarbeitsblatts gehört If datensatz = "" Then Exit For If datensatz = Left(GesamtTabelle.Cells(k, 4).Value & "|" & GesamtTabelle.Cells(k, 5).Value & "|" & GesamtTabelle.Cells(k, 6).Value & "|" & GesamtTabelle.Cells(k, 7).Value & "|" & GesamtTabelle.Cells(k, 8).Value & "|" & GesamtTabelle.Cells(k, 9).Value & "|" & GesamtTabelle.Cells(k, 10).Value & "|" & GesamtTabelle.Cells(k, 11).Value & "|" & GesamtTabelle.Cells(k, 12).Value & "|" & GesamtTabelle.Cells(k, 13).Value & "|" & GesamtTabelle.Cells(k, 14).Value & "|" & GesamtTabelle.Cells(k, 15).Value & "|" & GesamtTabelle.Cells(k, 16).Value & "|", Len(datensatz)) Then ' Eintrag gehört zum gleichen Datensatz, in die Ziel-Tabelle einfügen zielBlatt.Cells(zielZeile, 1).Value = GesamtTabelle.Cells(k, 17).Value ' Spalte Q zielBlatt.Cells(zielZeile, 2).Value = GesamtTabelle.Cells(k, 1).Value ' Spalte A zielBlatt.Cells(zielZeile, 3).Value = GesamtTabelle.Cells(k, 18).Value ' Spalte R zielBlatt.Cells(zielZeile, 4).Value = GesamtTabelle.Cells(k, 19).Value ' Spalte S zielBlatt.Cells(zielZeile, 5).Value = GesamtTabelle.Cells(k, 20).Value ' Spalte T zielBlatt.Cells(zielZeile, 6).Value = GesamtTabelle.Cells(k, 21).Value ' Spalte U zielZeile = zielZeile + 1 End If Next k End If Next i
' Benutzer informieren MsgBox "Daten wurden erfolgreich aufgeteilt und angeordnet.", vbInformation End Sub
dies funktioniert schon einigermaßen wie gewünscht. Leider ist es so, dass aktuell in den einzelnen Datensätzen ab Zeile 23 auch Zeilen aufgeführt werden wenn die Spalten R-U allesamt 0-Werte enthalten -> würde ich gerne ausschließen. Ggf. habt ihr ja Lösungsideen/Verbesserungsvorschläge.
Ich hoffe durch das Makro wird mein Anliegen insgesamt klarer.
' Überprüfen, ob das Zielblatt Daten ab Zeile 23 enthält und dann sortieren If zielZeile > 23 Then ' Sortieren des Zielbereichs ab Zeile 23 nach Spalte A With zielBlatt.Sort .SortFields.Clear .SortFields.Add Key:=zielBlatt.Range("A23"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal .SetRange zielBlatt.Cells(23, 1).Resize(zielZeile - 22, 6) ' Bereich ab Zeile 23, 6 Spalten .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End If