Bonjour
Pour bien faire, ce mot clé ByVal devrait toujours être précisé devant chaque paramètre, sauf s'il s'agit d'un tableau car ce n'est pas possible .
Ça permet d'initialiser une variable locale interne à la procédure, conformément à la valeur de l'expression spécifiée à l'appel.
Alors que si on ne le précise pas, ça lui complique les choses parce qu'elle ne dispose que de l'adresse d'une zone externe qui doit alors être prévue pour une donnée du type exact attendu.
Ce ByRef assumé par défaut n'est pertinent que si l'expression transmise est une propriété en écriture d'objet ou bien une variable, et cela seulement si sa modification par la procédure doit être conservée en dehors de celle ci. Et encore, c'est inutile pour un objet transmis lui même, car ses propriétés en écriture sont toujours accessibles et conservées, à moins que ce qui doit l'être soit sa redéfinition par un Set qu'elle est chargée d'effectuer.
En résumé: Localisation de la zone mémoire correspondant à un paramètre, vue coté procédure :
ByVal ==> Interne.
ByRef ==> Externe.
C'est la seule chose à retenir, toute distinction faite dans d'autres explications entre valeur et référence ne ferait que vous embrouiller.