DAX pour la présentation
Tous les symbôles Unicode : https://www.vertex42.com/ExcelTips/unicode-symbols.html
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 & " | " & CategVariante 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.##") & Suffix3.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
- Sélectionnez le visuel → volet Format.
- Ouvrez la section Titre (ou Sous‑titre, Étiquette, Couleur…).
- Cliquez sur fx (format conditionnel).
- Choisissez Champ et pointez vers votre mesure DAX (texte/couleur/URL).
- 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 & " | " & SegDisplay – 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.