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.
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.
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.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.
AjouterTVA, ImprimerFacture) rend la procédure principale lisible comme un sommaire.Application.Run "Classeur.xlsm!NomMacro" lance une macro d’un autre classeur ouvert, avec ses arguments éventuels.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.
Exit Sub, Exit Function sort immédiatement. Affectez le résultat avant : If nb = 0 Then Remise = 0: Exit Function.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.
Application.Volatile en première ligne, ou forcez le recalcul avec Ctrl + Alt + F9.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.
ByVal : le code est plus sûr et l’intention plus claire.Function 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é)
- Enregistrez le classeur en .xlsm et collez le code de la feuille « Code VBA » dans un module standard.
- Ouvrez Alt + F8 : comptez les macros visibles et expliquez pourquoi les autres procédures n’y figurent pas.
- Exécutez
Facturerpas à pas (F8, Maj + F8) en affichant la pile des appels. - Dans la feuille Ventes, saisissez
=TTC(B2)en D2 et=Remise(B2;C2)en E2, puis recopiez jusqu’à la ligne 6. - Exécutez
TestByRefetTestByVal: comparez les valeurs affichées dans la fenêtre d’exécution. - Répondez aux questions de la feuille Contrôle.