Byref et byval sans douleur

ByRef et ByVal sans douleur

Devant la confusion sur le sujet de ByRef et ByVal, j'ai décidé d'expérimenter un peu et de faire le débroussaillage.

Voici les résultats de mes tests. Seuls les tests ayant donnés des résultats pertinents sont notés ici.

Le fait que l'appel soit une Function ou une Sub ne fait pas de différence puisque les variables examinées sont les valeurs transmises. Le comportement des valeurs retournées par une fonction est bien connu.

Tout d'abord, j'ai utilisé deux Sub type.

'
Private Sub CallSubByVal(ByVal nInt as Integer)
    nInt = nInt  * 10
End Sub

Private Sub CallSubByRef(ByRef nInt as Integer)
    nInt = nInt  * 10
End Sub

Examinons les résultats:

Dim nVal as Integer

nVal=10
CallSubByVal nVal
'Debug.Print nVal :  10

nVal=10
CallSubByRef nVal
'Debug.Print nVal :  100

Pas de surprise.

Mais lisez. Et voyez l'effet des parenthèses.

nVal=10
CallSubByRef (nVal)
'Debug.Print nVal :  10

Ces parenthèses forcent le passage ByVal même si elle est spécifiée ByRef.

Certains utilisent la convention "Call FunctionName..." dans le code.

Voyons l'effet.

nVal=10
Call CallSubByRef (nVal)
'Debug.Print nVal :  100

Le mot-clé "Call" nécessite l'utilisation des parenthèses pour encadrer la valeur passée.

Pour avoir à nouveau l'effet parenthèses, il faut les doubler.

nVal=10
Call CallSubByRef ((nVal))
'Debug.Print nVal :  10

J'espère que ces éclaircissements pourront vous être utiles

Ce document intitulé « Byref et byval sans douleur » 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