Excel · VBA · A3iformations

Procédures, fonctions et macros en VBA : Sub, Function et paramètres

Tout le code VBA vit dans des procédures. Une procédure Sub exécute des actions : c’est ce qu’on appelle une macro. Une Function calcule et renvoie une valeur, utilisable dans le code et même dans une cellule d’Excel, comme =SOMME(). Les paramètres transmettent des données d’une procédure à l’autre. Cette page montre quelles procédures apparaissent dans la liste des macros, comment elles s’appellent entre elles, comment écrire une fonction et l’utiliser dans une feuille, et comment passer des arguments. Voir aussi MsgBox et InputBox et les variables.

Sub … End SubAgir
Call, F8, pile des appelsEnchaîner
Function … As DoubleCalculer
ByRef, ByVal, OptionalTransmettre
1

Les procédures Sub

Une procédure commence par Sub Nom() et se termine par End Sub. Le nom commence par une lettre, sans espace ni accent de préférence. Public (valeur par défaut) rend la procédure utilisable dans tout le projet ; Private la limite à son module. Pour apparaître dans la boîte Macro (Alt + F8), une procédure doit être une Sub publique, sans paramètre. Exit Sub quitte la procédure avant la fin.

Simulateur : modifiez les déclarations, observez la liste des macros

      
    

Des outils internes invisiblesDéclarez Private les procédures de service appelées par d’autres : l’utilisateur ne voit dans Alt + F8 que les macros qu’il doit lancer.
Où ranger le code ?Les macros générales vont dans un module standard (Insertion › Module). Les modules de feuille et ThisWorkbook sont réservés aux procédures événementielles (Worksheet_Change, Workbook_Open…).
2

Appeler une procédure depuis une autre

Plutôt qu’une longue macro, on découpe le travail en petites procédures qu’une procédure principale appelle dans l’ordre : AjouterTVA total ou Call AjouterTVA(total) (avec Call, parenthèses obligatoires). En pas à pas, F8 entre dans la procédure appelée, Maj + F8 l’exécute d’un bloc sans y entrer, Ctrl + Maj + F8 termine la procédure en cours et revient à l’appelante. La pile des appels (Ctrl + L) montre la chaîne des procédures en cours.

Simulateur : exécutez Facturer pas à pas

      
Pile des appels
    Variables locales
    Affichage

    Une procédure, une tâcheUn nom qui dit ce que fait la procédure (AjouterTVA, ImprimerFacture) rend la procédure principale lisible comme un sommaire.
    Depuis un autre classeurApplication.Run "Classeur.xlsm!NomMacro" lance une macro d’un autre classeur ouvert, avec ses arguments éventuels.
    3

    Les fonctions

    Une Function se déclare comme une Sub, avec en plus le type de la valeur renvoyée : Function TTC(ht As Double) As Double. Pour renvoyer le résultat, on l’affecte au nom de la fonction : TTC = ht * 1.2. On l’appelle comme une fonction d’Excel, avec des parenthèses, et on récupère le résultat : x = TTC(1400). Dans la fenêtre d’exécution, ? TTC(1400) l’affiche directement. L’opérateur & concatène les textes dans une fonction qui renvoie un String.

    Simulateur : appelez une fonction avec vos arguments
    
          
    Fenêtre d’exécution (Ctrl + G)
    
    

    L’oubli classiqueSi aucune ligne n’affecte le nom de la fonction, elle renvoie 0 (nombre), «  » (texte) ou Empty (Variant), sans aucun message d’erreur.
    Exit FunctionComme Exit Sub, Exit Function sort immédiatement. Affectez le résultat avant : If nb = 0 Then Remise = 0: Exit Function.
    4

    Les fonctions appelées depuis Excel

    Une Function publique écrite dans un module standard devient une fonction de feuille : on tape =TTC(B2) dans une cellule, avec des points-virgules entre les arguments comme pour toute formule française. Elle apparaît dans Insérer une fonction (Maj + F3), catégorie Personnalisées, et se recalcule quand ses arguments changent. Deux limites : le classeur doit être enregistré en .xlsm avec les macros activées, et la fonction ne peut que renvoyer une valeur ; elle ne peut ni modifier une autre cellule, ni changer la mise en forme.

    Simulateur : une feuille qui utilise les fonctions VBA
    D2fx
    
          
    Insérer une fonction › Personnalisées

    #NOM? à l’ouvertureEnregistré en .xlsx, le classeur perd son code : toutes les formules qui utilisent vos fonctions affichent #NOM?. Enregistrez en .xlsm, ou dans une macro complémentaire (.xlam) pour les partager entre classeurs.
    RecalculUne fonction ne se recalcule que si ses arguments changent. Si elle lit d’autres cellules sans les recevoir en argument, ajoutez Application.Volatile en première ligne, ou forcez le recalcul avec Ctrl + Alt + F9.
    5

    Les paramètres

    Les paramètres se déclarent entre les parenthèses, avec leur type : Sub Inscrire(nom As String, nb As Integer). Par défaut, VBA les passe par référence (ByRef) : la procédure appelée travaille sur la variable de l’appelant et peut la modifier. ByVal transmet une copie. Optional rend un paramètre facultatif, avec une valeur par défaut ; pour un Optional de type Variant sans valeur par défaut, IsMissing indique s’il a été fourni. À l’appel, les arguments nommés (nb:=3) évitent de dépendre de l’ordre.

    Simulateur 1 : ByRef ou ByVal ?
    
          
    Fenêtre d’exécution : Debug.Print prix

    Simulateur 2 : Optional, IsMissing et arguments nommés
    
          
    Fenêtre d’exécution

    ByRef par défautUne procédure qui modifie un paramètre modifie la variable de l’appelant. Si ce n’est pas voulu, déclarez ByVal : le code est plus sûr et l’intention plus claire.
    Nombre variable d’argumentsFunction Total(ParamArray v() As Variant) accepte autant d’arguments qu’on veut : Total(1, 2, 3). On les parcourt avec For Each x In v.
    Exercice : découper une facturation en procédures et fonctions

    Classeur d’exercice (Énoncé et Corrigé)

    1. Enregistrez le classeur en .xlsm et collez le code de la feuille « Code VBA » dans un module standard.
    2. Ouvrez Alt + F8 : comptez les macros visibles et expliquez pourquoi les autres procédures n’y figurent pas.
    3. Exécutez Facturer pas à pas (F8, Maj + F8) en affichant la pile des appels.
    4. Dans la feuille Ventes, saisissez =TTC(B2) en D2 et =Remise(B2;C2) en E2, puis recopiez jusqu’à la ligne 6.
    5. Exécutez TestByRef et TestByVal : comparez les valeurs affichées dans la fenêtre d’exécution.
    6. Répondez aux questions de la feuille Contrôle.
    A3iformations · Organisme certifié Qualiopi · Centre de passage TOSA Interface Excel Microsoft 365 en français