Boostez vos compétences Excel avec notre communauté !
Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force.
Apprenez, échangez, progressez – et tout ça gratuitement !
👉 Inscrivez-vous maintenant !
J'ai un effet bizarre avec Selection et les graphiques
Je voudrais agir sur un objet sélectionné dans la feuille de calcul
Avec TypeName, il est possible de connaître son Type
Pour mon graphique il me renvoie "ChartObject" tout va bien
Cependant c'est un objet graphique fantôme, je m'explique :
si je met un point d'arrêt dans le code et que je place un espion express sur Selection, presque toutes les propriétés sont illisibles
Je n'accède donc pas à l'objet ChartObject en lui-même à travers Selection, je ne peux même pas lire son nom... difficile d'agir dessus dans ces conditions
J'ai essayé des trucs du type
For each Elt in Selection... et plantage direct
Ci joint un classeur pour afficher le typename du graphique
Observez-vous le même soucis ? Une idée pour accéder à l'objet sélectionné ?
Pas de problème chez moi, même résultat que je mette un espion sur Selection où sur un ObjGph avec
Dim ObjGph As ChartObject
Set ObjGph = Selection
Le For each Elt in Selection n'a aucune chance de marcher car ce n'est pas une collection.
En parlant de collection, on a aussi des info par un espion sur ObjGph.Chart.SeriesCollection(1)
Mais je m'étonne un peu de ne pas trouver SeriesCollection dans l'espion précédent. Mais c'est peut être normal, tellement ces encapsulages d'objets sont compliqués…
Si on zappe la Selection, on peut s'amuser un peu plus avec le graphique 😉
VB:
Sub a()
Dim ChartObj As ChartObject, i%, test$
For Each ChartObj In ActiveSheet.ChartObjects
On Error Resume Next
test = "1: " & ChartObj.Name & Chr(13)
test = test & "2: " & ChartObj.Chart.ChartStyle & Chr(13)
test = test & "3: " & ChartObj.Chart.ChartType & Chr(13)
test = test & "4: " & ChartObj.Chart.HasTitle & Chr(13)
test = test & "5: " & ChartObj.Chart.ChartArea.Name & Chr(13)
test = test & "6: " & ChartObj.Chart.HasLegend & Chr(13)
test = test & "7: " & ChartObj.Chart.Legend.Position & Chr(13)
test = test & "8: " & ChartObj.TopLeftCell.Address(0, 0) & Chr(13)
'to be continued
i = i + 1
Next ChartObj
MsgBox test
End Sub
Je pense que le problème n’est pas lié au fait que ce soit un graphique ou non.
En fait, tu essayes de parcourir tous les éléments d’un objet-collection avec ta boucle For Each Elt In Selection.
Si Selection n’est pas un objet-collection, comme dans ton exemple où c’est un ChartObject, il est normal que le code bugue.
Au contraire, si tu sélectionne deux graphiques, Selection sera alors un objet-collection de type DrawingObjects. Tu pourras alors parcourir chaque élément de type ChartObject avec ta boucle For Each.
Le problème est le même avec des formes basiques. Si tu dessines deux rectangles et que tu n’en sélectionnes qu’un, tu auras le même comportement : Selection sera de type Rectangle et il y aura un bugue au même endroit, pour la même raison.
Si tu sélectionnes les deux, Selection sera de type DrawingObjects, et tu pourras boucler sur chaque Rectangle avec la boucle For Each.
Un moyen pour contrôler si la sélection est un objet-collection est de contrôler si TypeName(Selection)fini par un "s". Il me semble (je vais peut-être dire un bêtise) que c’est valable pour tous les objets, à l’exception de Chart.Ce lien n'existe plus.
Du coup, appliqué à ton cas, cela donnerait un code du type :
VB:
Sub test()
Dim Elt As Object
If (TypeName(Selection) Like "*s") And (TypeName(Selection) <> "Walls") Then
'cas où Selection est un objet-collection
For Each Elt In Selection
Action Elt
Next Elt
Else
'cas où Selection est un simple objet
Action Selection
End If
End Sub
Sub Action(obj As Object)
MsgBox TypeName(obj)
End Sub
A+
Edit :
Je crois que je viens de mieux comprendre ton problème Marc...
J'ai testé ce code à partir de ton fichier :
VB:
Sub test()
Dim tutu As ChartObject
MsgBox TypeName(Selection)
Set tutu = Selection
Stop
Set tutu = ActiveSheet.ChartObjects("Graphique 1")
Stop
End Sub
En ayant pris soin de sélectionner le graphique "Graphique 1" au préalable.
Et effectivement, tutu et bizarre au premier Stop et normal au second...
Etrange, comportement...
Je continue à regarder au cas où, mais ça semble être un bon bug.
Bonjour à tous.
Est-ce que ActiveChart est défini et correspond à quelque chose de mieux exploitable ?
De toute façon je l'affecterais à une Variable As Chart, je ne travaillerais pas plus longtemps ni avec Selection ni ActiveChart.
J’ai creusé la piste de ActiveChart également (suite à cette lecture), mais ActiveChart semble valoir quelque-chose (autre que Nothing) que si la sélection est sur un élément du Chart (ChartArea, ChartTitle, Axis, …).
Quand la sélection est sur le ChartObject (conteneur du Chart), ActiveChart vaut Nothing.
A force de tester, je suis tombé sur un fait étrange. Dans le fichier de Marc, j’ai remplacé la macro associée au bouton par celle-là :
VB:
Sub test()
MsgBox "TypeName(Selection) = """ & TypeName(Selection) & """" & vbNewLine & _
"ActiveChart Is Nothing = " & CStr(ActiveChart Is Nothing)
End Sub
Cette macro est associée à la fois sur :
à la forme "Rectangle 2" comme sur le fichier original ;
un bouton ActiveX ayant la propriété TakeFocusOnClic à False (pour ne pas modifier la sélection).
Voir Lien supprimé.
Maintenant : voir les deux cas suivant :
Premier cas : d’abord le bouton ActiveX, puis le "Rectangle 2" :
sélectionner un graphique ;
cliquer sur le "Bouton ActiveX"
La sélection est de type ChartArea et ActiveChart vaut bien quelque-chose.
dans la foulée, cliquer sur le "Rectangle 2"
La sélection est alors de type ChartObject, et ActiveChart ne vaut plus rien...
Ensuite : d’abord le "Rectangle 2", puis le bouton ActiveX.
On s’aperçoit que dans les 2 cas, La sélection est de type ChartObject, et ActiveChart ne vaut plus rien.
On dirait que le fait de cliquer sur le "Rectangle 2" modifie la sélection.
Cet essai complémentaire m’en persuade :
Sélectionner un graphique et cliquer sur le bouton ActiveX.
La sélection est de type ChartArea et ActiveChart vaut bien quelque-chose.
Ajouter le deuxième graphique à la sélection (avec la touche <Ctrl>) et re-cliquer sur le bouton ActiveX.
La sélection est de type DrawingObjects et ActiveChart ne vaut rien. Normal.
Enlever le deuxième graphique de la sélection (toujours avec la touche <Ctrl>). La sélection semble donc être la même qu'au premier point. Re-cliquer sur le bouton ActiveX.
La sélection est alors de type ChartObject, et ActiveChart ne vaut rien.
Il semble donc que quand on sélectionne un graphique, la sélection est bien de type ChartArea. Le fait de cliquer sur la forme "Rectangle 2" modifie la sélection, comme si on Excel ajoutait puis enlevait la forme "Rectangle 2" avant d’exécuter le code affectée à la forme.
Initialement : Selection est de type ChartArea ;
Le fait de cliquer sur la forme "Rectangle 2" pour lancer la macro :
Ajout de la forme "Rectangle 2" à la sélection : Selection devient de type DrawingObjects et contient deux éléments : un de type ChartObject (le conteneur du Chart qui contient la ChartArea initialement sélectionnée) et l’autre de type Rectangle (la Shape "Rectangle 2").
Retrait de la forme "Rectangle 2" à la sélection : Selection devient de type ChartObject.
Très grossièrement :
Au moment de l'exécution du code associé au "Rectangle 2", Selection est alors de type ChartObject.
Pour en revenir à ton problème Marc : évite d’associer la macro à une forme et préfère un contrôle ActiveX. Je pense que tu t’en sortiras plus facilement ensuite en testant si ActiveChart vaut quelque chose pour le cas où un seul graphique est sélectionné.
Merci Dranreb, déjà pas facile à décrypter si on a le bug, si ça ne bug pas chez toi c'est encore plus chaud... Comme précisé par mromain, ActiveChart vaut Nothing
un bouton ActiveX ayant la propriété TakeFocusOnClic à False (pour ne pas modifier la sélection)
Le fait de cliquer sur la forme "Rectangle 2" modifie la sélection, comme si on Excel ajoutait puis enlevait la forme "Rectangle 2" avant d’exécuter le code affectée à la forme.
Bravo mromain, je crois que tu as mis le doigt dessus, je referais quelques tests pour essayer de mieux comprendre comment ça réagit en fonction du moyen utilisé pour lancer la macro, vous dirais ce que j'en ai compris
Sur un comportement étrange peut-être, mais ça n’explique toujours pas le problème lorsque la sélection et de type ChartObject où la quasi-totalité des propriétés sont illisibles...
Sur un comportement étrange peut-être, mais ça n’explique toujours pas le problème lorsque la sélection et de type ChartObject où la quasi-totalité des propriétés sont illisibles...
BUG 🙂
La preuve Dranreb n'a pas du tout ce comportement sur Excel 2003
Mais ça me permet de sélectionner un graphique puis de cliquer sur un bouton pour effectuer des traitements sur le graphique, il me suffit juste de changer de bouton.
Sans trop de surprises, les tests m'ont donné ça :
Si on lance la macro avec :
- une forme automatique
- une image
le bug se produit, ActiveChart vaut Nothing, on n'arrive pas à manipuler le graphique
Si on lance avec :
- un bouton du ruban ou barre d'accès rapide
- un bouton ActiveX avec TakeFocusOnClic à False
- un bouton de formulaire
- un raccourci clavier
- ...
Pas de bug, on manipule le graphique avec ActiveChart facilement
Où est-ce qu'on peut signaler des bugs chez Microsoft ? 🙂
Edit : Visiblement ce bug n'existe plus sur Excel 2016...
- Navigue sans publicité - Accède à Cléa, notre assistante IA experte Excel... et pas que... - Profite de fonctionnalités exclusives Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel. Je deviens Supporter XLD