(Forum) Zeilenblöcke in neue Tabelle kopieren

Quelle: https://www.herber.de/cgi-bin/eachthread.pl?idx=1989201
Stand: 01.09.2024 14:00


Hier der Eröff­nungs­beitrag aus dem Forum:

Hal­lo liebes Forum,

ich ste­he vor der Auf­gabe, aus ein­er in EXCEL importierten csv eine Tabelle zu erstellen, in der die Dat­en eines Zeilen­blocks nun in ein­er neuen Tabelle zeilen­weise dargestellt wer­den. Es geht um die Ver­ar­beitung von Berichtsin­hal­ten.
Tabelle 1 (Quelle):
…ist eine importierte csv, in der die Dat­en eines Bericht­es in einem Zeilen­block enthal­ten sind (z.B. Zeile 5 bis 25, die Größe der Zeilen­blöcke vari­iert). Die Werte ste­hen in unter­schiedlichen Spal­ten.
Für den Start eines Block­es gibt es in ein­er Zeile ein ein­deutiges Kri­teri­um (Zel­len­in­halt: „Bericht­snum­mer”), das Ende des Blocks wird durch ein erneutes Startkri­teri­um markiert (Röw‑1).

Tabelle 2 (Ziel):
Die oben iden­ti­fizierten Zeilen­blöcke sollen nun in der Zielta­belle im gle­ichen Arbeits­blatt IN EINE ZEILE geschrieben wer­den.
Es wer­den nur aus­gewählte Zeilen über­tra­gen wer­den, die Spal­ten in der Zielta­belle sind fix.
Ergeb­nis soll sein, dass jed­er Bericht in ein­er Zeile dargestellt wird.

Eine Beispiel-Datei find­et Ihr hier: https://www.herber.de/bbs/user/171822.xlsx

Ich bin ges­pan­nt und schon ein­mal Danke für die Tipps…Pluto


Bitte beacht­en Sie die hier beschriebene Beson­der­heit in Sachen des Her­ber-Forums.

Ein ander­er Helfer hat eine step-by-step – Anleitung für Pow­er Query geschrieben. Ich habe diese, nach­dem ich meine eigene Lösung erstellt hat­te, exakt so wie dargelegt nachvol­l­zo­gen und trotz Anpas­sung der Spal­tenna­men (Über­schriften) rasch erkan­nt, dass das Ziel nicht erre­icht wird. Ähn­lich erg­ing es dem Fragesteller. Darauf gehe ich nicht weit­er ein.

Meine Lösung basiert auf der im Forum ver­Link­ten Beispiel-Datei und ist auf der PQ-Basis.


Dieses ist der (bei mir) zu 100% funk­tion­ierende 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: Trans­parenz und Nachvol­lziehbarkeit auch für Ein­steiger sind mir wichtiger als „möglichst wenige Code-Zeilen“. 😛 


Und hier, beim Stich­wort last but not least find­en Sie noch einen Hin­weis, wo und wie Sie Antworten auf eventuelle Fra­gen oder auch die aus­gear­beit­ete Datei bekom­men kön­nen. Grundle­gen­des zum The­ma M-Code lesen Sie hier im Blog nach.

Dieser Beitrag wurde unter Allgemein veröffentlicht. Setze ein Lesezeichen auf den Permalink.