let // Kreuztabelle laden Kreuztabelle = qryKreuztabelle, // Spaltennamen der Kreuztabelle Spalten = Table.ColumnNames(Kreuztabelle), // Gewichtungsschalter GewichtungSchalter = Excel.CurrentWorkbook(){[Name="Gewichtung"]}[Content]{0}[Column1], // Gewichtungstabelle laden und erste Zeile als Header verwenden GewichtungenRoh = Excel.CurrentWorkbook(){[Name="tblGewichtung"]}[Content], GewichtungsfaktorTabelle = Table.PromoteHeaders(GewichtungenRoh, [IgnoreErrors=true]), // Nur numerische Werte aus Spalte "Gewichtungsfaktor" filtern GewichtungenFilter = Table.SelectRows(GewichtungsfaktorTabelle, each Value.Is([Faktoren], type number)), // Gewichtungen als Liste extrahieren GewichtungenListe = Table.Column(GewichtungenFilter, "Faktoren"), // Summe der Gewichtungen SummeGewichtungen = Excel.CurrentWorkbook(){[Name="SummeGewichtungsfaktor"]}[Content]{0}[Column1], // Anzahl der Fragen AnzahlFragen = Excel.CurrentWorkbook(){[Name="Fragenanzahl"]}[Content]{0}[Column1], // Gewichtungen prüfen und ggf. gleichmäßig verteilen GewichtungenFinal = if GewichtungSchalter = "Ja" and SummeGewichtungen <> 1 then error "Gewichtung aktiviert, aber Summe der Gewichtungen ist ungleich 100%. Bitte korrigieren." else if GewichtungSchalter = "Ja" then GewichtungenListe else List.Repeat({1 / AnzahlFragen}, AnzahlFragen), // Gewichtungstabelle aus Spaltennamen und Gewichtungen erzeugen Gewichtungstabelle = Table.FromColumns({Spalten, GewichtungenFinal}, {"Frage", "Gewichtung"}), // Kreuztabelle um gewichtete Spalten erweitern MitGewichtetenSpalten = List.Accumulate( Table.ToRows(Gewichtungstabelle), Kreuztabelle, (state, row) => let spalte = row{0}, gewicht = row{1}, neueSpalte = "G_" & spalte in Table.AddColumn(state, neueSpalte, each try Record.Field(_, spalte) * gewicht otherwise null) ), // Dynamisch alle Spaltennamen mit Präfix "G_" ermitteln GewichteteSpalten = List.Select(Table.ColumnNames(MitGewichtetenSpalten), each Text.StartsWith(_, "G_")), // Gesamtscore berechnen GesamtscoreSumme = Table.AddColumn( MitGewichtetenSpalten, "Gewichteter Score", (row as record) => Number.Round( List.Sum( List.Transform( Record.FieldValues( Record.SelectFields(row, GewichteteSpalten) ), each if _ is null then 0 else _ ) ), 2 ), type number ) in GesamtscoreSumme