DAX pour Power BI & Excel

DAX pour la présentation

Pré‑requis rapides

  • Modèle en étoile avec tables de dimensions (Date, Produit, Territoire, Client…)
  • Table Date marquée comme table de dates
  • Notions
    • ALLSELECTED : supprime les filtres “internes” (donc à l’intérieur de la vignette) et applique des filtres “externes” (segments...).
    • VALUES : valeurs uniques d’une colonne
    • SELECTEDVALUE : retourne une seule valeur quand le filtrage produit une seule valeur, sinon retourne le résultat alternatif.
    • CONCATENATEX : CONCATENATEX ( <Table>, <Expression> [, <Delimiter>] [, <OrderBy_Expression> [, [<Order>] [, <OrderBy_Expression> [, [<Order>] [, … ] ] ] ] ] )
    • SWITCH(TRUE()) : SWITCH ( TRUE, [A] > [B], "First case", [A] = [B], "Second case", [A] = 0, "Third case", "Fourth case")

1 Titres dynamiques

1.1 Titre avec période et filtres principaux

Afficher Mesure + Période + Segments en tenant compte des sélections (segments) courantes.

Titre – Ventes & contexte =
VAR DateMinSel = MINX(ALLSELECTED('Date'[Date]), 'Date'[Date])
VAR DateMaxSel = MAXX(ALLSELECTED('Date'[Date]), 'Date'[Date])
VAR Periode = IF(
    NOT ISBLANK(DateMinSel) && NOT ISBLANK(DateMaxSel),
    FORMAT(DateMinSel, "dd mmm yyyy") & " – " & FORMAT(DateMaxSel, "dd mmm yyyy"),
    "Toutes périodes"
)
VAR Pays =
    IF(HASONEVALUE('Territoire'[Pays]), SELECTEDVALUE('Territoire'[Pays]), "Plusieurs pays")
VAR Categ =
    VAR liste = CONCATENATEX(VALUES(Produit[Catégorie]), Produit[Catégorie], ", ", Produit[OrdreCat])
    RETURN IF(liste="", "Toutes catégories", liste)
RETURN
"Ventes : " & FORMAT([CA], "# ##0 €") & "  |  " & Periode & "  |  " & Pays & "  |  " & Categ

Variante courte (année/mois)

Titre – Période courte =
VAR y = MINX(ALLSELECTED('Date'[Année]), 'Date'[Année])
VAR m = MINX(ALLSELECTED('Date'[MoisNom]), 'Date'[MoisNom])
RETURN COALESCE("Période : " & m & " " & y, "Toutes périodes")

1.2 Sous‑titre « filtre actif » générique

Sous‑titre – Filtre actif (Pays) = "Filtre Pays : " & COALESCE(SELECTEDVALUE('Territoire'[Pays]), "Tous")

2 Icônes et badges d’état (Unicode & images)

2.1 Icônes Unicode sans images

Pratiques pour des cartes, tables et matrices. Police recommandée : Segoe UI Symbol.

Exemples d’icônes :

  • UNICHAR(9650) (hausse)
  • UNICHAR(9660) (baisse)
  • UNICHAR(9654) (stable)
  • UNICHAR(9888) (alerte)

Mesure “delta” + icône

Δ % vs N‑1 = DIVIDE([CA] - [CA N‑1], [CA N‑1])


Icône – Tendance =
VAR d = [Δ % vs N‑1]
RETURN
SWITCH(TRUE(),
    d >= 0.02, UNICHAR(9650),   -- ▲
    d <= -0.02, UNICHAR(9660),  -- ▼
    TRUE, UNICHAR(9654)         -- ►
)

Couleur associée (hex)

Couleur – Tendance =
VAR d = [Δ % vs N‑1]
RETURN
SWITCH(TRUE(),
    ISBLANK(d), "#808080",     -- gris si non applicable
    d >= 0.02, "#1A9C2C",      -- vert
    d <= -0.02, "#D13438",     -- rouge
    "#8A8886"                  -- neutre
)

À lier sur : Format conditionnel → Couleur police de la mesure Icône – Tendance dans un visuel Table/Carte.

Badge combiné (icône + texte)

Badge – Tendance :=
VAR d = [Δ % vs N‑1]
RETURN
[ Icône – Tendance ] & "  " & FORMAT(d, "0.0%")

2.2 Icônes via URL d’image (table de correspondance)

Table déconnectée Icones

  • SeuilMin (num), SeuilMax (num), URL (texte), Nom (optionnel)

Mesure qui retourne l’URL selon Δ

URL – Icône tendance :=
VAR d = [Δ % vs N‑1]
RETURN
MAXX(
    FILTER(Icones, d >= Icones[SeuilMin] && d < Icones[SeuilMax]),
    Icones[URL]
)

À lier sur : URL d’image d’une colonne/mesure dans Table/Carte. Activer : Catégorie de données → URL d’image.

3 Mesures « cosmétique » utiles

3.1 Valeur avec unité intelligente

Texte – Valeur mise à l’échelle :=
VAR v = [CA]
VAR av = ABS(v)
VAR Suffix = SWITCH(TRUE(),
    av >= 1e9, " Md€",
    av >= 1e6, " M€",
    av >= 1e3, " k€",
    " €"
)
VAR Scaled = SWITCH(TRUE(),
    av >= 1e9, v/1e9,
    av >= 1e6, v/1e6,
    av >= 1e3, v/1e3,
    v
)
RETURN FORMAT(Scaled, "# ##0.##") & Suffix

3.2 Gestion des BLANK en tiret cadratin

