Accueil | Ce site | CV | Excel | Livre dor | Macros XL4 | Modèles | VBA
ByRef et ByVal permettent dindiquer comment passer des arguments à une procédure (Sub ou Function). En voici un exemple :
Function VerifSaisie(ByVal b As Boolean, ByRef i As Integer) End Sub
ByRef représente loption par défaut et peut donc être implicite. La première ligne de la fonction VerifSaisie aurait également être écrite ainsi :
Function VerifSaisie(ByVal b As Boolean, i As Integer)
Le Ref, inclus dans le mot-clef ByRef, implique quune référence à lélément passé à la procédure est conservée, et que cet élément peut être modifié par la fonction.
ByVal signifie au contraire que lors de la passation dun argument, celui-ci est évalué, et que seule sa valeur est prise en compte. Il en résulte que lélément passé à la procédure ne peut être modifié par celle-ci.
La différence entre ByRef et ByVal nest pas forcément immédiatement limpide pour tout le monde. Lexamen de 2 variantes dune procédure va permettre, déclaircir les choses, si nécessaire.
Sub Calcul1() Dim Montant As Integer Montant = 10 Produit1 Montant, 2 MsgBox "Montant = " & Montant, 32 End Sub
Sub Produit1(ByVal Nb As Integer, N As Integer) Nb = Nb * N End Sub
La procedure Calcul1 utilise une variable, Montant, initialisée à 10, puis appelle une autre procédure, Produit1, à laquelle 2 arguments sont passés, la variable Montant et le chiffre 2. Enfin, la dernière instruction de la procédure Calcul1 affiche la valeur de Montant.
Produit1 effectue simplement la multiplication des 2 arguments qui lui sont passés. Le premier est désigné par Nb, le second par N. La première instruction affecte à Nb le produit des 2 éléments passés à la procédure. Nb passe ainsi de 10 à 20.
La figure 1 reproduit le message affiché à lissue de la procédure Calcul1. La valeur de la variable Montant n'a pas été modifiée, car ByVal a été utilisé pour passer largument correspondant à Montant.

Fig. 1 - Le message affiché à lissue de la procédure Calcul1.
La procédure Calcul2 ne diffère de Calcul1 que par la routine appelée, Produit2 qui effectue le même calcul que Produit1.
Sub Calcul2() Dim Montant As Integer Montant = 10 Produit2 Montant, 2 MsgBox "Montant = " & Montant, 32 End Sub
Sub Produit2(ByRef Nb As Integer, n As Integer) Nb = Nb * n End Sub
À la fin de la procédure Calcul2, la valeur de Montant est également affichée. Cette fois, Montant est égal à 20. Cela vient de la façon dont les arguments ont été passés à la routine Produit2.
Le fait d'avoir utilisé ByRef pour largument Nb signifie que celui-ci est lié à Montant. Toute modification de Nb se répercute sur Montant. Puisque Nb, initialement égal à 10 est multiplié par 2, la valeur de Montant passe à 20.

Fig. 2 - Le message affché à lissue de la procédure Calcul2.