Différence entre "byref" et "byval" (Pour VB6 ou VBA)

Différence entre "byref" et "byval"

Introduction

Dans nos fonctions qui acceptent des paramètres, on passe souvent ces paramètres sans faire attention à la façon avec laquelle on les passe. Est-ce que par valeur (ByVal) ou bien par référence (ByRef) ? Pourtant c'est quelque chose de très important de choisir entre les passés "ByVal" ou bien "ByRef". En effet, ça peut changer beaucoup de choses et c'est ce qu'on va voir au cours de ce tutorial.

ByVal : Par Valeur

Passer une variable à une fonction quelconque par valeur signifie qu'on passe juste une copie de cette variable. Plus précisément sa valeur qui peut être traitée par la fonction de plusieurs façons. Soit assigner sa valeur à une autre variable soit l'utiliser d'une autre façon. On ne peut jamais changer sa valeur puisque même si on affecte une modification à la variable, celle-ci ne sera effectuée que sur la variable locale de la fonction et non pas sur la variable principale qui a été passée comme paramètre à notre fonction.

ByRef : Par Référence

Passer une variable à une fonction par référence permet, à cette fonction, d'affecter des modifications à cette variable (c'est à dire la variable principale également) et ça peut être utilisé par exemple dans une Sub qui ne renvoie pas de valeur mais juste affecte des opérations sur les variables passées. On va voir un exemple pour bien comprendre la notion de ces deux mot clé.

Si on a une fonction qui peut accepter que ses paramètres soit passer ByVal, alors on peut utiliser a la place de ByVal le mot clé ByRef mais le contraire ne peut pas être valide parce que si une fonction demande qu'une variable soit passée en tant que référence alors elle veux lui affecter une nouvelle valeur ce qui ne peut pas être fait si la variable est passée par valeur.

Exemple

Dans cet exemple on va créer une Sub qui n aura pas de valeur à renvoyer bien sur. Cette SUB aura le nom SWAP. Sa fonction est de donner la valeur de X à Y et la valeur de Y à X ...
Le code de la SUB sera comme ceci :

Public Sub SWAP(ByRef X As Integer, ByRef Y As Integer)
Dim Tmp As Integer

Tmp = X
X = Y
Y = Tmp
End Sub

Ici on déclare les paramètres par référence

L'appel de la SUB sera :

Dim X As Integer = 10
Dim Y As Integer = 20
SAWP(X, Y)
Msgbox " X Value = " & X & VbCrlf & " Y Value = " & Y

On a bien passé à la fonction SWAP deux variables qui sont X=10 et Y=20. La SUB SWAP va alors changer la valeur de ces deux variables et le MsgBox affichera :
X Value = 20
Y Value = 10

alors les valeurs des variables principales passées à la fonction SWAP ont été changées.

mais si on écrit "ByVal" à la place de "ByRef" le MsgBox affichera :
X Value = 10
Y Value = 20

Alors la fonction ne changera pas les valeurs des variables.

======================================================

Une petite observation, maintenant : comme nous le savons, l'utilisation de l'instruction Call pour l'appel d'une procédure (sub) , impose de passer entre parenthèses, si on utilise cette notation, les paramètres passés à la procédure.
En doublant ces parenthèses (

call la_proc((param1, param2))

, VB force le passage par valeur (by val) même si "by ref" est spécifié dans la procédure. Mais ce n'est là qu'une observation, la grande majorité des développeurs n'utilisant pas l'instruction Call ou ne l'utilisant qu'avec des parenthèses simples (et en spécifiant leur choix de mode de passage dans la procédure)

Ce document intitulé « Différence entre "byref" et "byval" (Pour VB6 ou VBA) » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Rejoignez-nous