Le langage M (Power Query Formula Language) est le langage de Power Query, l’outil de préparation de données intégré à Power BI et à Excel. Chaque clic dans l’éditeur Power Query (filtrer une colonne, fusionner deux tables, changer un type) écrit en réalité une ligne de code M. Le lire et savoir l’ajuster permet d’aller bien au-delà de ce que propose l’interface.
Table des matières
- Le langage M dans le processus ETL
- Où voir et écrire du M ?
- La structure let … in
- Types et valeurs
- Les fonctions M essentielles
- Paramètres et fonctions personnalisées
- M ou DAX ?
- Bonnes pratiques
- Questions fréquentes
Le langage M dans le processus ETL
Dans Power BI, le M couvre les étapes Extract et Transform du processus ETL : se connecter aux sources, puis nettoyer et mettre en forme les données avant de les charger dans le modèle. C’est un langage fonctionnel : chaque étape est une expression qui prend le résultat de l’étape précédente et renvoie une nouvelle table. Pour une vue d’ensemble de l’outil, lisez notre guide Power Query, c’est quoi ?.
Où voir et écrire du M ?
- Barre de formule de l’éditeur Power Query (menu Affichage > Barre de formule) : le code de l’étape sélectionnée.
- Éditeur avancé (Accueil > Éditeur avancé) : la requête complète, modifiable.
- Requête vide (Nouvelle source > Requête vide) : pour écrire une requête ou une fonction de zéro.
- Le même code fonctionne dans Excel, Power BI Desktop, les flux de données et les Dataflow Gen2 de Microsoft Fabric.
La structure let … in
Toute requête M suit la même structure : une suite d’étapes nommées dans le bloc let, et le résultat renvoyé après in.
let
Source = Csv.Document(File.Contents("C:\Exports\ventes.csv"), [Delimiter=";", Encoding=65001]),
EnTetes = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
Types = Table.TransformColumnTypes(EnTetes, {{"Date", type date}, {"Montant", type number}}),
SansVides = Table.SelectRows(Types, each [Montant] <> null),
Ajout = Table.AddColumn(SansVides, "Année", each Date.Year([Date]), Int64.Type)
in
Ajout
Chaque nom d’étape correspond à une ligne du volet Étapes appliquées. Le mot-clé each est un raccourci pour une fonction appliquée à chaque ligne, et [Montant] désigne la colonne de la ligne en cours.
Types et valeurs
| Type | Exemple | Remarque |
|---|---|---|
| Texte | "Paris" | Guillemets doubles |
| Nombre | 42, 3.14 | Le point est le séparateur décimal |
| Date | #date(2026, 9, 23) | Aussi #datetime, #duration |
| Logique | true, false | |
| Liste | {1, 2, 3} | Accolades |
| Enregistrement | [Nom = "BIWORKS", Ville = "Le Mans"] | Une « ligne » |
| Table | Résultat de Table.FromRecords(...) | Le type le plus courant |
| Null | null | Valeur manquante |
Typer correctement les colonnes dès le début évite la plupart des erreurs de chargement et accélère les actualisations.
Les fonctions M essentielles
| Besoin | Fonction |
|---|---|
| Filtrer des lignes | Table.SelectRows |
| Garder ou supprimer des colonnes | Table.SelectColumns, Table.RemoveColumns |
| Ajouter une colonne calculée | Table.AddColumn |
| Fusionner deux tables | Table.NestedJoin puis Table.ExpandTableColumn |
| Empiler des tables | Table.Combine |
| Regrouper et agréger | Table.Group |
| Dépivoter | Table.UnpivotOtherColumns |
| Remplacer des valeurs | Table.ReplaceValue |
| Gérer les erreurs | try … otherwise |
| Texte | Text.Upper, Text.Trim, Text.Split, Text.PadStart |
| Dates | Date.Year, Date.StartOfMonth, Date.AddMonths |
Paramètres et fonctions personnalisées
Les paramètres (Accueil > Gérer les paramètres) rendent une solution portable : chemin de dossier, date de début, environnement de test ou de production.
Les fonctions personnalisées évitent de dupliquer la même logique. Exemple : une fonction qui nettoie un export comptable, appliquée ensuite à chaque fichier d’un dossier.
(fichier as binary) as table =>
let
Source = Excel.Workbook(fichier, true),
Donnees = Source{0}[Data],
Types = Table.TransformColumnTypes(Donnees, {{"Compte", type text}, {"Débit", type number}, {"Crédit", type number}}),
Solde = Table.AddColumn(Types, "Solde", each [Débit] - [Crédit], type number)
in
Solde
Appelée via Ajouter une colonne > Appeler une fonction personnalisée sur la liste des fichiers d’un dossier, elle consolide automatiquement tous les exports.
M ou DAX ?
| Langage M | DAX | |
|---|---|---|
| Rôle | Préparer les données | Calculer les indicateurs |
| Moment | Avant le chargement, à l’actualisation | Après le chargement, à chaque affichage |
| Exemples | Nettoyer, fusionner, dépivoter | Marge, cumul annuel, comparaison N-1 |
| Outil | Éditeur Power Query | Mesures du modèle |
La règle : tout ce qui peut être préparé en amont doit l’être en M. Le DAX reste réservé aux calculs qui dépendent des filtres de l’utilisateur.
Bonnes pratiques
- Renommez les étapes de façon explicite plutôt que de garder « Colonnes renommées 3 ».
- Filtrez et supprimez les colonnes tôt pour réduire le volume traité.
- Préservez le repli de requête (query folding) sur les bases de données : les premières étapes sont alors exécutées par le serveur source.
- Paramétrez les chemins et les dates plutôt que de les écrire en dur.
- Commentez le code complexe avec
//ou/* … */. - Gérez les erreurs avec
try … otherwiseplutôt que de supprimer aveuglément les lignes en erreur.
Le langage M se maîtrise rapidement avec des cas concrets : nos formations Power BI, éligibles CPF, consacrent une large place à Power Query et à l’automatisation de vos imports comptables et commerciaux.
