Les arguments de valeurs et de références (ByVal et ByRef) de VBA sur Excel
Pour ce nouveau chapitre de la formation dédiée à l’apprentissage de VBA, nous allons découvrir les types d’arguments que nous pouvons utiliser en VBA. En effet, nous avons déjà eu l’occasion de découvrir à plusieurs reprises comment passer des arguments à une procédure ou une fonction VBA pour lui transmettre des informations. Aujourd’hui, nous allons découvrir deux nouveaux mots-clés qui vont permettre de personnaliser la manière dont ces arguments doivent être utilisés.
Téléchargement
Vous pouvez télécharger le fichier d'exemple de cet article en cliquant sur le lien suivant :
Tutoriel Vidéo
1. Présentation
Comme vous le savez maintenant, lorsque l’on créé une procédure ou une fonction en VBA, nous pouvons passer très simplement des arguments entre parenthèses, ce qui permettra de personnaliser l’appel à cette macro-commande.
Par contre ce que nous savons déjà beaucoup moins c'est qu'il existe deux méthodes pour passer ses arguments : soit envoyer des arguments par valeur, soit par référence.
Lorsque nous utilisons un argument par valeur, cela signifie que nous souhaitons envoyer une valeur dans une procédure appelée depuis une procédure appelante afin que celles-ci soient utilisés en tant que valeur attribuée à une variable.
D’un autre côté, lorsque nous utilisons un argument par référence alors dans ce cas-là nous envoyons directement la référence à une variable existantes dans la procédure appelante afin que celles-ci soient modifiés dans la fonction appelée.
Il ne fait aucun doute que ce que je viens de vous expliquer peut vous paraitre assez complexe à comprendre, mais pas de panique nous allons revenir sur cette notion dans le détail au cours de ce chapitre
2. Les arguments de valeur : ByVal
L’argument par valeur consiste donc à ne prendre que la valeur de l’éventuelle variable passée en argument.
Dans l’exemple suivant, nous appelons la macro calculTVAByVal qui affiche une notification présentant le montant de la TVA correspond à un montant HT et un taux de TVA donné.
Comme le laisse penser le nom de la macro, ces arguments sont définis avec le mot clé ByVal, il s’agit donc d’arguments par valeur :
Sub macroPrincipale()
Dim HT As Double, taux As Double
HT = 100
taux = 0.2
Call calculTVAByVal(HT, taux)
End Sub
Sub calculTVAByVal(ByVal HT As Double, ByVal taux As Double)
Dim TVA As Double
TVA = HT * taux
MsgBox "Montant de TVA = " & TVA
End Sub
Dans les faits, lorsque nous utilisons ByVal, une copie de la variable est créée en mémoire, il s’agit donc de deux éléments indépendants l’un de l’autre.
3. Les arguments de référence : ByRef
En revanche, l’argument par référence fait appel, non uniquement à une valeur, mais à la référence de l’élément passé en argument.
C’est pourquoi, toute modification impactant l’argument au sein de la macro appelée va également avoir des répercussions sur l’élément lui-même.
Dans ce nouvel exemple, le montant de la TVA est déterminé en utilisant la macro calculTVAByRef, qui utilise cette fois-ci des arguments par référence
Sub macroPrincipale()
Dim HT As Double, taux As Double
HT = 100
taux = 0.2
Call calculTVAByRef(HT, taux)
End Sub
Sub calculTVAByRef(ByRef HT As Double, ByRef taux As Double)
Dim TVA As Double
TVA = HT * taux
MsgBox "Montant de TVA = " & TVA
End Sub
Ici, il n’y a aucune différence, la macro récupère les valeurs des arguments et calcul le montant de la TVA.
En revanche, si nous modifions la valeur de l’un de ces arguments, le changement sera également effectif dans la macro appelante.
Pour nous rendre compte, nous commençons par modifier le taux de TVA dans la procédure calculTVAByRef :
Sub calculTVAByRef(ByRef HT As Double, ByRef taux As Double)
taux = 0.1
…
Ensuite, nous affichons cette valeur dans la procédure appelante :
Sub macroPrincipale()
…
Call calculTVAByRef(HT, taux)
MsgBox "Nouveau taux : " & taux
End Sub
Excel nous affiche alors la valeur de la variable taux après que la procédure calculTVAByRef ait été appelée.
Celle-ci est maintenant égale à 0,10 :
Il faut également savoir que le type d’argument est l’argument par référence il n’est pas nécessaire de le préciser au niveau de la déclaration des arguments :
Sub calculTVAByRef(HT As Double, taux As Double)
À l’usage, lorsque l’on souhaite modifier la valeur d’une variable, nous utilisons plus facilement une fonction, mais utiliser des arguments par référence, a pour avantage de pouvoir modifier rapidement plusieurs variables.
Dans les faits, lorsque nous utilisons ByRef, la macro appelée agit directement sur la variable correspondante, à son emplacement dans la mémoire.
L’argument permet donc d’enregistrer uniquement l’adresse de la variable en mémoire.
Par conséquent, pour éviter tout risque d’erreur, il faut veiller à ce que le type donner à l’argument soit compatible avec le type de la variable utilisée !
C’est pourquoi, si nous modifions le type de l’argument taux en Integer, nous aurons alors une erreur :
Sub calculTVAByRef(HT As Double, taux As Integer)
Un autre intérêt d’utiliser une référence à une variable, et non pas une copie de celle-ci sera d’économiser de la mémoire lorsque celle-ci est volumineuse (par exemple s’il s’agit d’un objet composé de nombreux sous objets).