Déclaration de variable Object et ToggleButton

Bonjour à toi qui passe par ici !

Je suis à la recherche d'une explication quant à un comportement d'excel qui m'échappe et peut-être pourras-tu m'aider.

Voici la situation :

Sur une feuille de calculs (que nous nommerons de manière très inspirée "Feuil1") j'ai un ToggleButton (disons "Button1") dont il m'arrive de récupérer et/ou manipuler l'état ici et là dans mon code.

La feuille intervenant en de multiples endroits dans mes macros, j'ai souhaité me simplifier la vie en utilisant une variable globale (oui, il y a sûrement plus propre, mais là n'est pas la question). S'agissant d'une feuille de calculs, je déclare ma varible comme telle avant de lui assigner la feuille en question. En gros :

Public maFeuille As Worksheet (dans un premier temps)
Set maFeuille = ThisWorkbook.Worksheets("Feuil1") (complètement ailleurs dans le code)

Jusque là tout va bien. Les ennuis commencent quand je cherche à jouer avec l'état du bouton... Naïf que suis, je tente d'y accéder en utilisant :

maFeuille.Button1.Value

et me fais copieusement insulter par excel (erreur de compilation, tout ça).

Je ne me décourage pas et tente, pour voir, de passer outre la variable avec :

ThisWorkbook.Worksheets("Feuil1").Button1.Value

qui fonctionne parfaitement bien.

Histoire de voir ce qui se passe là-dessous, je dégaine l'espion qui semble me dire que la seule différence entre maFeuille et ThisWorkbook.Worksheets("Feuil1") est leur type. Il m'annonce Worksheet/Feuil1 pour le premier et Object/Feuil1 pour le deuxième.

Toujours dans l'espion, je tente d'accéder au bouton qui apparaît bien dans les deux arborescences et sans trop de surprise, erreur en passant par la varaible alors que tout va bien avec l'expression complète.

Passablement têtu, je modifie ma déclaration afin de changer ma variable en objet et non simplement une feuille de calcul (qui est pourtant bien un objet parmi d'autres, sauf erreur de ma part). Je me retrouve donc avec :

Public maFeuille As Object

Et là, miracle, ça fonctionne !

J'aimerais donc que tu m'expliques si tu le peux, Ô astucieux passant, pourquoi le fait de dire à excel que l'objet qu'il manipule est une feuille de calcul l'empêche d'accéder à un bouton pourtant bel et bien présent dans ladite feuille de calcul. Et pourquoi il ne râle pas une seule seconde si on le laisse ignorer ce détail en lui mettant simplement un objet indéterminé entre les pattes.

Il ne s'agit pas là d'un problème puisque mon code fonctionne comme je le souhaite, mais bien d'une envie de comprendre le pourquoi de ce comportement d'excel afin de ne pas me faire avoir la prochaine fois.

Merci d'avance pour ton temps si d'aventure tu as une explication à me suggérer.

Guitruc

Bonjour,

Le bouton bascule est un ActiveX posé sur la feuille Excel et cette feuille Excel possède un objet Module portant le nom de "Feuil1" (même en renommant la feuille dans Excel ce nom ne change pas) donc, il suffit de déclarer ta feuille comme Object pour que la référence se fasse à l'objet Module Feuil1 attaché à la feuille de calcul mais il est plus propre de faire référence directement à ce module dans la déclaration, donc :

Public maFeuille As Object

devient :

Public maFeuille As VBAProject.Feuil1

qu'il faut bien évidement initialiser de cette façon :

Set maFeuille = Feuil1

Tu peux faire de même pour ton bouton :

Dim BtnBascule As MSForms.ToggleButton

et l'initialiser de cette façon :

Set BtnBascule = maFeuille.Button1

Et pour lire sa propriété Value il suffit de faire comme tu fais déjà :

MsgBox BtnBascule.Value

Bonjour,

La différence de comportement de la variable selon qu'elle est déclarée en tant que Worksheet ou Object m'a interrogée... et je vais méditer les explications de Theze à ce propos.

Ceci dit, la syntaxe 'normale' fonctionnera avec la variable Worksheet (comme avec les autres d'ailleurs) :

maFeuille.OLEObjects("Button1").Object.Value

En théorie, la différence entre entre une variable typée Worksheet et une variable typée Object ou non typée (Variant) est que pour la première l'affectation se fait lors de la compilation alors que pour les deux autres elle n'intervient qu'au moment de l'exécution. La différence de comportement au profit de variables non typée ou de type imprécis ne me paraît donc guère logique...

Cordialement.

Bonjour,

Merci à tous les deux pour vos réponses.

MFerrand, cela me rassure de voir que je ne suis pas le seul à tiquer sur ce phénomène.

Cela dit je vais aussi méditer tes explications, Theze. Je ne visualisais pas du tout le lien feuille/module et ses conséquences de cette manière. Je risque de devoir revoir une partie de mon code une fois que j'aurai bien cerné tout ça pour qu'il soit plus propre.

Merci encore !

Rechercher des sujets similaires à "declaration variable object togglebutton"