Skip to content
Support formation Rapports Power BI
  • Pages
    • Présentation du support
    • Organisation des formations Power BI
    • Ressources pédagogiques
      • Kit pédagogique
      • Références
      • Mise en pratique
        • Exo 1
        • Exo 2
        • Exo 3
        • Exo 4 Parc Auto
        • Exo 5 Vente data
        • Exo 6 EuroDesk
      • Aide à la décision d'une formation courte Power BI
    • Généralités
      • Carte & schéma Power BI
      • Guide de survie
      • Architecture des données [WiP]
      • Présentation de la solution Power BI
        • Le marché des solutions BI
        • A quoi sert Power BI ?
        • Versions & licences
          • Suivi des évolutions
        • Installation
      • Microsoft Fabric [WIP]
      • Planification de l’implémentation de Power BI
      • Planification de la migration et du déploiement Power BI
      • Untitled page
        • Organiser son projet Power BI
        • Optimisations & bonnes pratiques
    • 1 | Se connecter aux données
      • Modes de connexion aux données (résumé)
      • Obtenir les données d’un fichier Excel (SharePoint)
      • Obtenir les données d’un fichier CSV/Texte
      • Obtenir les données d'un classeur Google Sheet
      • Créer un Dataflow (Query dans BI Service)
      • Base de données (Azure SQL Server)
      • Récupérer le contenu d'un fichier Zip
      • Récupérer les fichiers d'un site SharePoint
      • OData
      • Tips - retours d'expériences [WIP]
    • 2 | Transformer ses données (Power Query)
      • Pourquoi transformer ses données ? (dépivoter)
      • Transformations
        • Fusionner des requêtes ("RECHERCHEV")
          • Les 6 types de jointure
        • Ajouter des requêtes
        • Transformations complexes
        • Combiner les feuilles d'un classeur
        • Combiner automatiquement les fichiers d’un dossier
        • Équivalent d'un RECHERCHEV / VRAI
      • Paramètres de la source de données
      • Langage M
        • 1 | Introduction
          • Ressources
        • 2 | Travailler avec Power Query
          • Options [WiP]
        • 3 | Accès et combinaison des données
        • 4 | Valeurs et expressions
        • Fonctions personnalisées
        • Recherche de la valeur précédente
        • Contourner l'erreur Firewall
        • Tips
          • let ... in imbriqués
          • Closures (fermetures) [WiP]
          • Récursivité [ToDo]
      • Transformer avec R [WIP]
      • Transformer avec Python [WIP]
      • Query folding
      • Tips
    • 3 | Modéliser (+ DAX)
      • Propriétés des colonnes du modèle
      • Modèle de données
        • Relations
        • Schéma en étoile
          • Concepts liés au schéma en étoile
        • Slow Changing Dimension (SCD) [WiP]
      • Composants du modèles
        • Groupes & hiérarchies
        • Groupe de calculs
        • Relations
        • Mesures d'expression de détail des lignes
        • Agrégations manuelles et automatiques
      • Untitled page
      • DAX (le langage) et Power BI
        • Mesures explicites dans Power BI
        • Exploiter le volet Vue de requête DAX
        • Calculs visuels
        • User-defined functions (UDF)
      • Table de dates
      • Level Security
        • RLS (Row Level Security)
          • RLS partiel [WiP]
        • "Page Level Security" [WiP]
        • OLS (Object Level Security) [WiP]
        • Visuel Level Security
      • Tables recommandées (Type de données dans Excel)
      • Optimisation du modèle
        • Roche's Maxim
        • Réduire la taille du modèle
    • 4 | Présenter et analyser
      • Filtres & tris
        • Paramètres dynamiques
        • Focus Segments
        • L'exploration ("drill")
      • Objets visuels
        • Axes dynamiques
        • Couleurs fixes selon les catégories
        • KPI
        • Jauge
        • Sparkline [WiP]
        • Valeur dynamique des zones de texte
        • Icônes personnalisées
        • Cartes (Map)
        • Mises en forme conditionnelle
        • Jolies tables [WiP]
        • Nouvelles cartes [WiP]
      • Animer le rapport
        • Infos bulles personnalisées
        • Extractions
        • Signets
      • Étendre le rapport
        • Ajouter des visuels
        • Présenter avec R [WIP]
        • Présenter avec Python [WIP]
        • Visuels personnalisés avec Deneb
        • Infographic Designer [WiP]
        • Power Automate dans Power BI
        • Rapports multilangue
      • Styles & thèmes
        • Styles prédéfinis
    • 5 | Partager et diffuser
      • Diffuser et partager un rapport Power BI
        • Modèle sémantique comme source de rapport
        • Partager un espace de travail
        • Intégrer Power BI [WiP]
        • bouton_publier
          "Publier" avec Power BI Desktop dans OneDrive/SharePoint
      • Tableaux de bord
      • Créer l'application d'un Espace de travail Power BI
      • Espaces de travail
        • [Admin] Créer un Espace de travail
        • Approbation
        • Application dans un espace de travail
        • Rôles dans un espace de travail
        • Sécurité [ToDo]
        • Alertes dans Power BI
          • Fabric Activator pour Power BI
      • Power BI Server
        • Analysis Services (SSAS)
      • Datamart [beta]
      • Date de dernière actualisation
      • Requête dans Excel vers un modèle Power BI
      • Incorporer des rapports (Embed - API)
    • Développeurs
      • Tabular Editor
      • Mode développeur (Projet Power BI)
      • [Dev] PowerOps : analyser un rapport avec
      • ModeOp express
      • Semantic Labs
      • API REST
        • Connecteur personnalisé
      • Flux de tâches translyticaux [mai 2025]
    • Echange documents formation
    • logo_copilot
      Copilot
      • ChatGPT

