Bonsoir.
Très vif conseil :
Mettez quasi systématiquement ByVal devant les déclarations de paramètres de procédures, sauf :
1) — S'il s'agit d'un tableau
2) — Si c'est expressément, non pas une expression mais une variable non objet qui doit être spécifiée lors de l'appel, et que sa modification par la procédure doit modifier la variable passée.
Outre vos problèmes, ne pas le faire aboutit à du code machine carrément idiot … mais tout le monde s'en fout, bien sûr.
Dans votre cas ça ne marche pas parce que votre procédure attend l'adresse d'un objet Range alors que vous voulez lui transmettre l'adresse d'un Variant.
Avec ByVal il saurait qu'il doit installer à domicile chez la procédure une copie du Range tirée du Variant s'il en contient un. Ce qui n'est d'ailleurs pas le cas, puisque vous n'avez pas fait de Set dessus. Mais s'il n'a hélas, et inutilement, que des adresses pour se dépatouiller, il faut qu'elles correspondent à des types de données rigoureusement identiques.