Power Query Fortgeschritten: M-Sprache und Custom Functions
Lesedauer: 8 Min. • Datum: 4. April 2026 • Kategorie: Excel & Automatisierung
Power Query ist weit mehr als ein Klick-Tool zum Importieren von Daten. Hinter der grafischen Oberfläche arbeitet die M-Sprache (offiziell: Power Query Formula Language) – eine funktionale Programmiersprache, die enorme Flexibilität bietet. Wer die M-Sprache beherrscht, kann Datenquellen kombinieren, Transformationen automatisieren und wiederverwendbare Funktionen erstellen, die weit über die Möglichkeiten der grafischen Oberfläche hinausgehen.
1. Grundlagen der M-Sprache auffrischen
Jede Power-Query-Abfrage wird intern als M-Code gespeichert. Sie können den Code im Erweiterten Editor (Registerkarte Ansicht) einsehen und bearbeiten. Die Struktur folgt immer einem let ... in-Muster:
let
Quelle = Excel.CurrentWorkbook(){[Name="tblUmsatz"]}[Content],
GefilterteZeilen = Table.SelectRows(Quelle, each [Umsatz] > 10000),
SortierteTabelle = Table.Sort(GefilterteZeilen, {{"Datum", Order.Descending}})
in
SortierteTabelle
Jeder Schritt ist ein benannter Ausdruck, der auf dem vorherigen aufbaut. Das Ergebnis nach in wird als Abfrageergebnis zurückgegeben.
2. Wichtige M-Funktionen für Fortgeschrittene
Die M-Sprache bietet hunderte eingebauter Funktionen. Hier die wichtigsten für den Profi-Einsatz:
| Funktion | Zweck | Beispiel |
|---|---|---|
Table.AddColumn | Berechnete Spalte hinzufügen | Marge berechnen |
Table.Group | Gruppierung mit Aggregation | Umsatz je Region |
Table.Pivot | Zeilen in Spalten umwandeln | Kreuztabelle erstellen |
Table.UnpivotOtherColumns | Spalten in Zeilen umwandeln | Entpivotierung |
List.Generate | Dynamische Listen erzeugen | Datumsreihen generieren |
Record.TransformFields | Felder im Datensatz ändern | Formatierung anpassen |
3. Custom Functions erstellen
Der größte Vorteil der M-Sprache: Sie können eigene Funktionen definieren und wiederverwenden. Eine Custom Function ist eine Abfrage, die Parameter entgegennimmt und ein Ergebnis zurückgibt.
Beispiel: Datei-Import-Funktion
Diese Funktion importiert eine beliebige CSV-Datei und wendet Standardbereinigungen an:
// Abfrage: fn_ImportCSV
(dateipfad as text, trennzeichen as text) as table =>
let
Quelle = Csv.Document(
File.Contents(dateipfad),
[Delimiter = trennzeichen, Encoding = 65001, QuoteStyle = QuoteStyle.Csv]
),
ErsteSpalteAlsHeader = Table.PromoteHeaders(Quelle, [PromoteAllScalars = true]),
LeereZeilenEntfernt = Table.SelectRows(ErsteSpalteAlsHeader, each
not List.IsEmpty(
List.RemoveMatchingItems(Record.FieldValues(_), {"", null})
)
),
DatentypenErkannt = Table.TransformColumnTypes(
LeereZeilenEntfernt,
List.Transform(
Table.ColumnNames(LeereZeilenEntfernt),
each {_, type text}
)
)
in
DatentypenErkannt
Beispiel: Dynamische Datumsreihe
// Abfrage: fn_Datumsreihe
(startDatum as date, endDatum as date) as list =>
let
AnzahlTage = Duration.Days(endDatum - startDatum) + 1,
Datumsliste = List.Dates(startDatum, AnzahlTage, #duration(1, 0, 0, 0))
in
Datumsliste
4. Ordner-Import mit Custom Functions kombinieren
Ein häufiger Anwendungsfall: Alle Dateien eines Ordners einlesen und mit einer Custom Function verarbeiten. So automatisieren Sie den Import von Monatsdaten:
let
Ordnerinhalt = Folder.Files("C:\Daten\Monatsberichte"),
GefilterteDateien = Table.SelectRows(Ordnerinhalt, each
Text.EndsWith([Name], ".xlsx")
),
ImportierteDateien = Table.AddColumn(
GefilterteDateien, "Daten",
each fn_ImportExcel([Folder Path] & [Name])
),
AlleDatenKombiniert = Table.ExpandTableColumn(
ImportierteDateien, "Daten",
Table.ColumnNames(ImportierteDateien{0}[Daten])
)
in
AlleDatenKombiniert
Der entscheidende Vorteil: Neue Dateien im Ordner werden beim nächsten Aktualisieren automatisch mit einbezogen – ohne manuelles Eingreifen.
5. Error Handling in M implementieren
In produktiven Umgebungen ist Fehlerbehandlung unverzichtbar. Die M-Sprache bietet try ... otherwise:
let
Quelle = Excel.CurrentWorkbook(){[Name="tblDaten"]}[Content],
SichereKonvertierung = Table.TransformColumns(
Quelle,
{"Betrag", each try Number.FromText(_) otherwise 0}
),
FehlerhafteZeilen = Table.AddColumn(
Quelle, "IstGueltig",
each try (Number.FromText([Betrag]) > 0) otherwise false
)
in
SichereKonvertierung
So verhindern Sie, dass ein einzelner fehlerhafter Wert die gesamte Abfrage zum Absturz bringt.
6. Performance-Tipps für komplexe Abfragen
- Table.Buffer – Zwischenspeichern von Tabellen, die mehrfach referenziert werden
- Query Folding – Prüfen Sie, ob Ihre Schritte an die Datenquelle delegiert werden (Rechtsklick auf Schritt → „Nativeabfrage anzeigen“)
- Früh filtern – Reduzieren Sie Datenmengen so früh wie möglich in der Abfragekette
- Spalten entfernen – Nur benötigte Spalten behalten, um Speicher zu sparen
- Abfragen aufteilen – Komplexe Transformationen in mehrere Abfragen zerlegen und über Verweise verbinden
Fazit
Die M-Sprache hebt Power Query auf ein professionelles Niveau. Custom Functions ermöglichen wiederverwendbare Logik, die sich über Arbeitsmappen hinweg einsetzen lässt. Wer regelmäßig Daten aus unterschiedlichen Quellen konsolidiert, spart mit diesen Techniken erheblich Zeit und reduziert Fehlerquellen. Der Schlüssel zum Erfolg liegt darin, die grafische Oberfläche als Lernwerkzeug zu nutzen und den generierten M-Code aktiv zu studieren und zu optimieren.
Das könnte Sie auch interessieren:
- Power Query: Datenimport leicht gemacht
- Power Pivot: Datenmodelle in Excel professionell aufbauen
- Excel vs. Power BI – Wann lohnt sich der Wechsel?