Déclaration de variable Object et ToggleButton Le sujet est résolu

Y compris Power BI, Power Query et toute autre question en lien avec Excel
Répondre
G
Guitruc
Nouveau venu
Nouveau venu
Messages : 2
Inscrit le : 30 septembre 2016
Version d'Excel : 2010 FR

Message par Guitruc » 30 septembre 2016, 15:54

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
T
Theze
Passionné d'Excel
Passionné d'Excel
Messages : 4'019
Appréciations reçues : 306
Inscrit le : 26 janvier 2011
Version d'Excel : 2007/2019

Message par Theze » 30 septembre 2016, 17:04

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
Il vaut mieux un qui sait que cent qui cherchent :wink:

Ce forum étant un lieu de partage, je n'accepte pas les messages privés !
M
MFerrand
Fanatique d'Excel
Fanatique d'Excel
Messages : 17'171
Appréciations reçues : 448
Inscrit le : 20 juillet 2015
Version d'Excel : 2010 FR

Message par MFerrand » 1 octobre 2016, 01:34

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.
G
Guitruc
Nouveau venu
Nouveau venu
Messages : 2
Inscrit le : 30 septembre 2016
Version d'Excel : 2010 FR

Message par Guitruc » 3 octobre 2016, 11:33

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 !
Répondre
  • Sujets similaires
    Réponses
    Vues
    Dernier message