En tout cas le fait de préciser la bibliothèque garantit qu'il considère bien un type d'objet défini par celle ci et non un avatar d'une autre comme Excel avec ses anciens contrôles de formulaire, même masqué parfois dans l'explorateur d'objets …
ByVal laisse au compilateur l'occasion d'extraire ce qui est demandé de ce qui est spécifié si ça y figure, on se fiche du contenant d'origine. ByVal revient en effet à stipuler qu'on n'en a pas besoin car on n'a pas l'intention de le modifier. Avec l'assumé ByRef il est coincé: il doit absolument fournir l'adresse d'une zone qui contient l'adresse de l'exemplaire, alors il faut qu'elle soit rigoureusement du même type, sinon vous avez l'erreur de compilation Type d'argument ByRef Incompatible. En plus il n'a pas le droit d'exposer une expression à la possible modification par un Set effectué dans la procédure, il est de toute façon obligé d'en fabriquer une copie. Alors une copie de quoi ? La procédure demande un type d'objet et l'appelant en spécifie un autre, il ne sait plus quoi faire !