Affecter une macro à un graphique (exemple : portion de camembert)

Ptit rat Messages postés 8 Date d'inscription vendredi 5 août 2005 Statut Membre Dernière intervention 9 septembre 2010 - 9 sept. 2010 à 08:43
dref2007 Messages postés 4 Date d'inscription mardi 23 janvier 2007 Statut Membre Dernière intervention 25 novembre 2010 - 25 nov. 2010 à 15:27
Bonjour,

Je cherche à affecter une macro sur un graphique existant. Par exemple, il s'agit d'un camembert et je veux que lorsque je clique sur une portion y associer une macro.
Aujourd'hui, pour pallier à ce problème, je créer un objet transparent et y associe une macro. Puis je le possitionne sur la portion. Le gros problème est qu'il faille bouger l'objet à chaque fois qu'une valeur change.

Merci d'avance

3 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 344
10 sept. 2010 à 14:17
Bonjour,

déolé pour le délai de réponse..; la question n'était pas spécialement facile
bref...

En te servant des sites suivants :silkyroad.developpez.com
Exceltip.com

en prime, voici un petit exemple
=> Donne le Numéro de la "tranche" sélectionnée
En premier, tu dois créer un module de classe depuis l'éditeur de macros (insertion / Module de classe )
ensuite tu le renome en : ChartEventClass

Viens ensuite le code à y placer :
Public WithEvents ChartObject As Chart

Private Sub ChartObject_Select(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long)
    If Arg2 < 1 Then
        Exit Sub
    Else
        MsgBox "Tranche numéro : " & Arg2 'numéro de la "tranche sélectionnée"
       
    End If
End Sub


Après, dans l'objet ThisWorkbook, tu places le code suivant :
Dim ChartObjectClass As New ChartEventClass
Private Sub Workbook_Open()
    Set ChartObjectClass.ChartObject = Worksheets(1).ChartObjects(1).Chart
End Sub



et pour terminer, tu sauvegardes ton classeur, tu le fermes puis le réouvre.. et hop.. le tour est joué ^^


Cordialement,
Jordane,
______________________________________________________
Règles du forum à lire avant de poster une question : ICI
0
bigfish_le vrai Messages postés 1835 Date d'inscription vendredi 13 mai 2005 Statut Membre Dernière intervention 20 novembre 2013 15
14 sept. 2010 à 11:31
Salut,

j'ai posté une source qui répond à ton besoin. en attendant la validation de cette source voici le code en avant première:

Option Explicit

Sub InfoSurPointGraph()
'cette macro est à affecter à un graphique.
'Le graphique choisi pour la demo est de type "camembert".
Dim MonGraph As Object, MaMacro As String, MonPoint As Point, SerieValues As Variant
Dim DataLabelEnable As Boolean, Nom As String, IndexPoint As Variant, SerieXValues As Variant
    
    'on met le graphique appelant dans une variable object
    Set MonGraph = ActiveSheet.ChartObjects(Application.Caller)
    'on enregistre le nom de la macro associée
    MaMacro = MonGraph.OnAction
    'on dissocie la macro du graph pour éviter que l'utilisateur ne relance la macro
    MonGraph.OnAction = ""
    MonGraph.Activate
    Do
        Err.Clear
        'ici on attend qu'un objet, dont le parent est une serie, soit sélectionné
        On Error Resume Next
        Nom = ActiveChart.SeriesCollection(Selection.Parent.Name).Name
        'si l'objet attendu est sélectionné
        If Err = 0 Then
            Exit Do
        ElseIf Err = 91 Or TypeOf Selection Is Range Then 'si une cellule ou un autre objet est sélectionnée on arrete tout.
            'on associe à nouveau le graph avec la présente macro avant de sortir
            MonGraph.OnAction = MaMacro
            Exit Sub
        End If
        DoEvents
    Loop
    
    On Error GoTo 0 'annule le "on error resume next"
    Do
        'les secteurs d'un graph de type "camembert" sont des objets Point de la collection Points
        ' donc si un point(secteur) est sélectionné
        If TypeOf Selection Is Point Then
            'on le met dans une variable de type Point
            Set MonPoint = Selection
            'on vas passer par le datalabel pour récupérer l'index du point sélectionné
            With MonPoint
                Application.ScreenUpdating = False
                If .HasDataLabel = False Then 'si les datalabels ne sont pas activés
                    DataLabelEnable = False 'on enregistre cet etat
                    .HasDataLabel = True 'on les actives pour pouvoir récupérer le nom du datalabel
                Else
                    DataLabelEnable = True
                End If
                'le nom du datalabel est sous la forme : "S1P2" qui se traduit par Serie1 Point2
                'on vas donc récupérer le chiffre apres le "P".
                IndexPoint = LCase$(.DataLabel.Name)
                IndexPoint = Right$(IndexPoint, Len(IndexPoint) - InStr(1, IndexPoint, "p", vbTextCompare))
                If DataLabelEnable False Then .HasDataLabel False 'on retabli l'etat des datalabels
                
                SerieValues = ActiveChart.SeriesCollection(Nom).Values
                SerieXValues = ActiveChart.SeriesCollection(Nom).XValues
                '
                '-------------------------------------------------------------------
                'ici la msgbox peut être remplacée par une macro
                MsgBox "La consommation est de " & SerieValues(IndexPoint) & "% pour " & SerieXValues(IndexPoint) & " 2010"
                '-------------------------------------------------------------------
                '
                Application.ScreenUpdating = True
            End With
            'on donne le focus au graph pour éviter de rester coincé dans une boucle qui afficherait la msgbox
            MonGraph.Select
            ActiveChart.ChartArea.Select
            DoEvents
        End If
        DoEvents
        'un clic dans une cellule arrête tout !
        If TypeOf Selection Is Range Then Exit Do
    Loop
    'on associe à nouveau le graph avec la présente macro
    MonGraph.OnAction = MaMacro
End Sub


Contrairement à ce que propose jordane45, je n'utilise pas les événements dans les graphiques, ce qui est plus facile à mettre en place si tu est débutant.

Si tu tien à utiliser les événement dans les graphiques tu aussi aller voir une source que j'ai posté ici :
http://www.vbfrance.com/codes/GRAPHIQUE-3D-TOUT-MOUVEMENT_47595.aspx

A+
0
dref2007 Messages postés 4 Date d'inscription mardi 23 janvier 2007 Statut Membre Dernière intervention 25 novembre 2010
25 nov. 2010 à 15:27
Bonjour,
Je me permets de relancer ce post. Je souhaiterais effectuer le même type de travail sur Access. Le code est accepté. Le problème, c'est que l'objet chart ne semble pas être identique à celui d'excel. Quand je compile le projet, j'obtiens un message d'erreur "l'objet classe n'est pas une source d'evenements d'automation".

Pourriez vous m'aider ?
0
Rejoignez-nous