Power BI & Finance

DAX Financier
les formules qui comptent

CALCULATE — TOTALYTD — DATEADD — VAR/RETURN — DIVIDE

Power BI est livré sans mode d’emploi financier.
Les formules DAX génériques ne produisent pas les KPI dont un DAF a besoin.

Cette page documente les patterns DAX utilisés en mission : marge filtrée, comparatif N/N-1, DSO dynamique, cumul annuel recalculé. Chaque formule est accompagnée de son contexte d’usage et du résultat attendu dans le dashboard.

5 patternsDAX couverts
FinanceContexte métier
TPE / PMECible prioritaire
Copier-collerPrêt à l'emploi

Formules validees en conditions reelles sur missions 2024-2026

Pourquoi le DAX standard ne suffit pas en finance

La documentation Microsoft couvre la syntaxe. Elle ne couvre pas les pieges specifiques aux donnees comptables.

Les dates fiscales ne sont pas les dates calendaires

Un exercice qui commence en juillet casse TOTALYTD par defaut. Sans table de dates dediee, les cumuls sont faux.

La marge depend du contexte de filtre

Calculer la marge globale est trivial. La recalculer correctement quand l'utilisateur filtre par famille produit ou par commercial, c'est CALCULATE.

Le N-1 doit etre homogene

Comparer mars 2025 a mars 2024 ne suffit pas si le perimetre a change. DATEADD seul ne gere pas les retraitements de perimetre.

Le DSO varie selon la methode de calcul

DSO = Creances / CA * 30 est une simplification. La version rigoureuse necessite une VAR intermediaire pour eviter les divisions par zero et les incoherences de clature.

Ce que cette page documente : les cinq patterns DAX les plus utiles en contexte finance d’entreprise, avec la logique metier derriere chaque choix de syntaxe.

Pattern 01

CALCULATE — Marge filtrée par contexte

La formule la plus importante de Power BI finance. Elle permet de recalculer n’importe quel KPI dans un contexte de filtre modifie.

Contexte metier

Votre tableau de bord affiche la marge brute totale. Un directeur commercial filtre sur sa region : la marge affichee doit etre recalculee sur son perimetre, pas ramenee a une valeur globale divisee. CALCULATE reecrit le contexte de filtre avant d’evaluer la mesure.

Marge Brute Filtrée =
CALCULATE(
    [Marge Brute],               -- mesure a recalculer
    REMOVEFILTERS('Produits'[Famille]),  -- supprime le filtre famille
    KEEPFILTERS('Region'[Code])  -- conserve le filtre region
)

Quand l’utiliser

  • Marge par famille produit independante des filtres visuels croisés
  • Part de marché d'une région vs total groupe
  • Contribution d'un commercial au CA total (sans que le filtre nom ne coupe les autres)
  • Recalcul du budget sur périmètre réel quand le périmètre a changé en cours d'année

Resultat dans le dashboard

Une carte KPI “Marge Brute” qui affiche la bonne valeur quel que soit le filtre appliqué sur d’autres visuels. Fini les chiffres qui ne collent pas avec le rapport comptable quand on segmente par business unit.

Pattern 02

TOTALYTD — Cumul annuel sur exercice fiscal

Le cumul depuis le debut de l’exercice, pas depuis le 1er janvier. Le parametre year_end_date est la cle que la plupart des tutoriels omettent.

Contexte metier

Une PME dont l’exercice court du 1er juillet au 30 juin. En mars, le cumul annuel doit afficher 9 mois (juillet a mars), pas 3 mois (janvier a mars). Sans le parametre year_end_date, TOTALYTD repart systematiquement du 1er janvier. Resultat : les graphiques ne correspondent jamais aux etats financiers.

CA Cumulé YTD =
TOTALYTD(
    SUM('Ventes'[Montant HT]),  -- mesure a cumuler
    'Calendrier'[Date],          -- colonne date de la table calendrier
    "30/06"                      -- fin d'exercice si hors 31/12
)

-- Variante explicite (recommandée en production) :
CA Cumulé YTD v2 =
CALCULATE(
    SUM('Ventes'[Montant HT]),
    DATESYTD('Calendrier'[Date], "30/06")
)

