Selection et ChartObject

tototiti2008

XLDnaute Barbatruc
Bonjour à tous,

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é ?

Merci
 

Pièces jointes

  • Classeur1.xlsm
    17.1 KB · Affichages: 60
  • Classeur1.xlsm
    17.1 KB · Affichages: 61

Dranreb

XLDnaute Barbatruc
Re : Selection et ChartObject

Bonsoir.

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…
 

tototiti2008

XLDnaute Barbatruc
Re : Selection et ChartObject

Bonsoir Dranreb,

Merci de la réponse

Tu as testé sur XL 2003 ? Si oui ça ne m'étonnes pas, je pense que c'est un comportement spécial après Excel 2007 et les "nouveaux" graphiques
Le For each Elt in Selection n'a aucune chance de marcher car ce n'est pas une collection.

un essai

Edit : Ah oui tu veux dire avec un seul objet sélectionné, Ok, désolé... Moi je n'ai toujours accès à rien sur l'objet fantôme... bizarre
 

Pièces jointes

  • Classeur1.xlsm
    14.8 KB · Affichages: 30
  • Classeur1.xlsm
    14.8 KB · Affichages: 49
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Selection et ChartObject

Bonsoir à tous

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
 

tototiti2008

XLDnaute Barbatruc
Re : Selection et ChartObject

Bonsoir Staple, :)

Oui, si je ne sélectionne pas et que je connais le nom pas de soucis
pas de soucis si je sélectionne en VBA
Code:
ActiveSheet.ChartObjects("Graphique 4").Activate
Set aa = Selection

mais si je sélectionne manuellement....
Tu as le même soucis ?
 

mromain

XLDnaute Barbatruc
Re : Selection et ChartObject

Bonjour Marc, Bernard, JM, le forum :)

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.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Re : Selection et ChartObject

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.
 

mromain

XLDnaute Barbatruc
Re : Selection et ChartObject

Re-bonjour à tous,


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 :

  1. 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...
  2. 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 :
      Code:
      DrawingObjects - "Rectangle 2" = ChartObject + "Rectangle 2" - "Rectangle 2" = ChartObject.
      .
  • 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é.

A+
 

Pièces jointes

  • Classeur2.xlsm
    24.6 KB · Affichages: 69
  • Classeur2.xlsm
    24.6 KB · Affichages: 73

tototiti2008

XLDnaute Barbatruc
Re : Selection et ChartObject

Bonsoir à tous, :)

Mais petite question, tu veux faire quoi au juste sur le graphique sélectionné ?

Hein ? rien c'était juste pour faire avancer le schimilililibiliblick :D
Un test sur Selection qui a mal tourné :)

Est-ce que ActiveChart est défini et correspond à quelque chose de mieux exploitable ?

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

Merci à tous :)
 

tototiti2008

XLDnaute Barbatruc
Re : Selection et ChartObject

Bonjour à tous, :)

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...
 
Dernière édition:

Discussions similaires

Réponses
43
Affichages
4 K

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 294
Messages
2 086 895
Membres
103 404
dernier inscrit
sultan87