Mich hat vor kurzem eine Leserfrage erreicht, die inhaltlich wie folgt lautete:
Wie erstellt man eine Funktion in M, die innerhalb einer Tabelle an einer variablen Position eine Spalte erzeugt, welche die beiden Spalten links davon auf Identität prüft?
Ich fand diese Frage recht interessant und denke, dass dies ein gutes Beispiel ist, um das Erstellen von custom functions im M zu verdeutlichen.
Als Abonnent meines Newsletters erhältst Du die Beispieldateien zu den Beiträgen dazu. Hier geht’s zum Abonnement des Newsletters!
Du kannst meine Funktion dem folgenden unten befindlichen Fenster entnehmen und von dort aus in Deine Zwischenablage kopieren, um sie anschließend in den Erweiterten Editor (Advanced Editor) in Power Query für Excel oder Power BI Desktop einzufügen.
Falls Du sehen möchtest, wie diese Funktion schrittweise vorgeht, um das finale Ergebnis zu ermitteln, dann…
- kommentiere die Zeilen 1-5, 136-147 aus (Stelle vor jede Zeile
//
) und entferne das Komma hinter „Output“ in Zeile 130 - kommentiere 10-24 wieder ein (entferne in Zeile 10
/*
und in Zeile 24*/
)
Ich hoffe, die Kommentierung innerhalb der Funktion ist ausreichend, um die Funktionsweise zu verstehen.
Falls Du wissen möchtest, wie Du meine M-Funktionen in Deinen Projekten wiederverwenden kannst, schau bitte hier nach.
Bis zum nächsten Mal und denk dran: Sharing is caring. Wenn Dir der Beitrag gefallen hat, dann teile ihn gerne. Falls Du Anmerkungen hast, schreibe gerne einen Kommentar, oder schicke mir eine Mail an lars@ssbi-blog.de
Viele Grüße aus Hamburg,
Lars
Lars ist Berater, Entwickler und Trainer für Microsoft Power BI. Er ist zertifizierter Power BI-Experte und Microsoft Trainer. Für sein Engagement in der internationalen Community wurde Lars seit 2017 jährlich durch Microsoft der MVP-Award verliehen. Lies hier mehr…
Frank meint
Hallo Lars,
ich verzweifle gerade an einer einfachen funktion:(
Diese Funktion soll als Benutzerdefinierte Funktion mit einer Spalte als Parameter übergeben werden.
Wie muss der erste Parameter bei Table.ReplaceValue aussehen damit das funktioniert.
let
Quelle = (SpaltenName) =>
Table.ReplaceValue(SpaltenName,“0-„,““,Replacer.ReplaceText,{SpaltenName})
in
Quelle
Grüsse Frank
Lars Schreiber meint
Hallo Frank,
die Funktion Table.ReplaceValue() benötigt als ersten Parameter eine Tabelle. Der reine Spaltenname nutzt hier nichts, weil die Funktion dann immer noch nicht weiß, aus welcher Tabelle dieser kommt. Der folgende Code führt hoffentlich zu mehr Verständnis:
(Tabelle as table, SpaltenName as text) as table =>
let
/*
// === Variablen für den Test ===
Tabelle = Table.FromRecords(
{
[Spalte1 = „0-bla blub“, Spalte2 = 1],
[Spalte1 = „bla blub“, Spalte2 = 2]
}
),
SpaltenName = „Spalte1“,
//=== Variablen für den Test ===
*/
Output = Table.ReplaceValue(Tabelle,“0-„,““,Replacer.ReplaceText,{SpaltenName})
in
Output
Viele Grüße aus HH,
Lars
Frank meint
Hallo Lars,
erstmal vielen Fank für die schnelle Antwort.
Wenn ich versuche in einer Tabelle über Spalte hinzufügen / benutzerdefinerte Funktion aufrufen, die Funktion aufzurufen kann ich keine Tabelle auswählen und auch nichts manuell eingeben.
Habe ich hier einen kapitalen Denkfehler ?
Grüsse Frank
Lars Schreiber meint
Hallo Frank,
wenn Du es innerhalb einer berechneten Spalte aufrufen willst, dann ist die Tabellenreferenz der Name des Schrittes in Deiner Abfrage, auf den Du verweisen willst. Im Normalfall ist es der Name des vorangegangenen Schrittes.
VG,
Lars
Frank meint
Hallo Lars,
genau hier liegt mein Problem .
Ich möchte die Funktion über den Menüpunkt „Spalte hinzufügen“ –> „Benutzerdefinierte Funktion aufrufen“ und nicht in eine Abfrage einbetten d.h. ich möchte/muss die Tabelle und die Spalte als zwei Funktionsparameter übergeben.
AUFRUFFENSTER
Beim Parameter SpaltenName kommt beim Typ“Spalte“ eine Liste mit den Spalten wo ich die Spalte auswählen kann.
Beim Parameter Tabelle sollte das gleich passieren,
wenn ich aber als Parameter „Tabelle“ den Typ von „Spalte“ auf „Tabelle“ wechsle kommt das gelbe Warndreieck mit dem Hinweis „Wert eingeben“ aber das Eingabefeld ist ausgegraut.
Ich hoffe das war verständlich, leider kann man keine Screenshots hochladen:(
VG
Frank