Quand l’utiliser

  • CA cumulé depuis le debut de l'exercice dans la carte KPI principale
  • Charges cumulées pour suivi budgétaire en cours d'année
  • EBITDA YTD comparé au budget YTD (même logique de cumul)
  • Tout KPI presenté en "depuis le debut de l'exercice" dans un reporting DAF

Resultat dans le dashboard

Un indicateur “CA YTD : 2,4 M€” qui affiche exactement le meme chiffre que le grand livre comptable, quel que soit le mois selectionné dans le filtre de date. Zero ecart avec la balance.

Pattern 03

DATEADD — Comparatif N vs N-1

L’indicateur de glissement annuel que tout DAF demande en premiere slide. Avec la gestion correcte des periodes incompletes.

Contexte metier

Le reporting de fevrier 2025 doit comparer fevrier 2025 a fevrier 2024, pas a la totalite de 2024. DATEADD decale le contexte de filtre de 12 mois en arriere, en conservant exactement le meme grain temporel (mois, semaine, jour) que la selection active. Le calcul d’ecart et du taux de croissance s’appuie ensuite sur cette valeur N-1.

-- CA de la meme periode l'annee precedente
CA N-1 =
CALCULATE(
    SUM('Ventes'[Montant HT]),
    DATEADD('Calendrier'[Date], -1, YEAR)
)

-- Ecart en valeur absolue
Ecart CA N vs N-1 =
[CA] - [CA N-1]

-- Taux de croissance (avec protection division par zero)
Croissance CA % =
DIVIDE(
    [CA] - [CA N-1],
    [CA N-1],
    BLANK()   -- retourne vide plutot qu'une erreur si N-1 = 0
)

Quand l’utiliser

  • Fleche de tendance sur chaque KPI (CA, marge, EBITDA) avec glissement N/N-1
  • Graphique ligne avec deux series : annee en cours vs annee precedente
  • Tableau comparatif mensuel : Realise / N-1 / Ecart / % Evolution
  • Alertes automatiques quand la croissance passe sous un seuil (-5 %, -10 %)

Resultat dans le dashboard

Chaque carte KPI affiche : valeur periode, valeur N-1, ecart en euros, fleche de tendance. Quand le DAF change la periode dans le filtre, tout se recalcule automatiquement. Aucune formule a modifier.

Pattern 04

DIVIDE — Taux de marge sans erreur

La division securisee. En finance, les denominateurs a zero ne sont pas des cas rares : nouveaux produits sans CA, periodes hors exercice, filtres agressifs.

Contexte metier

Un ratio CA / Charges affiche une erreur quand un segment n’a aucun chiffre sur la periode selectionnee. Avec un operateur `/` natif, Power BI retourne ERROR ou INFINITY, ce qui casse visuellement le tableau de bord et inquiete le DAF. DIVIDE renvoie BLANK() ou une valeur par defaut, selon ce que vous choisissez.

-- Taux de marge brute securise
Taux Marge Brute % =
DIVIDE(
    [Marge Brute],      -- numerateur
    [CA HT],            -- denominateur
    0                   -- valeur si denominateur = 0 (ici : 0 %)
)

-- Taux d'evolution securise (preferer BLANK() pour ne pas fausser les moyennes)
Taux Evolution % =
DIVIDE(
    [CA] - [CA N-1],
    [CA N-1],
    BLANK()
)

-- Cout par unite vendue (avec seuil minimum pour eviter les aberrations)
Cout Unitaire =
VAR _qte = SUM('Ventes'[Quantite])
RETURN
DIVIDE(
    SUM('Achats'[Montant]),
    IF(_qte > 0, _qte, BLANK())
)

