XL 2016 VBA - Comment faire reconnaître l'argument Variant comme Range

Dudu2

XLDnaute Barbatruc
Bonjour,
J'ai besoin d'un (ou plusieurs) avis sur ce problème VBA.
Dans le Sub b() je reçois un argument quelconque (tout type de variable).
Lorsque je passe un Range d'une seule cellule, ce n'est pas le Range qui est passé mais le Range.Value.
Comment éviter cela et empêcher ce ".Value" implicite ?

VB:
Sub a()
    Dim r As Range
   
    Set r = [A1]
    Call b(r)
End Sub

Sub b(v As Variant)
    'Problème ici -> v contient [A1].Value et non le Range [A1]
    MsgBox VarType(v)
End Sub

Merci par avance.
 
Solution
Bonjour Dudu2, le fil,

Testez :
VB:
Sub a()
    Dim r As Range
    Set r = [A1]
    Call b(r)
End Sub

Sub b(v As Variant)
    'Problème ici -> v contient [A1].Value et non le Range [A1] => totalement faux !!!
    MsgBox IsObject(v)
    MsgBox v.Parent.Name 'teste l'objet v
End Sub
IsObject renvoie VRAI donc v est bien un objet Range avec toutes ses propriétés.

C'est vérifié avec la 2ème MsgBox.

A+

dysorthographie

XLDnaute Accro
Bonjour,
Quand tu passes un range à un paramètre de type variant tu as accès à toutes les propriétés et méthodes d'un range mais tu perds la saisie intuitive de l'objet range !

Pour t'en convaincre il te suffit en mode débug de faire un client droit sur la variable V et choisir dans le menu contextuel l'option ajouter à l'espion !
 

Dudu2

XLDnaute Barbatruc
Bonjour @dysorthographie,
Merci pour cette précision.
Dans ce cas, le TypeOf Is Range étant vérifié, je suppose qu'il faudrait affecter le Variant V dans une variable explicitement déclarée en Range dans la fonction.

En plus de cette affaire de paramètre Variant de la fonction, j'ai eu quelques difficultés à faire rentrer un Range dans un Item du Dictionary. J'y suis arrivé pour le Range et j'ai généralisé à la notion d'Object mais j'avoue n'avoir pas testé d'autre Object que le Range.
 

Discussions similaires

Statistiques des forums

Discussions
312 232
Messages
2 086 461
Membres
103 219
dernier inscrit
Akyrah