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
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.