In einem Excel-Forum wurde hier eine Frage gestellt, die eigentlich recht einfach mit Excel zu lösen ist. Aber gemäß einem meiner Leitsätze „eigentlich ja heißt eigentlich nein“ zeigt sich hier, dass Power Query in manchen Fällen doch ganz anders „denkt“ als Plain Excel. 😎
Der Fragesteller (Tom) hat mit der Excel-Funktion TEILERGEBNIS() ja schon einen gewissen Erfolg erzielt. In Beitrag #2 hat Ralf ja schon darauf hingewiesen, dass die Verwendung einer „intelligenten Tabelle“ (StrgT oder StrgL) zu deutlich performanteren anderen Ergebnissen führen werden. Und anschließend im Menü Start | Tabellenentwurf das Häkchen bei Ergebniszeile setzen und wie von Zauberhand wird die Gesamtsumme automatisch unterhalb der eingegebenen Daten berechnet.
Da es in vielen Fällen sinnvoll sein könnte, die Summen für jedes einzelne Produkt zu berechnen, bietet sich der Weg über eine Pivottabelle an. (Ja ich weiß, dass der Fragesteller darauf keinen Wert legt.) Auch hier wird das Ergebnis korrekt berechnet. Die Spalte Name in den Bereich Zeilen ziehen und die Spalte mit den Preisen in den Bereich Werte ziehen. Schon haben Sie das korrekte und durchaus übersichtliche Ergebnis, welches sich (natürlich) automatisch anpasst, wenn weitere Produkte in die „intelligente Tabelle“ im Blatt Input eingegeben werden. 💡
So weit, so gut. Aber was hat das alles mit der Überschrift „Kleine Ursache, große Wirkung“ zu tun, bislang ist ja kein Fehler (bei korrekter Vorgehensweise) aufgetreten? Nun ja, eigentlich habe ich diesen Beitrag für User geschrieben, welche das in Excel integrierte Tool Power Query verwenden. Und da werden sie recht rasch ihr „blaues Wunder“ erleben …
let Quelle = Excel.CurrentWorkbook(){[Name="Input"]}[Content], #"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"Name", type text}}), #"Zusammengeführte Abfragen" = Table.NestedJoin(#"Geänderter Typ", {"Name"}, Preise, {"Produkt"}, "Preise", JoinKind.LeftOuter), #"Erweiterte Preise" = Table.ExpandTableColumn(#"Zusammengeführte Abfragen", "Preise", {"Preis"}, {"Preis"}) in #"Erweiterte Preise"
Im ersten hierüber dargestellten M-Code habe ich die als Tabelle formatierten Daten der beiden Arbeitsblätter Tabelle1 und Input importiert. Danach mit „meinem“ PQ-Verweis (hier im Blog beschrieben) die beiden Abfragen verknüpft und das Ergebnis ist zwar korrekt aber recht ernüchternd: alles null.
Wieso, warum, weshalb? Auch hier kann ich ganz klar auf die Überschrift dieses Beitrags verweisen. Die scheinbar kleine Ursache ist, dass Power Query ganz klar zwischen Klein- und Großschreibung unterscheidet, fast alles ist „case sensitive“. Und die Wirkung ist, dass kein einziger Eintrag aus der Tabelle Input mit den Produkten aus der im Tabellenblatt Tabelle1 identisch ist; Honig ist für PQ nun einmal etwas ganz anderes als honig.
Anstatt eine Lösung mit „verschwurbelten“ M-Funktionen zu kreieren, gehe ich den wirklich userfreundlicheren Weg über jeweils eine Hilfsspalte, welche dann auch nach der Berechnung wieder entfernt werden kann. Dieser M-Code zeigt auf, wie Sie in ähnlich gelagerten Fällen trotz der unterschiedlichen Groß- Kleinschreibung zu einem korrekten Ergebnis kommen. Hier nun der entsprechende Code für Sie:
let Quelle = Excel.CurrentWorkbook(){[Name="Input"]}[Content], #"Geänderter Typ" = Table.TransformColumnTypes(Quelle,{{"Name", type text}}), #"Zusammengeführte Abfragen" = Table.NestedJoin(#"Geänderter Typ", {"Name"}, Preise, {"Produkt"}, "Preise", JoinKind.LeftOuter), #"Erweiterte Preise" = Table.ExpandTableColumn(#"Zusammengeführte Abfragen", "Preise", {"Preis"}, {"Preis"}), #"Hinzugefügte benutzerdefinierte Spalte" = Table.AddColumn(#"Erweiterte Preise", "lowerName", each Text.Lower([Name])), #"Zusammengeführte Abfragen1" = Table.NestedJoin(#"Hinzugefügte benutzerdefinierte Spalte", {"lowerName"}, Preise, {"lowerProdukt"}, "Preise", JoinKind.LeftOuter), #"Erweiterte Preise1" = Table.ExpandTableColumn(#"Zusammengeführte Abfragen1", "Preise", {"Preis"}, {"Preis.1"}), #"Geänderter Typ1" = Table.TransformColumnTypes(#"Erweiterte Preise1",{{"Preis.1", Currency.Type}}), #"Entfernte Spalten" = Table.RemoveColumns(#"Geänderter Typ1",{"Preis", "lowerName"}) in #"Entfernte Spalten"
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.