User-defined functions (UDF)

Ressources

model-independent function ou model-dependent function

Les fonctions DAX définies par l’utilisateur (UDF)

Guide complet avec exemples pratiques

1. Qu’est-ce qu’une UDF DAX ?

Les fonctions définies par l’utilisateur (UDF) sont une nouvelle fonctionnalité introduite en septembre 2025 dans Power BI. Elles permettent de créer des expressions DAX paramétrées et réutilisables dans tout le modèle sémantique.

Avantages des UDF

Centralisation de la logique métier : définir une règle une seule fois et la réutiliser partout.
Maintenance simplifiée : modifier une formule à un seul endroit pour impacter toutes les mesures qui l’utilisent.
Code plus lisible : abstraire la complexité derrière des noms de fonctions explicites.
Réutilisation entre modèles : partager des fonctions via TMDL ou des bibliothèques comme .
Sources : |

2. Activer les UDF dans Power BI Desktop

Les UDF sont actuellement en preview. Pour les activer :
Aller dans Fichier > Options et paramètres > Options
Sélectionner Fonctionnalités en preview
Cocher DAX user-defined functions
Redémarrer Power BI Desktop
Source :

3. Syntaxe d’une UDF

La structure générale d’une UDF est la suivante :
DEFINE
/// Description de la fonction
FUNCTION NomFonction = (
parametre1 : TYPE MODE,
parametre2 : TYPE MODE
) => <Corps de la fonction>

Types de paramètres disponibles

Type
Sous-types
Description
ANYVAL
-
Accepte scalaire ou table (défaut)
SCALAR
INT64, DECIMAL, DOUBLE, STRING, DATETIME, BOOLEAN, NUMERIC
Valeur scalaire uniquement
TABLE
-
Expression de table
ANYREF
-
Référence (colonne, table, mesure, calendrier)
There are no rows in this table

Modes de passage des paramètres

Mode
Comportement
Cas d’usage
VAL
Évalué une seule fois avant l’appel de la fonction (eager evaluation)
Valeurs fixes, paramètres simples
EXPR
Évalué à chaque utilisation dans le contexte actuel (lazy evaluation)
Calculs dépendants du contexte de filtre
There are no rows in this table
Sources : |

4. Exemples comparatifs : avec et sans UDF

Exemple 1 : calcul de taxe

Scénario : appliquer une taxe de 10% sur différents montants dans plusieurs mesures.
Sans UDF (code répété dans chaque mesure) :
-- Mesure 1
Total Ventes TTC = [Total Ventes] * 1.1

-- Mesure 2
Total Achats TTC = [Total Achats] * 1.1

-- Mesure 3
Marge TTC = [Marge] * 1.1
Avec UDF (logique centralisée) :
-- Définition de l'UDF
FUNCTION AjouterTaxe = ( montant : NUMERIC ) =>
montant * 1.1

-- Utilisation simplifiée
Total Ventes TTC = AjouterTaxe( [Total Ventes] )
Total Achats TTC = AjouterTaxe( [Total Achats] )
Marge TTC = AjouterTaxe( [Marge] )
Avantage : si le taux de taxe change (ex: 12%), modifier uniquement la fonction suffit.

