En fait, faut déjà voir avec les types valeurs et les types références.
1) Types valeurs (Integer, Long, Short, etc.)
Avec ByVal, une copie de la variable est envoyée, donc la modifier dans la fonction ne la modifie pas à l'extérieur de la fonction.
Avec ByRef, c'est un pointeur sur la variable, donc la modifier dans la fonction la modifie à l'extérieur
2) Types références (String, et tout ce qui est objet)
Avec ByVal, On envoie un pointeur sur l'objet. On peut modifier les propriétés de l'objet, mais on ne peut l'assigner à un nouveau. Donc on pourra faire genre objet.propriété = pouet, ça modifera l'objet à l'extérieur. Par contre, un objet = New Bidule() n'aura aucune conséquence à l'extérieur de la fonction. Même chose pour les String, un pouet = "prout", équivalent à pouet = New String("prout" ), n'aura évidemment aucun effet à l'extérieur.
Avec ByRef, c'est un pointeur sur un pointeur, donc pour pourra faire objet = New Bidule(), ça modifira l'objet à l'extérieur de la fonction