Accueil | Ce site | CV | Excel | Livre d’or | Macros XL4 | Modèles | VBA

 Les options ByRef et ByVal

ByRef et ByVal permettent d’indiquer 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 l’option 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 qu’une 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 d’un 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 n’est pas forcément immédiatement limpide pour tout le monde. L’examen de 2 variantes d’une 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é à l’issue de la procédure Calcul1. La valeur de la variable Montant n'a pas été modifiée, car ByVal a été utilisé pour passer l’argument correspondant à Montant.


Fig. 1 - Le message affiché à l’issue 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 l’argument 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é à l’issue de la procédure Calcul2.