Texte – Valeur ou tiret =
VAR v = [Marge %]
RETURN IF(ISBLANK(v), UNICHAR(8212), FORMAT(v, "0.0%"))

3.3 Lister des filtres multiples proprement

Texte – Liste segments (tri perso) =
VAR liste = CONCATENATEX(
    VALUES('Territoire'[Pays]),
    'Territoire'[Pays], ", ", 'Territoire'[OrdrePays]
)
RETURN IF(liste="", "Tous pays", liste)

3.4 Message d’alerte contextualisé

Alerte – Période incomplète =
VAR MaxDataDate = CALCULATE(MAX('Faits'[Date]), ALL('Date'))
VAR MaxSelDate = MAX('Date'[Date])
RETURN IF(MaxSelDate < MaxDataDate, "⚠ Données partielles : période incomplète", BLANK())

À lier sur : Sous‑titre ou Note d’un visuel (format conditionnel du texte OU champ dans une carte).

4 Brancher vos mesures aux propriétés visuelles

  1. Sélectionnez le visuel → volet Format.
  2. Ouvrez la section Titre (ou Sous‑titre, Étiquette, Couleur…).
  3. Cliquez sur fx (format conditionnel).
  4. Choisissez Champ et pointez vers votre mesure DAX (texte/couleur/URL).
  5. Validez. Testez avec différents slicers pour vérifier le comportement.

Astuce : créez un groupe de mesures (Display) pour tout ce qui est présentation ; plus simple à réutiliser.

5 Pattern réutilisables (copier‑coller)

5.1 Pattern – Titre complet

Display – Titre :=
VAR P = [Display – Période]
VAR Geo = [Display – Pays]
VAR Seg = [Display – Catégories]
RETURN "Ventes : " & [Texte – Valeur mise à l’échelle] & " | " & P & " | " & Geo & " | " & Seg
Display – Période :=
VAR d1 = MINX(ALLSELECTED('Date'[Date]), 'Date'[Date])
VAR d2 = MAXX(ALLSELECTED('Date'[Date]), 'Date'[Date])
RETURN IF(OR(ISBLANK(d1), ISBLANK(d2)), "Toutes périodes", FORMAT(d1, "dd/mm/yyyy") & " – " & FORMAT(d2, "dd/mm/yyyy"))
Display – Pays :=
VAR s = CONCATENATEX(VALUES('Territoire'[Pays]), 'Territoire'[Pays], ", ")
RETURN IF(s="", "Tous pays", s)
Display – Catégories :=
VAR s = CONCATENATEX(VALUES(Produit[Catégorie]), Produit[Catégorie], ", ")
RETURN IF(s="", "Toutes catégories", s)

5.2 Pattern – Icône tendance + couleur

Display – Icône :=
VAR d = [Δ % vs N‑1]
RETURN SWITCH(TRUE(), d>=0.02, UNICHAR(9650), d<=-0.02, UNICHAR(9660), UNICHAR(9654))
Display – Couleur Icône :=
VAR d = [Δ % vs N‑1]
RETURN SWITCH(TRUE(), ISBLANK(d), "#808080", d>=0.02, "#107C10", d<=-0.02, "#C50F1F", "#605E5C")

6 Exemples d’intégration par type de visuel

  • Carte :
    • Titre = Display – Titre
    • Étiquette = [Texte – Valeur mise à l’échelle]
    • Sous‑titre = Alerte – Période incomplète
  • Table / Matrice :
    • Colonne Display – Icône (texte) avec couleur conditionnelle via Display – Couleur Icône
    • Colonne valeur formatée Texte – Valeur ou tiret
  • Bouton / Bouton info :
    • Texte = Alerte – Période incomplète
  • Tooltips (page info‑bulle) :
    • Titre = Titre – Niveau de détail

7 Bonnes pratiques

  • Séparer mesures métier et mesures Display (préfixe Display – ou dossier).*
  • Utiliser ALLSELECTED pour refléter exactement le contexte des slicers utilisateur.
  • Pour les listes (pays, catégories), CONCATENATEX(VALUES(...)) et prévoir un ordre (colonne de tri) pour un rendu naturel.
  • Centraliser les seuils (tendance, alertes) dans une table déconnectée.
  • Tester l’accessibilité : contrastes, taille des glyphes, éviter les icônes “couleur seule”.

8 Liste de contrôle (checklist)

  • Mesures Display créées et rangées dans un dossier
  • Titres/sous‑titres liés via fx (format conditionnel)
  • Icônes + couleurs testées sur 3 cas (hausse / baisse / stable)
  • Alerte de qualité de données présente
  • Accessibilité vérifiée (taille, contraste, alternative texte)

Annexes – Snippets utiles

Sélection unique/multiple générique

Texte – Sélection (colonne générique) :=
VAR s = CONCATENATEX(VALUES('Any'[Label]), 'Any'[Label], ", ")
RETURN IF(HASONEVALUE('Any'[Label]), s, IF(s="", "Tous", s))

Échelle KO / OK / Bon

Badge – Qualité :=
VAR x = [Qualité %]
RETURN SWITCH(TRUE(), x<0.9, "⚠ KO", x<0.98, "OK", "Bon")

Couleur par plage

Couleur – Qualité :=
VAR x = [Qualité %]
RETURN SWITCH(TRUE(), x<0.9, "#C50F1F", x<0.98, "#FF8C00", "#107C10")

Astuce : exportez ces mesures dans un .pbit (modèle Power BI) pour les réutiliser sur tous vos projets.