Fonction VBA – Appel, Valeur de Retour et Paramètres

Written by

Mel Jenkins

Reviewed by

Steve Rynearson

Translated by

David Gagnon

Last updated on janvier 12, 2022

Ce tutoriel vous apprendra à créer et à utiliser des fonctions avec et sans paramètres en VBA

VBA contient un grand nombre de fonctions intégrées que vous pouvez utiliser, mais vous pouvez également écrire vos propres fonctions. Lorsque vous écrivez du code en VBA, vous pouvez le faire dans une procédure secondaire ou une fonction. Une fonction est capable de renvoyer une valeur à votre code. C’est extrêmement utile si vous voulez que VBA exécute une tâche et renvoie un résultat. Les fonctions VBA peuvent également être appelées depuis Excel, tout comme les fonctions Excel intégrées.

Création d’une Fonction sans Arguments

Pour créer une fonction, vous devez la définir en lui donnant un nom. La fonction peut ensuite être définie comme un type de données indiquant le type de données que vous souhaitez que la fonction renvoie.

Vous pouvez créer une fonction qui renvoie une valeur statique à chaque fois qu’elle est appelée, un peu comme une constante.

Function ObtenirValeur() As Integer
   ObtenirValeur = 50
End Function

Si vous exécutez la fonction, elle renverra toujours la valeur 50.

Vous pouvez également créer des fonctions qui font référence à des objets en VBA, mais vous devez utiliser le mot-clé Set pour renvoyer la valeur de la fonction.

Function ObtenirPlage() as Range
  Set ObtenirPlage = Range("A1:G4")
End Function

Si vous utilisez la fonction ci-dessus dans votre code VBA, la fonction renverra toujours la plage de cellules A1 à G4, quelle que soit la feuille sur laquelle vous travaillez.

Appel d’une Fonction à Partir d’une Sous-Procédure

Une fois que vous avez créé une fonction, vous pouvez l’appeler de n’importe où dans votre code en utilisant une sous-procédure pour appeler la fonction.

La valeur de 50 sera toujours renvoyée.

Vous pouvez également appeler la fonction ObtenirPlage à partir d’une sous-procédure.

Dans l’exemple ci-dessus, la fonction ObtenirPlage est appelée par la sous-procédure pour mettre en gras les cellules de l’objet Range.

Création de Fonctions

Argument Unique

Vous pouvez également attribuer un ou plusieurs paramètres à votre fonction. Ces paramètres peuvent être appelés des arguments.

Function ConvertirKiloEnLivres(dblKilo As Double) As Double
    ' Converti les kilogrammes en livres
    ConvertirKiloEnLivres = dblKilo * 2.2
End Function

Nous pouvons ensuite appeler la fonction ci-dessus à partir d’une sous-procédure afin de calculer le nombre de livres que représente une quantité spécifique de kilos.

Une fonction peut être appelée à partir de plusieurs procédures dans votre code VBA si nécessaire. C’est très utile car cela vous évite de devoir écrire le même code encore et encore. Elle vous permet également de diviser les longues procédures en petites fonctions faciles à gérer.

Dans l’exemple ci-dessus, nous avons 2 procédures – chacune d’entre elles utilise la fonction pour calculer la valeur en livres des kilos qui leur sont transmis dans l’argument dblKilo de la fonction.

Arguments Multiples

Vous pouvez créer une fonction avec plusieurs arguments et transmettre les valeurs à la fonction par le biais d’une sous-procédure.

Function CalculerÉcartJours(Date1 As Date, Date2 As Date) As Double
    CalculerÉcartJours = Date2 - Date1
End Function

Nous pouvons ensuite appeler la fonction pour calculer le nombre de jours entre 2 dates.

Arguments Facultatifs

Vous pouvez également transmettre des arguments facultatifs à une fonction. En d’autres termes, vous pouvez parfois avoir besoin de l’argument, et parfois non – en fonction du code avec lequel vous utilisez la fonction.

Function CalculerÉcartJours(Date1 As Date, Optional Date2 As Date) As Double
    ' Vérifie si la deuxième date a été spécifiée, sinon défini égal à aujourd'hui
    If Date2 = 0 Then Date2 = Date
    ' Calcule l'écart en jours entre les deux dates
    CalculerÉcartJours = Date2 - Date1
End Function

Valeur par Défaut des Arguments

Vous pouvez également définir la valeur par défaut des arguments facultatifs lorsque vous créez la fonction. Ainsi, si l’utilisateur omet l’argument, la valeur que vous avez définie par défaut sera utilisée à la place.

Function CalculerÉcartJours(Date1 As Date, Optional Date2 As Date = "2020-06-02") As Double
    ' Calcule l'écart en jours entre les deux dates
    CalculerÉcartJours = Date2 - Date1
End Function

ByVal et ByRef

Lorsque vous transmettez des valeurs à une fonction, vous pouvez utiliser les mots-clés ByVal ou ByRef. Si vous omettez l’un ou l’autre, le ByRef est utilisé par défaut.

ByVal signifie que vous transmettez une copie de la variable à la fonction, tandis que ByRef signifie que vous faites référence à la valeur originale de la variable. Lorsque vous transmettez une copie de la variable (ByVal), la valeur originale de la variable n’est PAS modifiée, mais lorsque vous faites référence à la variable, la valeur originale de la variable est modifiée par la fonction.

