I. Préambule▲
Si vous débutez dans le monde des graphiques, je vous conseille la lecture préalable de l'excellent tutoriel de J-M Rabilloud. Les graphiques y sont traités à partir de la page 19.
Programmer efficacement avec Excel en VBA (pdf, 46 pages, 711 Ko) par J-M Rabilloud
et
La FAQ VBA
Vous y trouverez des exemples complets et détaillés pour créer des graphiques dans le classeur.
II. Les évènements dans un graphique▲
Il existe 2 types de graphiques dans Excel:
Les onglets graphiques (Charts)
Les graphiques incorporés dans la feuille de calcul (ChartObjects)
La syntaxe est identique pour utiliser les évènements.
Par contre la méthode diffère pour y accéder.
Les feuilles graphiques:
Les évènements sont disponibles depuis l'éditeur de macros (Alt+F11)
Après avoir créé votre graphique, double cliquez sur l'onglet graphique dans l'explorateur de projets
afin d'accéder au module objet.
Ensuite, sélectionnez "Chart" dans le menu déroulant de gauche. La liste des évènements est alors
visible dans le menu déroulant de droite.
Les graphiques incorporés:
Vous devez utiliser des modules de classe pour gérer les évènements.
Les classes définissent le fonctionnement des objets. Un objet peut être défini par une propriété, une méthode ou un évènement.
(Consultez le chapitre II-B pour plus de détails).
II-A. La description des évènements▲
II-A-1. L'activation du graphique▲
Private Sub Chart_Activate()
La procédure est déclenchée dès que le graphique est activé.
Private
Sub
Chart_Activate
(
)
MsgBox
"Bonjour "
&
Environ
(
"username"
) &
vbCrLf
&
_
"Vous avez activé le graphique "
&
ActiveChart.Name
End
Sub
II-A-2. Le double clic dans un graphique▲
Private Sub Chart_BeforeDoubleClick(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long, Cancel As Boolean)
L'argument ElementID correspond à l'objet cliqué.
Les Arguments Arg1 et Arg2 dépendent de l'objet cliqué.
Le tableau ci dessous présente la liste des arguments ElementID ainsi que les constantes Arg1 et Arg2 associées:
ElementID | Arg1 | Arg2 |
---|---|---|
xlAxis | AxisIndex | AxisType |
xlAxisTitle | AxisIndex | AxisType |
xlDisplayUnitLabel | AxisIndex | AxisType |
xlMajorGridlines | AxisIndex | AxisType |
xlMinorGridlines | AxisIndex | AxisType |
xlPivotChartDropZone | DropZoneType | Aucune |
xlPivotChartFieldButton | DropZoneType | PivotFieldIndex |
xlDownBars | GroupIndex | Aucune |
xlDropLines | GroupIndex | Aucune |
xlHiLoLines | GroupIndex | Aucune |
xlRadarAxisLabels | GroupIndex | Aucune |
xlSeriesLines | GroupIndex | Aucune |
xlUpBars | GroupIndex | Aucune |
xlChartArea | Aucune | Aucune |
xlChartTitle | Aucune | Aucune |
xlCorners | Aucune | Aucune |
xlDataTable | Aucune | Aucune |
xlFloor | Aucune | Aucune |
xlLegend | Aucune | Aucune |
xlNothing | Aucune | Aucune |
xlPlotArea | Aucune | Aucune |
xlWalls | Aucune | Aucune |
xlDataLabel | SeriesIndex | PointIndex |
xlErrorBars | SeriesIndex | Aucune |
xlLegendEntry | SeriesIndex | Aucune |
xlLegendKey | SeriesIndex | Aucune |
xlSeries | SeriesIndex | PointIndex |
xlTrendline | SeriesIndex | TrendLineIndex |
xlXErrorBars | SeriesIndex | Aucune |
xlYErrorBars | SeriesIndex | Aucune |
xlShape | ShapeIndex | Aucune |
La description des arguments Arg1 et Arg2:
Argument | Description |
---|---|
AxisIndex | Indique si l'axe est principal ou secondaire. Il peut s'agir de l'une des constantes XlAxisGroup suivantes : xlPrimary ou xlSecondary |
AxisType | Indique le type d'axe. Il peut s'agir de l'une des constantes XlAxisType suivantes : xlCategory, xlSeriesAxis ou xlValue. |
DropZoneType | Spécifie le type de zone de projection : champ de colonne, de données, de page ou de ligne. Il peut s'agir de l'une des constantes XlPivotFieldOrientation suivantes: xlColumnField, xlDataField, xlPageField ou xlRowField. Les constantes de champ de colonne et de ligne spécifient respectivement les champs de série et de catégorie. |
GroupIndex | Indique l'index d'un ChartGroup (plusieurs séries tracées dans un graphique avec le même format) dans une collection ChartGroups. |
PivotFieldIndex | Indique l'index d'un champ de colonne (série), de données, de page ou de ligne (catégorie) spécifique de la collection PivotFields. Renvoie -1 si le type de zone de projection est xlDataField. |
PointIndex | Renvoie l'index du point dans la collection de points de la série. la valeur -1 indique que tous les points sont sélectionnés. |
SeriesIndex | Renvoie l'index de la série dans la collection de séries dans le graphique. |
ShapeIndex | Renvoie l'index d'une forme automatique (Shapes) dans une collection de formes. |
TrendlineIndex | Renvoie l'index d'une courbe de tendance dans une collection de courbes de tendances. |
Voici un exemple pour empêcher l'affichage de la boite de dialogue
"Format de zone de traçage" lors du double clic dans le graphique.
Private
Sub
Chart_BeforeDoubleClick
(
ByVal
ElementID As
Long
, _
ByVal
Arg1 As
Long
, ByVal
Arg2 As
Long
, Cancel As
Boolean
)
Cancel =
True
End
Sub
II-A-3. Le clic droit dans un graphique▲
Private Sub Chart_BeforeRightClick(Cancel As Boolean)
L'évènement survient lors de l'utilisation du clic droit dans un graphique.
Cet exemple empèche l'affichage du menu contextuel.
Private
Sub
Chart_BeforeRightClick
(
Cancel As
Boolean
)
MsgBox
"Vous venez d'effectuer un clic droit."
Cancel =
True
End
Sub
II-A-4. La mise à jour du graphique ▲
Private Sub Chart_Calculate()
Cet évènement permet d'intercepter les mises à jour du graphique, notamment
la modification des valeurs dans la source de données.
Private
Sub
Chart_Calculate
(
)
MsgBox
"Graphique mis à jour"
End
Sub
Nota:
Les mises en forme personnalisées des graphiques croisés dynamiques ne sont pas conservées
lors des réactualisations de données.
Cet évènement peut donc être utile afin de forcer une mise en forme.
Un exemple pour que la 1ere série du graphique soit toujours de couleur rouge
Private
Sub
Chart_Calculate
(
)
Graph1.SeriesCollection
(
1
).Border.ColorIndex
=
3
End
Sub
II-A-5. La désactivation du graphique▲
Private Sub Chart_Deactivate()
Permet d'intercepter la désactivation du graphique.
Exemple: Empêcher le Copier/Coller d'un graphique.
Cette procédure annule le mode Couper ou Copier lorsque l'on désactive le graphique.
Private
Sub
Chart_Deactivate
(
)
Application.CutCopyMode
=
False
End
Sub
II-A-6. Les mouvements de la souris sur le graphique▲
Private Sub Chart_MouseDown(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long)
Private Sub Chart_MouseMove(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long)
Private Sub Chart_MouseUp(ByVal Button As Long, ByVal Shift As Long, ByVal x As Long, ByVal y As Long)
Chart_MouseDown survient lorsque l'utilisateur clique sur la souris alors qu'elle est placée au dessus du graphique.
Chart_MouseUp survient lorsque l'utilisateur relâche le bouton de la souris.
Chart_MouseMove survient lorsque l'utilisateur déplace la souris sur le graphique.
La description des arguments:
Button: Indique quel bouton est activé lors de l'évènement Chart_Mouse:
xlNoButton
xlPrimaryButton
xlSecondaryButton
xlMiddleButton
Shift: Indique quelle touche du clavier est enfoncée lors de l'évènement Chart_Mouse:
0 = Pas de touche
1 = Touche Shift
2 = Touche Ctrl
4 = Touche Alt
Vous pouvez aussi obtenir des associations de touches:
6 = Touches Ctrl & Alt
...etc...
X: Renvoie la position horizontale dans le graphique.
Y: Renvoie la position verticale dans le graphique.
II-A-7. La sélection d'un objet dans le graphique▲
Private Sub Chart_Select(ByVal ElementID As Long, ByVal Arg1 As Long, ByVal Arg2 As Long)
L'argument ElementID correspond à l'objet sélectionné.
Les Arguments Arg1 et Arg2 dépendent de l'objet cliqué.
Les arguments sont identiques à ceux de l'évènement Chart_BeforeDoubleClick .
Cet exemple identifie la sélection de la 3eme série du graphique.
Private
Sub
Chart_Select
(
ByVal
ElementID As
Long
, ByVal
Arg1 As
Long
, ByVal
Arg2 As
Long
)
If
ElementID =
xlSeries And
Arg1 =
3
Then
_
MsgBox
"Vous avez sélectionné la 3eme série."
End
Sub
II-A-8. La modification des séries▲
Private Sub Chart_SeriesChange(ByVal SeriesIndex As Long, ByVal PointIndex As Long)
L'évènement est déclenché lorsque vous modifiez la position d'un point
dans le graphique.
Remarque:
Pour gérer les modifications issues de changements dans la source de données , utilisez l'évènement Chart_Calculate().
Private
Sub
Chart_SeriesChange
(
ByVal
SeriesIndex As
Long
, ByVal
PointIndex As
Long
)
MsgBox
"Le point "
&
PointIndex &
" de la série "
_
&
SeriesIndex &
" vient d'être modifié."
'Modifie la couleur du point
ActiveChart.SeriesCollection
(
SeriesIndex).Points
(
PointIndex).
_
MarkerBackgroundColorIndex =
12
End
Sub
II-A-9. Le redimensionnement du graphique▲
Private Sub Chart_Resize()
L'évènement est déclenché lorsque vous modifiez les dimensions du graphique.
II-B. Les évènements dans les graphiques incorporés▲
Ce chapitre décrit comment gérer les évènements dans les graphiques incorporés.
Il s'agit de la description du classeur proposé en téléchargement, à la fin de ce document. Il existe bien sur d'autres solutions et des
adaptations devront être apportées en fonction de vos projets.
Vous devez tout d'abord placer cette procédure dans le module objet ThisWorkbook.
Ces lignes permettront d'intégrer l'application Excel dans la classe "ClasseAppli".
Option
Explicit
Dim
XlAppli As
New
ClasseAppli
Private
Sub
Workbook_Open
(
)
Set
XlAppli.XL
=
Excel.Application
End
Sub
Ensuite, créez un module de classe nommé "ClasseAppli".
Placez y ces procédures qui permettront de gérer les graphiques contenus dans la feuille active.
Les graphiques seront pris en compte dans la classe, dès l'activation de l'onglet.
Option
Explicit
Public
WithEvents XL As
Excel.Application
Dim
ClTabChart
(
) As
ClasseChart
'Permet de prendre en compte les graphiques incorporés de la feuille active
Public
Sub
XL_SheetActivate
(
ByVal
Feuille As
Object)
Dim
i As
Integer
'Vérifie qu'il s'agit d'une feuille de calcul
If
TypeOf Feuille Is
Worksheet Then
'Vérifie s'il y a des graphiques dans la feuille
If
Feuille.ChartObjects.Count
=
0
Then
Exit
Sub
'S'il y a des graphiques,
'boucle pour les intégrer dans le module de classe
For
i =
1
To
Feuille.ChartObjects.Count
ReDim
Preserve
ClTabChart
(
i)
Set
ClTabChart
(
i) =
New
ClasseChart
Set
ClTabChart
(
i).Graph
=
Feuille.ChartObjects
(
i).Chart
Next
i
End
If
End
Sub
'Permet de vider la classe lors de la désactivation de la feuille
Private
Sub
XL_SheetDeactivate
(
ByVal
Feuille As
Object)
Dim
j As
Integer
On
Error
Resume
Next
For
j =
1
To
UBound
(
ClTabChart)
Set
ClTabChart
(
j).Graph
=
Nothing
Next
End
Sub
Ensuite, créez un module de classe nommé "ClasseChart".
Placez y les procédures suivantes.
Il s'agit des macros évènementiellles qui permettront de gérer les graphiques.
Vous pouvez constater que les syntaxes sont similaires au chapitre II-A.
La seule différence concerne le nom des procédures:
Dans un onglet graphique le nom s'affiche automatiquement, dans le style:
Private Sub Chart_Activate()
Ici, vous allez déclarer: Public WithEvents Graph As Chart
Il faudra donc écrire:
Private Sub Graph_Activate()
Option
Explicit
Public
WithEvents Graph As
Chart
Dim
NomGraph As
String
'*** Utilisation des évènements *********
Private
Sub
Graph_Activate
(
)
MsgBox
"Bonjour "
&
Environ
(
"username"
) &
vbCrLf
&
_
"Vous avez activé le graphique "
&
ActiveChart.Name
NomGraph =
ActiveChart.Name
End
Sub
Private
Sub
Graph_BeforeDoubleClick
(
ByVal
ElementID As
Long
, _
ByVal
Arg1 As
Long
, ByVal
Arg2 As
Long
, Cancel As
Boolean
)
Range
(
"F4"
) =
RetourneDescriptionID
(
ElementID, Arg1, Arg2)
Cancel =
True
End
Sub
Private
Sub
Graph_BeforeRightClick
(
Cancel As
Boolean
)
Range
(
"F4"
) =
"Vous avez fait un clic droit."
Cancel =
True
End
Sub
Private
Sub
Graph_Calculate
(
)
Range
(
"F4"
) =
"Graphique mis à jour"
End
Sub
Private
Sub
Graph_Deactivate
(
)
On
Error
Resume
Next
Range
(
"F4"
) =
NomGraph &
" désactivé"
End
Sub
Private
Sub
Graph_Select
(
ByVal
ElementID As
Long
, _
ByVal
Arg1 As
Long
, ByVal
Arg2 As
Long
)
Range
(
"F4"
) =
"L'objet sélectionné: "
&
_
RetourneDescriptionID
(
ElementID, Arg1, Arg2)
End
Sub
Private
Sub
Graph_MouseMove
(
ByVal
Button As
Long
, ByVal
Shift As
Long
, _
ByVal
x As
Long
, ByVal
y As
Long
)
Dim
ElementID As
Long
Dim
Arg1 As
Long
, Arg2 As
Long
'Filtre pour que cette procédure soit appliquée sur un graphique spécifique
If
ActiveChart.Name
=
"Feuil1 Graphique 2"
Then
If
Feuil1.CheckBox1
=
False
Then
'Button: Indique quel bouton est activé lors de l'évènement Chart_Mouse
'xlNoButton
'xlPrimaryButton
'xlSecondaryButton
'xlMiddleButton
'Shift: indique quelle touche du clavier est enfoncée lors des
'mouvements de la souris:
'0 = pas de touche
'1 = Touche Shift
'2 = Touche Ctrl
'4 = Touche Alt
'Vous pouvez aussi obtenir des associations de touches:
'6 = Touches Ctrl & Alt
'...etc...
'x: position horizontale dans le graphique
'y: position verticale dans le graphique
Range
(
"F4"
) =
Button &
" / "
&
Shift &
" / "
&
x &
" / "
&
y
Else
ActiveChart.GetChartElement
x, y, ElementID, Arg1, Arg2
Range
(
"F4"
) =
"Le curseur se déplace sur : "
&
_
RetourneDescriptionID
(
ElementID, Arg1, Arg2)
End
If
End
If
End
Sub
Private
Sub
Graph_Resize
(
)
MsgBox
"Pourquoi avez vous modifié les dimensions du graphique?"
End
Sub
Private
Sub
Graph_SeriesChange
(
ByVal
SeriesIndex As
Long
, ByVal
PointIndex As
Long
)
Range
(
"F4"
) =
"Le point "
&
PointIndex &
" de la série "
_
&
SeriesIndex &
" vient d'être modifié."
'Modifie la couleur du point
ActiveChart.SeriesCollection
(
SeriesIndex).Points
(
PointIndex).
_
MarkerBackgroundColorIndex =
12
End
Sub
Enfin, placez la fonction RetourneDescriptionID dans un module standard.
Cette fonction permet de traduire les arguments ElementID, Arg1 et Arg2
(constantes de type Long) en texte. Consultez les tableaux descriptifs dans le chapitre II-A-2 pour plus de détails.
Cette fonction est traduite et adaptée d'une procédure de Jon Peltier:
http://www.computorcompanion.com/LPMArticle.asp?ID=221
Option
Explicit
'---------------
'La fonction "RetourneDescriptionID" permet de traduire les arguments
'ElementID , Arg1 et Arg2 (constantes de type Long) en texte.
'
'---------------
Public
Function
RetourneDescriptionID _
(
ElementID As
Long
, Arg1 As
Long
, Arg2 As
Long
)
'Adapté et traduit d'une procédure de Jon Peltier
'http://www.computorcompanion.com/LPMArticle.asp?ID=221
Dim
Arg As
String
, CstElement As
String
Select
Case
ElementID
Case
0
CstElement =
"Etiquette de donnée"
'0
Arg =
"Series "
&
Arg1
If
Arg2 >
0
Then
Arg =
Arg &
", Point "
&
Arg2
Case
2
: CstElement =
"Zone de graphique"
'2
Case
3
:
CstElement =
"Série "
&
Arg1 '3
If
Arg2 >
0
Then
Arg =
"Point "
&
Arg2
If
Arg2 =
-
1
Then
Arg =
"Toute la série est sélectionnée : "
&
_
ActiveChart.SeriesCollection
(
Arg1).Formula
Case
4
: CstElement =
"Titre"
'4
Case
5
: CstElement =
"Panneau"
'5
Case
6
: CstElement =
"Coins"
'6
Case
7
: CstElement =
"Table de données"
'7
Case
8
CstElement =
"Courbe de tendance: "
'8
Arg =
"Série "
&
Arg1 &
", Courbe de tendance "
&
Arg2
Case
9
CstElement =
"Barre d'erreur"
'9
Arg =
"Série "
&
Arg1
Case
10
CstElement =
"Barre d'erreur X"
'10
Arg =
"Série "
&
Arg1
Case
11
CstElement =
"Barre d'erreur Y"
'11
Arg =
"Série "
&
Arg1
Case
12
CstElement =
"Elément de légende"
'12
Arg =
"Série "
&
Arg1
Case
13
CstElement =
"Symbole de légende"
'13
Arg =
"Série "
&
Arg1
Case
14
CstElement =
"Forme automatique"
'14
Arg =
"Forme automatique n° "
&
Arg1
Case
15
CstElement =
"Quadrillage Principal "
'15
'CstElement = CstElement & IIf(Arg1 = 1, "Principal ", "Secondaire ")
CstElement =
CstElement &
IIf
(
Arg2 =
1
, "Abscisses "
, "Ordonnéees"
)
Case
16
CstElement =
CstElement &
"Quadrillage Secondaire "
'CstElement = IIf(Arg1 = 1, "Principal ", "Secondaire ") '16
CstElement =
CstElement &
IIf
(
Arg2 =
1
, "Abscisses "
, "Ordonnées "
)
Case
17
CstElement =
"Titre de l'axe "
CstElement =
CstElement &
IIf
(
Arg1 =
1
, "Principal "
, "Secondaire "
) '17
CstElement =
CstElement &
IIf
(
Arg2 =
1
, "Abscisses "
, "Ordonnées "
)
Case
18
CstElement =
"Barre de hausse"
'18
Arg =
"Groupe Index "
&
Arg1
Case
19
: CstElement =
"Zone de traçage"
'19
Case
20
CstElement =
"Barre de baisse"
'20
Arg =
"Groupe Index "
&
Arg1
Case
21
CstElement =
"Axe "
'21
CstElement =
CstElement &
IIf
(
Arg1 =
1
, "Principal "
, "Secondaire "
)
CstElement =
CstElement &
IIf
(
Arg2 =
1
, "Abscisses "
, "Ordonnées"
)
Case
22
CstElement =
"Ligne de Séries"
'22
Arg =
"Groupe Index "
&
Arg1
Case
23
: CstElement =
"Plancher"
'23
Case
24
: CstElement =
"Légende"
'24
Case
25
CstElement =
"Lignes Haut-Bas"
'25
Arg =
"Groupe Index "
&
Arg1
Case
26
CstElement =
"Lignes de projection"
'26
Arg =
"Groupe Index "
&
Arg1
Case
27
CstElement =
"Etiquette de catégorie axe Radar"
'27
Arg =
"Groupe Index "
&
Arg1
Case
28
: CstElement =
"Aucune"
'28
Case
30
CstElement =
"Etiquette d'unités d'affichage "
CstElement =
CstElement &
IIf
(
Arg1 =
1
, " Principal "
, " Secondaire "
) '30
CstElement =
CstElement &
IIf
(
Arg2 =
1
, "Abscisses "
, "Ordonnées "
)
End
Select
RetourneDescriptionID =
CstElement &
IIf
(
Len
(
Arg) >
0
, " "
&
Arg, ""
)
End
Function
'------------
III. Conclusion▲
J'espère que toutes ces informations pourront vous être utiles. Il s'agit d'exemples
généraux qu'il conviendra d'adapter en fonction de vos projets.
Les évènements offrent de nombreuses possibilités pour personnaliser
votre application et interagir avec les actions de l'utilisateur final.
Si vous souhaitez contrôler et limiter les manipulations possibles dans le classeur,
il sera important:
De définir ce qui est autorisé et ce qui ne l'est pas,
D'anticiper les actions involontaires des utilisateurs.
Et ensuite d'intégrer ces paramètres dans les macros évènementielles.