Mise en forme conditionnelle dynamique & DAX
Cet article est une adaptation de l’article « Dynamic Conditional Formatting for Values and Totals in a Power BI Matrix » de Parker Stevens (BIElite).
La mise à jour d’avril 2020 de Power BI nous permet maintenant d’appliquer des mises en forme conditionnelles sur les totaux et sous-totaux dans les Tables et Matrices.
Dans cette article, je partage avec vous une petite astuce qui permettra à vos utilisateurs finaux d’appliquer de manière dynamique une mise en forme conditionnelle aux Valeurs, aux Totaux (et sous-totaux) ou les deux. Comme ci-dessous :
Pour commencer, il faut créer une table déconnectée en cliquant sur le bouton « Entrer des données » puis entrer les valeurs suivantes :
(*MeF pour Mise en Forme)
La colonne Index est facultative. Elle pourra servir à trier les valeurs de la colonne Sélection autrement que par ordre alphabétique.
Ensuite, nous ajoutons sur le canvas un Segment (Slicer) avec pour valeur la colonne ‘MeF Conditionnelle'[Sélection] :
On s’assurera également d’activer la sélection simple dans le panneau Format. Cela obligera l’utilisateur à ne sélectionner qu’une et une seule valeur dans le slicer.
Ce qui donnera un slicer qui ressemblera à ça :
Puis nous ajoutons sur le canvas une Matrice. Pour cette exemple, voici la configuration de la matrice :
* [Total Profits] est une mesure.
Ce qui donne une matrice qui ressemble à ça :
Puis là intervient la séquence DAX… Nous créons une mesure [Mesure de MeF Conditionnelle] avec la formule suivante :
Mesure de MeF Conditionnelle = VAR SelectionMeF = SELECTEDVALUE( 'MeF Conditionnelle'[Sélection]; "Aucune" ) VAR ProfitMoyen = IF( ISINSCOPE( Dates[Year] ); AVERAGEX( ALLSELECTED( Dates[Year] ); [Total Profits] ); AVERAGEX( ALLSELECTED( Products[Product Name] ); [Total Profits] ) ) RETURN SWITCH( TRUE(); SelectionMeF = "Valeurs" && ISINSCOPE( Dates[Year] ) && [Total Profits] >= ProfitMoyen; "#228B22"; SelectionMeF = "Valeurs" && ISINSCOPE( Dates[Year] ) && [Total Profits] < ProfitMoyen; "#ff0000"; SelectionMeF = "Totaux" && NOT ( ISINSCOPE( Dates[Year] ) ) && [Total Profits] >= ProfitMoyen; "#228B22"; SelectionMeF = "Totaux" && NOT ( ISINSCOPE( Dates[Year] ) ) && [Total Profits] < ProfitMoyen; "#ff0000"; SelectionMeF = "Valeurs + Totaux" && [Total Profits] >= ProfitMoyen; "#228B22"; SelectionMeF = "Valeurs + Totaux" && [Total Profits] < ProfitMoyen; "#ff0000"; "#000000" )
Cette mesure définit d’abord deux variables :
- VAR SelectionMeF : Grâce à la fonction SELECTEDVALUE, cette variable permet d’identifier quelle valeur du slicer est sélectionnée par l’utilisateur
- VAR ProfitMoyen : Calcul du profit moyen par année et du profit moyen par produit avec AVERAGEX. La combinaison IF & ISINSCOPE( Dates[Year] ) permettra de retourner le profit moyen par année pour les cellules correspondant aux années, et le profit moyen par produit pour les autres cellule.
La combinaison SWITCH & TRUE() est comme une formule multi-conditionnelle. Voyez ça un peu comme un enchainement formule SI (IF).
On peut lire la première condition comme suit : Si la valeur sélectionnée du slicer égale « Valeur », et s’il s’agit d’une cellule sur la ligne année (Dates[Year]), et si le Profit [Total Profits] de cette cellule est supérieur au profit moyen par année, alors appliquer la couleur verte (code HEX : #228B22) à cette cellule.
Enfin, il ne restera plus qu’a appliquer la mise en forme conditionnelle dans le champs Valeurs de la Matrice sur la mesure [Total Profits] :
Etape 1
Etape 2
Etape 3 – Voilà le résultat 😀