Quelle: https://www.herber.de/cgi-bin/eachthread.pl?idx=1989201
Stand: 01.09.2024 14:00
Hier der Eröffnungsbeitrag aus dem Forum:
Hallo liebes Forum,
ich stehe vor der Aufgabe, aus einer in EXCEL importierten csv eine Tabelle zu erstellen, in der die Daten eines Zeilenblocks nun in einer neuen Tabelle zeilenweise dargestellt werden. Es geht um die Verarbeitung von Berichtsinhalten.
Tabelle 1 (Quelle):
…ist eine importierte csv, in der die Daten eines Berichtes in einem Zeilenblock enthalten sind (z.B. Zeile 5 bis 25, die Größe der Zeilenblöcke variiert). Die Werte stehen in unterschiedlichen Spalten.
Für den Start eines Blockes gibt es in einer Zeile ein eindeutiges Kriterium (Zelleninhalt: „Berichtsnummer”), das Ende des Blocks wird durch ein erneutes Startkriterium markiert (Röw‑1).
Tabelle 2 (Ziel):
Die oben identifizierten Zeilenblöcke sollen nun in der Zieltabelle im gleichen Arbeitsblatt IN EINE ZEILE geschrieben werden.
Es werden nur ausgewählte Zeilen übertragen werden, die Spalten in der Zieltabelle sind fix.
Ergebnis soll sein, dass jeder Bericht in einer Zeile dargestellt wird.
Eine Beispiel-Datei findet Ihr hier: https://www.herber.de/bbs/user/171822.xlsx
Ich bin gespannt und schon einmal Danke für die Tipps…Pluto
Bitte beachten Sie die hier beschriebene Besonderheit in Sachen des Herber-Forums.
Ein anderer Helfer hat eine step-by-step – Anleitung für Power Query geschrieben. Ich habe diese, nachdem ich meine eigene Lösung erstellt hatte, exakt so wie dargelegt nachvollzogen und trotz Anpassung der Spaltennamen (Überschriften) rasch erkannt, dass das Ziel nicht erreicht wird. Ähnlich erging es dem Fragesteller. Darauf gehe ich nicht weiter ein.
Meine Lösung basiert auf der im Forum verLinkten Beispiel-Datei und ist auf der PQ-Basis.
Dieses ist der (bei mir) zu 100% funktionierende M-Code:
let Quelle = Excel.CurrentWorkbook(){[Name="Tabelle1"]}[Content], #"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"Spalte1", Int64.Type}, {"Spalte2", type text}, {"Spalte3", type any}, {"Spalte4", type text}, {"Spalte5", type text}, {"Spalte6", type number}}), // Ist zwar wie ein Index, aber ein durch PQ erzeugter "echter" Index ist sicherer. Darum hier überflüssig und -> löschen #"Entfernte Spalten" = Table.RemoveColumns(#"Geänderter Typ",{"Spalte1"}), // Bei anderen importierten csv-Files evtl. anpassen #"Entfernte oberste Zeilen" = Table.Skip(#"Entfernte Spalten",2), #"Entpivotierte andere Spalten" = Table.UnpivotOtherColumns(#"Entfernte oberste Zeilen", {"Spalte2"}, "Attribut", "Wert"), // Die alten Spaltennamen werden nicht mehr gebraucht #"Entfernte Spalten1" = Table.RemoveColumns(#"Entpivotierte andere Spalten",{"Attribut"}), #"Hinzugefügter Index" = Table.AddIndexColumn(#"Entfernte Spalten1", "Index", 0, 1, Int64.Type), #"Hinzugefügte bedingte Spalte" = Table.AddColumn(#"Hinzugefügter Index", "Idx", each if [Spalte2] = "Berichtsnummer" then [Index] else null), // So werden die Gruppen gebildet #"Nach unten gefüllt" = Table.FillDown(#"Hinzugefügte bedingte Spalte",{"Idx"}), // Überflüssige Spalten sollten aus Performance-Gründen so rasch wie möhlich gelöscht werden #"Entfernte Spalten2" = Table.RemoveColumns(#"Nach unten gefüllt",{"Index"}), #"Pivotierte Spalte" = Table.Pivot(#"Entfernte Spalten2", List.Distinct(#"Entfernte Spalten2"[Spalte2]), "Spalte2", "Wert"), #"Entfernte Spalten3" = Table.RemoveColumns(#"Pivotierte Spalte",{"Idx"}), #"Geänderter Typ1" = Table.TransformColumnTypes(#"Entfernte Spalten3",{{"Beginn", type time}, {"Ende", type time}}), // Hätte schon wesentlich früher durch Filtern der entsprechenden Zeilen passieren können (und auch sollen), aber der Tranparenz wegen erst hier… #"Entfernte Spalten4" = Table.RemoveColumns(#"Geänderter Typ1",{"Klasse", "Material", "Raum"}) in #"Entfernte Spalten4"
… Und wie immer: Transparenz und Nachvollziehbarkeit auch für Einsteiger sind mir wichtiger als „möglichst wenige Code-Zeilen“. 😛
Und hier, beim Stichwort last but not least finden Sie noch einen Hinweis, wo und wie Sie Antworten auf eventuelle Fragen oder auch die ausgearbeitete Datei bekommen können. Grundlegendes zum Thema M-Code lesen Sie hier im Blog nach.