Quand l’utiliser

  • Tous les taux et ratios financiers sans exception (marge, ROE, ratio d'endettement)
  • Indicateurs de productivite (CA par employe, marge par affaire)
  • Calculs de part de marche et pourcentages de contribution
  • Tout denominateur susceptible d'etre zero sur un segment ou une periode

Resultat dans le dashboard

Un tableau de bord qui ne s’affiche jamais en erreur, meme sur des segments ou des periodes sans donnees. Les cellules vides restent vides, sans perturber les moyennes et les visualisations.

Pattern 05

VAR / RETURN — DSO dynamique

Le pattern de lisibilite. En finance, les formules DAX deviennent rapidement illisibles. VAR/RETURN permet de les decomposer en etapes nommees, auditables, et reutilisables.

Contexte metier

Le DSO (Delai de Paiement Clients) est un KPI critique pour le BFR. Sa formule rigoureuse implique plusieurs etapes : calcul du CA sur 90 jours glissants, encours clients a date, puis division securisee. Une formule DAX imbriquee sur une ligne est inauditable. VAR decompose le calcul en etapes explicites.

DSO Dynamique (jours) =
VAR _dateMax = MAX('Calendrier'[Date])           -- date de fin de periode
VAR _date90  = _dateMax - 89                     -- fenetre glissante 90 jours

VAR _ca90 =
    CALCULATE(
        SUM('Ventes'[Montant HT]),
        DATESBETWEEN('Calendrier'[Date], _date90, _dateMax)
    )

VAR _encours =
    CALCULATE(
        SUM('Creances'[Solde]),
        'Calendrier'[Date] <= _dateMax
    )

VAR _caJour = DIVIDE(_ca90, 90, BLANK())         -- CA moyen journalier

RETURN
DIVIDE(_encours, _caJour, BLANK())               -- DSO en jours

Quand l’utiliser

  • Tous les KPI a plusieurs etapes de calcul : DSO, DPO, BFR en jours de CA
  • Formules qui reutilisent un meme sous-total plusieurs fois (evite les recalculs)
  • Mesures que d'autres personnes devront maintenir (nommage explicite)
  • Calculs conditionnels complexes (if/switch imbriques sur des valeurs intermediaires)

Resultat dans le dashboard

Une carte KPI “DSO : 47 jours” qui se recalcule dynamiquement quand l’utilisateur change la periode ou filtre par client. La formule reste lisible par n’importe quel analyste qui reprend le fichier six mois plus tard.

Recapitulatif des 5 patterns

Quand utiliser chaque pattern selon le KPI finance a produire.

PatternKPI finance concerneDifficulte
CALCULATEMarge filtrée, part de marché, contribution segmentéeIntermediaire
TOTALYTDCA YTD, charges cumulées, EBITDA depuis debut exerciceDebutant
DATEADDGlissement N/N-1, taux de croissance, ecart budgetaireDebutant
DIVIDETaux de marge, ROE, ratios, pourcentages de contributionDebutant
VAR / RETURNDSO, DPO, BFR jours CA, formules multi-etapesIntermediaire

Pre-requis : ce qui doit etre en place avant les formules

Les formules DAX sont fiables seulement si le modele de donnees sous-jacent l’est aussi. Trois elements non-negociables.

01

Table de dates dediee

Une table 'Calendrier' marquee comme table de dates dans Power BI, avec une ligne par jour, des colonnes Annee / Mois / SemaineExercice. Sans elle, TOTALYTD et DATEADD sont instables.

02

Mesures centralisees

Toutes les mesures dans une table '_Mesures' vide, jamais directement sur les tables de faits. Facilite la maintenance, evite les duplications, rend le modele auditable.

03

Relations etoile propres

Un schema en etoile avec une table de faits centrale (Ventes, Ecritures) et des dimensions (Clients, Produits, Calendrier) en relation 1-to-many. Les relations many-to-many cassent CALCULATE.

La regle de base : avant d’ecrire la premiere formule DAX, 30 minutes de verification du modele de donnees evitent 3 heures de debogage sur des resultats incoherents.

Mise en oeuvre

Appliquer ces formules a vos donnees

Les patterns DAX documentés ici sont implementes dans chaque mission de reporting financier. Si vous partez de zero ou reprenez un modele Power BI existant, voici les deux prochaines etapes.

Connecter vos donnees comptables

Sage, Cegid, EBP ou FEC : chaque source a sa methode d’import dans Power BI. La page connecteurs documente les etapes pour chaque logiciel.

Voir les connecteurs

Faire implementer le reporting complet

Mission de 3 semaines : connexion des sources, modelisation, formules DAX, dashboard livre avec formation. Autonomie totale a l’issue.

Planifier un echange
Discuter de votre reporting Power BI