🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA Function dans Excel — Valeurs de retour & fonctions personnalisées (UDF)

|

VBA Function dans Excel — Valeurs de retour & fonctions personnalisées (UDF)

Testé sur : Excel 365 v2509 · Excel 2021 · Excel 2019 · dernière vérification le 07/06/2026

En bref — Une Function est une procédure qui renvoie une valeur. On renvoie cette valeur en l'affectant au nom même de la fonction — il n'y a pas de mot-clé Return en VBA. Et comme une Function renvoie une valeur, vous pouvez la taper directement dans une cellule comme votre propre formule (une UDF) :

Function AjouterTVA(prix As Double, taux As Double) As Double
    AjouterTVA = prix * (1 + taux)   ' on affecte au NOM — voilà la valeur de retour
End Function
Dans une cellule :   =AjouterTVA(A2; 0,2)   ' votre formule à vous, à côté de SOMME et RECHERCHEX

Cette seule capacité — vivre dans une cellule — est toute la raison d'être des Functions à côté des Subs. Tout le reste en découle.

Le modèle mental : une Function est un Sub qui rend des comptes

Un Sub est un ouvrier qui fait une tâche et repart. Une Function est un ouvrier qui fait une tâche puis vous dit le résultat. Même mécanique — un bloc de code nommé, des arguments en entrée — avec un ajout : une valeur sort.

Cette sortie rend une Function utilisable là où un Sub ne le sera jamais : dans une cellule de feuille. La grille d'Excel est faite pour afficher le résultat d'une expression, donc tout ce qui renvoie une valeur — SOMME, RECHERCHEX ou votre AjouterTVA — peut tenir dans une cellule. Un Sub ne renvoie rien, Excel n'a donc rien à mettre dans la cellule ; tapez =SaluerUtilisateur() et vous obtenez #NOM?. Gardez cette image, et le choix Sub/Function se règle tout seul.

La seule règle : renvoyer en affectant au nom (pas de Return)

Voici le bug qui attrape tous ceux qui viennent de Python, JavaScript ou C# :

Function Remise(prix As Double) As Double
    Remise = prix * 0.9         ' ✅ en VBA, on renvoie en affectant au nom de la fonction
End Function

Function Cassee(prix As Double) As Double
    Return prix * 0.9           ' ❌ ce n'est pas ainsi que VBA fonctionne — renvoie 0 en silence
End Function

