Info point de courbe de graphique excel, qui fonctionne comme un événement

Description

Petite macro qui permet de récupérer les infos d'un point, d'une courbe d'un graphique dans une feuille excel. Cette macro fonctionne comme un événement et peu donc être utilisée comme tel.

Une petite méthode qui fonctionne sans événement mais qui demande 2 clics:
Le premier pour sélectionner le graphique et le deuxième pour sélectionner le point.

Source / Exemple :


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 série, 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 arrête 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

Conclusion :


J'ai déjà posté une source similaire par l'objectif mais complètement différente du point de vu code.

Cette solution montre l'écart de mon niveau entre il y à 2 ans et maintenant. Il y à 2 ans j'aurai été incapable d’écrire ce code.
Il est court, simple mais plein de petites astuces et donc d'expériences.

A+

3ddI7IHd

Codes Sources

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.