Function ObtenirValeur(ByRef intA As Integer) As Integer
    intA -intA * 4
    ObtenirValeur = intA
End Function

Dans la fonction ci-dessus, le ByRef pourrait être omis et la fonction fonctionnerait de la même manière.

Function ObtenirValeur(intA As Integer) As Integer
    intA -intA * 4
    ObtenirValeur = intA
End Function

Pour appeler cette fonction, nous pouvons exécuter une sous-procédure.

Sub TestValeurs()
    Dim intVal As Integer
    ' Initialisation de la variable avec la valeur 10
    intVal = 10
    ' Appel de la fonction ObtenirValeur et affiche le résultat dans la fenêtre d'exécution
    Debug.Print ObtenirValeur(intVal)
    ' Affiche la valeur de la variable intVal dans la fenêtre d'exécution
    Debug.Print intVal
End Sub

Notez que les fenêtres de débogage affichent la valeur 40 à chaque fois. Lorsque vous passez la variable IntVal à la fonction, la valeur 10 est transmise à la fonction et multipliée par 4. L’utilisation du mot-clé ByRef (ou son omission pure et simple) modifiera la valeur de la variable IntVal. Cela se voit lorsque vous montrez d’abord le résultat de la fonction dans la fenêtre immédiate (40), puis la valeur de la variable IntVal dans la fenêtre de débogage (également 40).

Si nous ne voulons PAS changer la valeur de la variable originale, nous devons utiliser ByVal dans la fonction.

Function ObtenirValeur(ByVal intA As Integer) As Integer
    intA = intA * 4
    ObtenirValeur = intA
End Function

Maintenant, si nous appelons la fonction depuis une sous-procédure, la valeur de la variable IntVal restera à 10.

Quitter une Fonction

Si vous créez une fonction qui teste une certaine condition et qu’une fois la condition vérifiée, vous voulez renvoyer la valeur de la fonction, vous devrez peut-être ajouter une instruction Exit Function dans votre code afin de quitter la fonction avant d’avoir exécuté tout le code de cette fonction.

Function TrouverChiffre(strRecherche As String) As Integer
   Dim i As Integer
    'Boucle sur chaque lettre de la chaîne
    For i = 1 To Len(strRecherche)
    'Si la lettre est numérique, renvoyez la valeur à la fonction
        If IsNumeric(Mid(strRecherche, i, 1)) Then
            TrouverChiffre = Mid(strRecherche, i, 1)
            'puis quittez la fonction
            Exit Function
        End If
    Next
   TrouverChiffre = 0
End Function

La fonction ci-dessus parcourt en boucle la chaîne fournie jusqu’à ce qu’elle trouve un nombre, puis renvoie ce nombre à partir de la chaîne. Elle ne trouvera que le premier nombre de la chaîne, car elle quittera alors la fonction.

La fonction ci-dessus peut être appelée par une sous-procédure telle que celle ci-dessous.

Sub RechercherUnNuméro()
    Dim Numéro As Integer
    'Passez une chaîne de texte à la fonction de recherche de numéro
    Numéro = TrouverChiffre("Étage supérieur, 8 Oak Lane, Texas")
    'Affichez le résultat dans la fenêtre d'exécution
    Debug.Print Numéro
End Sub

Utilisation d’une Fonction à Partir d’une Feuille Excel

En plus d’appeler une fonction à partir de votre code VBA en utilisant une sous-procédure, vous pouvez également appeler la fonction à partir de votre feuille Excel. Les fonctions que vous avez créées apparaissent par défaut dans votre liste de fonctions, dans la section « Personnalisées » de la liste des catégories.

Cliquez sur le bouton fx pour afficher la boîte de dialogue Insérer une fonction.

Sélectionnez Personnalisées dans la liste des catégories

Sélectionnez la fonction dont vous avez besoin parmi les fonctions Personnalisées disponibles.

Sinon, lorsque vous commencez à écrire votre fonction dans Excel, la fonction devrait apparaître dans la liste déroulante des fonctions.

Si vous ne voulez pas que la fonction soit disponible dans une feuille Excel, vous devez mettre le mot Private devant le mot Function lorsque vous créez la fonction dans votre code VBA.

Private Function CalculerÉcartJours(Date1 As Date, Optional Date2 As Date = "2020-06-02") As Double
    ' Calcule l'écart en jours entre les deux dates
    CalculerÉcartJours = Date2 - Date1
End Function

La fonction n’apparaîtra plus dans la liste déroulante des fonctions Excel disponibles.

Il est toutefois intéressant de noter que vous pouvez toujours utiliser la fonction – elle n’apparaîtra simplement pas dans la liste lorsque vous la rechercherez!

Si vous avez déclaré le deuxième argument comme facultatif, vous pouvez l’omettre dans la feuille Excel ainsi que dans le code VBA.

Vous pouvez également utiliser la fonction que vous avez créée sans argument dans votre feuille Excel.

 

vba-free-addin

Module Complémentaire d'Exemples de Code VBA

Accédez facilement à tous les exemples disponibles sur le site.

Naviguez simplement dans le menu, cliquez, et le code sera inséré directement dans votre module. Module complémentaire .xlam.

(Aucune installation requise!)

Téléchargement gratuit

Retour aux exemples de code VBA