Zum Hauptinhalt springen

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:

FunktionZweckBeispiel
Table.AddColumnBerechnete Spalte hinzufügenMarge berechnen
Table.GroupGruppierung mit AggregationUmsatz je Region
Table.PivotZeilen in Spalten umwandelnKreuztabelle erstellen
Table.UnpivotOtherColumnsSpalten in Zeilen umwandelnEntpivotierung
List.GenerateDynamische Listen erzeugenDatumsreihen generieren
Record.TransformFieldsFelder im Datensatz ändernFormatierung 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:

Unsere Services

Projekt anfragen