Return existe en VBA, mais seulement comme partenaire du très ancien GoSub — il ne renvoie aucune valeur. Si vous écrivez Return (ou si vous oubliez d'affecter le nom), la fonction compile sans broncher et renvoie en silence la valeur par défaut de son type — 0, "" ou Empty. Pas d'erreur, juste de mauvais résultats. Si une UDF renvoie sans cesse 0, vous avez presque sûrement oublié d'affecter son nom.

Vous pouvez affecter le nom autant de fois que vous voulez (à l'intérieur, c'est une variable ordinaire) ; la valeur qu'il porte à la fin de la fonction est celle qui revient :

Function Mention(note As Long) As String
    Mention = "Échec"           ' par défaut
    If note >= 50 Then Mention = "Admis"
    If note >= 80 Then Mention = "Très bien"
End Function

Sub vs Function — la décision en une ligne

Oubliez les longs tableaux comparatifs. Tout le choix tient en une question :

L'appelant a-t-il besoin d'une réponse ? Oui → Function. Non → Sub.

Sub Function
Renvoie une valeur Non Oui (affecter au nom)
Utilisable dans une cellule Non Oui (c'est une UDF)
Visible dans la boîte Macros (Alt+F8) Oui, si Public et sans argument Non
Tâche typique Faire quelque chose (mettre en forme, exporter, supprimer) Calculer quelque chose (un taux, une étiquette, un texte nettoyé)

Un indice utile : si vous faites stocker le résultat d'un Sub dans une variable globale pour qu'une autre procédure le lise, c'est une Function qu'il vous fallait. Renvoyez la valeur proprement au lieu de la faire passer en douce par une globale.

En faire une fonction de feuille (UDF) — la fonctionnalité décisive

Placez la Function dans un module standard (Insertion → Module, pas un module de feuille ni ThisWorkbook), et elle devient aussitôt disponible dans la grille et dans la saisie semi-automatique de formules :

Function Initiales(nomComplet As String) As String
    Dim parties() As String
    parties = Split(Trim(nomComplet), " ")
    Initiales = Left(parties(0), 1) & Left(parties(UBound(parties)), 1)
End Function
=Initiales("Ada Lovelace")  →  "AL"

C'est là que VBA paie pour les non-programmeurs autour de vous : vous écrivez la logique une fois, et vos collègues l'utilisent comme n'importe quelle fonction native, sans voir une ligne de code.

La règle qui casse chaque nouvelle UDF : une fonction de feuille ne renvoie qu'à sa propre cellule

Voici la limite qui engendre mille messages sur les forums. Quand une Function est appelée depuis une cellule, Excel l'exécute en mode protégé où elle ne peut rien changer — ni écrire dans d'autres cellules, ni poser une couleur, ni renommer une feuille, ni afficher de MsgBox. Elle peut seulement calculer et renvoyer la valeur de la cellule appelante.

Function ColoreMoi(c As Range) As String
    c.Interior.Color = vbYellow   ' ❌ ne fait RIEN quand appelée depuis une cellule
    ColoreMoi = "fait"
End Function

On écrit cela, on voit le texte apparaître mais aucune couleur, et on conclut que VBA est cassé. Il ne l'est pas — les UDF sont pures par conception. Si vous devez modifier la feuille, c'est le travail d'un Sub (déclenché par un bouton ou un événement), pas d'une UDF. Connaître cette ligne fait gagner des heures : formule de cellule → calculer et renvoyer seulement ; modifier le classeur → un Sub.

Arguments optionnels et typés : une UDF qui se sent native

Deux touches rendent une fonction personnalisée agréable à utiliser :

Function NetHT(brut As Double, Optional taux As Double = 0.2) As Double
    NetHT = brut / (1 + taux)      ' taux vaut 0,2 si l'appelant l'omet
End Function

Optional avec une valeur par défaut permet à =NetHT(A2) et =NetHT(A2; 0,1) de fonctionner tous deux. Déclarer le type de retour (As Double, As String, As Boolean) au lieu de Variant rend la fonction plus rapide et l'intention claire.

L'avis tranché : ne réinventez pas une fonction native

Les Functions VBA servent à la logique qu'Excel n'a pas déjà. Si WorksheetFunction.SumIf, JOINDRE.TEXTE ou RECHERCHEX fait déjà l'affaire, appelez-la — une fonction native est plus rapide, recalcule correctement et n'exige pas de classeur avec macros. Réservez vos Functions aux règles vraiment spécifiques : une tranche d'imposition propre à l'entreprise, un analyseur de texte brouillon, un calcul métier sans équivalent. Une UDF qui enveloppe SOMME est un fardeau ; une UDF qui encode votre règle de gestion est un actif.

Erreurs fréquentes de Function (et la correction)

Symptôme Cause Correction
La fonction renvoie toujours 0 / vide Return utilisé, ou le nom jamais affecté Affecter le résultat au nom : MaFonction = resultat
#NOM? dans la cellule Fonction dans un module de feuille, ou nom mal orthographié La déplacer dans un Module standard ; vérifier l'orthographe
L'UDF ne colore/modifie pas les cellules Une UDF appelée depuis une cellule ne peut pas modifier le classeur Un Sub sur bouton/événement pour les modifications
#VALEUR! dans la cellule Une erreur non gérée dans la fonction Valider les entrées ; renvoyer une valeur de repli au lieu d'une erreur
Le résultat de l'UDF ne se met pas à jour La fonction ne voit pas l'entrée modifiée Passer les cellules modifiées en arguments, ou Application.Volatile (avec parcimonie)
« attendu : fin d'instruction » à l'appel Confusion parenthèses/Call (comme pour les Subs) Utiliser la valeur de retour : x = MaFonction(a)

Quand la logique de la formule est le vrai travail — laissez tomber le VBA

Une Function personnalisée est l'outil idéal pour un calcul réutilisable. Mais quand la tâche est « rapproche ces deux exports, signale les lignes sans correspondance et totalise les écarts par mois », vous ne voulez pas écrire et maintenir cela à la main. ExcelMaster Agent prend cette phrase en français courant et produit le résultat — aucune UDF à déboguer, aucun fichier à macros à diffuser. Essayer gratuitement →

Guides liés

FAQ

Qu'est-ce qu'une Function en VBA ? Une Function est une procédure nommée qui effectue un travail et renvoie une valeur au code appelant. On la définit par Function Nom(args) As Type … End Function et on renvoie le résultat en l'affectant au nom même de la fonction.

Comment renvoyer une valeur depuis une fonction VBA ? Affectez la valeur au nom de la fonction : dans Function Total() As Double, écrivez Total = 42. VBA n'a pas d'instruction Return pour cela — Return appartient à l'ancien GoSub et ne renvoie aucune valeur. La dernière valeur affectée au nom avant la fin est celle qui est renvoyée.

Pourquoi ma fonction VBA renvoie-t-elle 0 ou vide ? Parce que vous n'avez jamais affecté de valeur au nom de la fonction (ou vous avez utilisé Return, qui ne marche pas en VBA). La fonction renvoie alors la valeur par défaut de son type — 0, "" ou Empty. Ajoutez NomFonction = resultat avant End Function.

Comment créer une fonction personnalisée (UDF) dans Excel ? Placez une Function dans un module standard (Insertion → Module), donnez-lui un type de retour et affectez le résultat à son nom. Tapez ensuite =VotreFonction(...) dans une cellule. Elle apparaît dans la saisie semi-automatique comme une fonction native.

Pourquoi mon UDF ne peut-elle pas modifier d'autres cellules ou des couleurs ? Quand Excel appelle une Function depuis une cellule, elle s'exécute en mode restreint qui ne peut que renvoyer une valeur — elle ne peut pas modifier le classeur (pas d'écriture dans les cellules, de mise en forme ni de MsgBox). Pour modifier la feuille, utilisez un Sub déclenché par un bouton ou un événement, pas une UDF.

Quand utiliser une Function plutôt qu'un Sub ? Utilisez une Function quand l'appelant a besoin d'une valeur — un calcul, une recherche, un texte nettoyé — ou quand vous voulez l'appeler depuis une cellule. Utilisez un Sub quand la procédure se contente de faire quelque chose (met en forme, exporte, supprime) sans rien renvoyer.