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ébrousaillage.
Voici les résultat 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 bein 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 force le passage ByVal même si elle est spécifié ByRef.
Continuons.
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'èspère que ces éclaicissements pourront vous être utiles