Exemple 2 : calcul de croissance

Scénario : calculer le pourcentage de croissance entre deux périodes.
Sans UDF :
Croissance Ventes =
VAR ValeurActuelle = [Total Ventes]
VAR ValeurPrecedente = CALCULATE( [Total Ventes], SAMEPERIODLASTYEAR('Date'[Date]) )
RETURN DIVIDE( ValeurActuelle - ValeurPrecedente, ValeurPrecedente, 0 )

-- Même logique répétée pour d'autres mesures...
Avec UDF :
-- Définition de l'UDF
FUNCTION CalculerCroissance = (
valeurActuelle : DECIMAL VAL,
valeurPrecedente : DECIMAL VAL
) => DIVIDE( valeurActuelle - valeurPrecedente, valeurPrecedente, 0 )

-- Utilisation
Croissance Ventes =
CalculerCroissance(
[Total Ventes],
CALCULATE( [Total Ventes], SAMEPERIODLASTYEAR('Date'[Date]) )
)
Sources : |

Exemple 3 : fonction de filtrage avec paramètre EXPR

Scénario : calculer une métrique uniquement pour les produits d’une couleur spécifique.
Sans UDF :
Ventes Rouge = CALCULATE( [Total Ventes], 'Produit'[Couleur] = "Rouge" )
Quantite Rouge = CALCULATE( [Total Quantite], 'Produit'[Couleur] = "Rouge" )
Marge Rouge = CALCULATE( [Marge], 'Produit'[Couleur] = "Rouge" )
Avec UDF (utilisant EXPR pour le contexte) :
-- Définition avec paramètre EXPR
FUNCTION CalculerPourRouge = ( metrique : EXPR ) =>
CALCULATE( metrique, 'Produit'[Couleur] = "Rouge" )

-- Utilisation élégante
Ventes Rouge = CalculerPourRouge( [Total Ventes] )
Quantite Rouge = CalculerPourRouge( [Total Quantite] )
Marge Rouge = CalculerPourRouge( [Marge] )
Point clé : le mode EXPR permet d’évaluer la métrique dans le contexte de filtre modifié par CALCULATE.

Exemple 4 : conversion de devise flexible

Scénario : convertir des montants dans une devise cible en utilisant des taux de change.
FUNCTION ConvertirDevise = (
codeDevise : SCALAR VARIANT,
dateConversion : SCALAR VARIANT,
montant : SCALAR DECIMAL
) =>
VAR CleDevise =
IF( ISINT64( codeDevise ), codeDevise,
CALCULATE( MAX( 'Devise'[CleDevise] ), 'Devise'[Code] = codeDevise ) )
VAR TauxChange =
CALCULATE( MAX( 'TauxChange'[Taux] ),
'TauxChange'[Date] = dateConversion,
'TauxChange'[CleDevise] = CleDevise )
RETURN IF( ISBLANK( TauxChange ), BLANK(), TauxChange * montant )

5. Bonnes pratiques

Nommage en PascalCase : utiliser des noms comme CalculerMarge, AjouterTaxe pour distinguer les UDF des fonctions natives DAX (en majuscules).
Documenter avec /// : ajouter des descriptions au-dessus de la fonction pour l’IntelliSense.
Utiliser CALCULATE explicitement : avec les paramètres EXPR, forcer la transition de contexte avec CALCULATE pour garantir un comportement cohérent.
Optimiser le code : les fonctions étant appelées fréquemment, écrire du code performant a un impact significatif sur le modèle.
Tester avant déploiement : utiliser EVALUATE dans la vue de requête DAX pour valider le comportement de la fonction.
Sources : |

6. Limitations actuelles (preview)

La récursivité n’est pas supportée
La surcharge de fonctions n’est pas possible
Les paramètres optionnels ne sont pas disponibles
Impossible de créer des UDF dans le service Power BI (uniquement Desktop)
La sécurité au niveau de l’objet (OLS) ne se propage pas automatiquement aux fonctions

7. Ressources complémentaires

- guide complet sur les UDF DAX
- article approfondi de Marco Russo et Alberto Ferrari
- bibliothèque open source de fonctions UDF réutilisables
- guide pratique avec Tabular Editor
- exemple concret avec simulation d’inflation
Want to print your doc?
This is not the way.
Try clicking the ··· in the right corner or using a keyboard shortcut (
CtrlP
) instead.