I. Introduction▲
Ms Graph est une bibliothèque qui permet de créer des graphes. Il se présente sous la forme d'un add-on ce qui empêche son fonctionnement « stand alone ». Il est parfaitement intégré dans la Suite Office depuis de nombreuses versions, mais trouve sa toute-puissance dans Excel.
Pour mettre en œuvre ce cours, j'ai choisi Microsoft Access, mais si vous êtes plus à l'aise sur un autre produit d'Office n'hésitez pas à l'utiliser.
I-A. Prérequis▲
Pour démarrer ce cours, vous devez être munis de Ms Graph, de Microsoft ACCESS 2007 ou supérieur et de l'application Northwind. Notez que les versions antérieures d'Access font également l'affaire.
I-B. Ai-je MS Graph ?▲
Pour vous assurer que l'application Ms Graph est installée et parfaitement fonctionnelle, vous devez créer un graphique. Pour cela, ouvrez l'application Northwind.
Créez un formulaire vierge et cliquez sur le bouton Graphique.
Créez le contrôle sur le formulaire comme vous le feriez avec un cadre ou une image.
Suivez les instructions :
Sélectionnez la requête Analyse des ventes.
Sélectionnez les trois champs : Ventes, Année, Trimestre.
Cliquez sur Histogramme 3-D.
Faites glisser les trois étiquettes dans leur emplacement respectif.
Cliquez sur Terminer. Vous devriez obtenir ce résultat.
Si vous êtes arrivé jusque là, félicitations ! Votre Ms Graph est parfaitement installé.
Sauvegardez le formulaire.
I-C. Références▲
Pour piloter notre graphique, nous allons avoir besoin de faire appel à une bibliothèque Microsoft.
- Microsoft Graph 12.0 Object Library.
Référencez-la dans l'éditeur VB d'Access.
Cette bibliothèque permet de converser avec Ms Graph.
Pour ceux qui ne possèdent pas Office 2007 utilisez les bibliothèques correspondantes.
I-D. Quelques termes▲
Chaque nouvelle bibliothèque apporte son lot d'objets aux noms souvent barbares. Vous les retrouvez ici avec leur description.
Graph |
Objet container de plus haut niveau. Il contient des objets (chart, datasheet.) et des propriétés générales. |
Chart |
Objet contenant le dessin du graphique. |
DataSheet |
Tableau de données contenu dans Graph et alimentant l'objet Chart. |
II. Le Modèle Objet de Ms Graph▲
Le modèle objet de Ms Graph est constitué de collections, d'objets, de méthodes, de propriétés et de constantes.
Vous pouvez télécharger le modèle objet de Ms Graph sur le site de Microsoft.
III. Première manipulation▲
Dans ce chapitre nous allons apprendre à manipuler l'objet graphique.
III-A. Préparation▲
Ouvrez le formulaire contenant le graphique en mode création.
Créez un bouton d'action et accédez au code de l'événement Sur clic.
III-B. Le contrôle graphique et le Chart▲
Vous devez faire la différence entre le contrôle graphique Access et l'objet Graph. Le premier contient le second. Lorsqu'on programme Ms Graph, on utilise principalement l'objet Chart contenu dans un objet Graph. La source de données alimentant le graphique peut être renseignée soit dans le contrôle soit dans l'objet Graph lui-même.
Notez que si vous choisissez d'alimenter les données dans l'objet Graph, il n'existe pas de méthode Ms Graph pour y parvenir. Vous devrez la coder. Nous y reviendrons plus loin dans ce document.
Commençons par un petit exercice simple !
Créez un bouton et une zone de texte nommée « txtTitre ». Ouvrez l'événement Sur clic du bouton de commande.
III-B-1. Créer une instance d'un objet Chart▲
La première étape va permettre de créer un objet Chart avec lequel nous pourrons converser.
Dim vlChart As Graph.Chart
Set vlChart = Me.Graphique1.Object.Application.Chart
Si la déclaration de l'objet est simple, son instanciation est assez particulière.
Si vous consultez la liste d'auto complétion de « vlChart » vous verrez les propriétés, méthodes et objets contenus dans un Chart.
III-B-2. Modifier le titre du graphique▲
Le titre du graphique est l'objet « ChartTitle ». Pour être certain qu'il existe, on force sa création avec la propriété « HasTitle ».
Puis on affecte le texte contenu dans le contrôle « txtTitre » à la propriété « Text » de « ChartTitle ».
vlChart.HasTitle
=
True
vlChart.ChartTitle.Text
=
Me.txtTitre
Faites un essai pour vous rendre compte du résultat.
IV. Code réutilisable▲
Comme vous le verrez au cours de ce tutoriel, la personnalisation d'un graphique peut être valable pour d'autres. Autant partir sur de bonnes bases en créant une classe pour notre code. Celle-ci n'a pour but que de faciliter la manipulation de l'objet et ne peut être considérée comme une classe fonctionnelle.
IV-A. Une classe▲
Créez un module de classe et nommez-le « ClassGraph ». Déclarez la variable comme dans l'exemple précédent.
Option
Compare Database
Option
Explicit
Dim
vlChart As
Graph.Chart
Créez les deux procédures « Class_Initialize » et « Class_Terminate ». Utilisez la « Class_Terminate » pour libérer l'objet « vlChart ».
Private
Sub
Class_Initialize
(
)
' rien
End
Sub
Private
Sub
Class_Terminate
(
)
' Suppression de l'objet
Set
vlChart =
Nothing
' libère le graphique
End
Sub
À présent, il faut initialiser la variable objet « vlChart ». Pour cela nous allons créer une procédure publique que nous nommerons « Initialiser ». Il est important qu'elle soit publique, car c'est elle qui nous servira à transmettre le contrôle graphique.
Public
Sub
Initialiser
(
vControlGraph As
Control)
Set
vlChart =
vControlGraph.Object.Application.Chart
End
Sub
Nous devons créer une propriété publique et une méthode privée pour que le titre du « Chart » puisse être modifié.
Créez une variable à la suite de « vlChart » :
Dim
vlTitrePrincipal As
String
La propriété correspondante :
Public
Property
Let
pTitrePrincipal
(
vTitre As
Variant
)
vlTitrePrincipal =
Nz
(
vTitre, ""
) ' enregistre le titre
AfficherTitrePrincipal
End
Property
Enfin la méthode d'affichage :
Private
Sub
AfficherTitrePrincipal
(
)
' affiche/supprime le titre
vlChart.HasTitle
=
(
Len
(
vlTitrePrincipal) >
0
)'vrai si contient qq chose
If
vlChart.HasTitle
Then
vlChart.ChartTitle.Text
=
vlTitrePrincipal
End
If
End
Sub
IV-B. Côté formulaire▲
Côté formulaire nous devons réécrire le code. En effet, le code que nous avons écrit dans la première partie de ce tutoriel n'était qu'une mise en bouche destinée à vous allécher.
Ouvrez le formulaire en mode création si ce n'est pas encore fait. Dans le code, supprimez tout hormis les deux premières lignes.
Entrez la déclaration de la classe.
Option
Compare Database
Option
Explicit
Dim
vGraph As
New
ClassGraph
Maintenant la variable « vGraph » est associée à notre nouvelle classe « ClassGraph ».
Créez l'événement « OnLoad » de « Form » puis tapez le code suivant :
Private
Sub
Form_Load
(
)
vGraph.Initialiser
Me.Graphique1
End
Sub
Nous appelons la méthode « Initialiser » de ClassGraph et lui passons le contrôle graphique.
Pour le titre, ouvrez l'événement « OnClick » du bouton de commande et tapez ce code :
Private
Sub
BtnModifier_Click
(
)
vGraph.pTitrePrincipal
=
Me.txtTitre
'passe le titre à la propriété
End
Sub
Nous allons procéder à quelques essais.
Compilez, enregistrez puis ouvrez le formulaire. Tapez « Vente » dans la zone de texte puis cliquez sur le bouton.
Le titre s'affiche dans le graphique. Maintenant, supprimez le texte de la zone et cliquez sur le bouton.
Avec titre Sans titre
N'hésitez pas à agrandir le contrôle graphique pour une meilleure visibilité.
V. Manipuler la source de données▲
Nous allons nous intéresser à présent à la source de données.
V-A. Propriétés RowSource vs. DataSheet▲
Comme stipulé précédemment, la source de données peut être définie directement dans le contrôle graphique avec la propriété « RowSource » ou dans le composant Ms Graph en renseignant la « DataSheet ». Nous allons utiliser les deux méthodes.
V-A-1. RowSource▲
Ouvrez la classe si ce n'est déjà fait et ajoutez deux variables dans l'en-tête.
Dim
vlCtrl As
Control
Dim
vlSql As
String
Modifiez ensuite la méthode « Initialiser » comme ceci :
Public
Sub
Initialiser
(
vControlGraph As
Control)
Set
vlCtrl =
vControlGraph 'le contrôle
Set
vlChart =
vlCtrl.Object.Application.Chart
'le chart
End
Sub
La classe stocke à présent le contrôle graphique dans la variable « vlCtrl ».
Créez une propriété nommée « pSql ».
Public
Property
Let
pSql
(
vSql As
String
)
vlSql =
vSql
AffecterSql'appel de la méthode privée
End
Property
Puis une méthode « AffecterSql » qui se chargera d'affecter la chaine Sql au contrôle « vlCtrl ».
Private
Sub
AffecterSql
(
)
vlCtrl.RowSource
=
vlSql 'affecte la sql à la propriété du contrôle
End
Sub
V-A-1-a. Côté formulaire▲
Dans le code du formulaire, voici comment nous procédons.
Private
Sub
Form_Load
(
)
Dim
sql As
String
sql =
"SELECT TOP 10 First(Produits.[Nom du produit]) AS [PremierDeNom du produit], [Coût standard]*[Quantité] AS Achat, [Afficher la liste des prix]*[Quantité] AS Vente"
sql =
sql &
" FROM Produits INNER JOIN [Détails bon de commande] ON Produits.ID = [Détails bon de commande].[Réf produit]"
sql =
sql &
" GROUP BY [Coût standard]*[Quantité], [Afficher la liste des prix]*[Quantité]"
sql =
sql &
" ORDER BY [Afficher la liste des prix]*[Quantité] DESC;"
vGraph.Initialiser
Me.Graphique1
'initialise l'objet Chart
vGraph.pSql
=
sql'passe la string sql à la propriété
End
Sub
Notez que la chaine Sql n'est ni plus ni moins que la copie de celle contenue dans le contrôle graphique lors de sa création. Rien ne nous empêche d'en utiliser d'autres qui seraient stockées dans une table ou issues d'objets requête d'Access.
En utilisant la propriété, le composant Ms Graph gère automatiquement le remplissage.
V-A-2. DataSheet▲
L'objet DataSheet, littéralement « feuille de données », est un tableau composé de cellules un peu à la manière d'Excel. Il en utilise d'ailleurs les méthodes d'adressage : Range, Cells, Columns et Rows.
Lorsque vous envoyez une source de données dans Ms Graph par la propriété du contrôle, comme nous l'avons fait précédemment, l'objet DataSheet est rempli. Le remplir manuellement n'a que peu d'intérêt pratique. Cependant le manipuler peut avoir des avantages.
Voici la DataSheet telle qu'elle est représentée dans l'application Graph.exe.
Vous pouvez retrouver la terminologie : Category, Series et Value dans le modèle objet Graph.
Dans la classe déclarez la variable « vlDataSheet » dans le lot des déclarations du module de classe :
Dim
vlDataSheet As
Graph.DataSheet
'la variable objet datasheet
Puis n'oubliez pas d'affecter l'objet DataSheet à la variable dans la méthode « Initialiser » :
Set
vlDataSheet =
vlChart.Application.DataSheet
'la datasheet
La méthode de remplissage n'est ni plus ni moins que le balayage d'un Recordset et l'affectation dans les cellules de la DataSheet.
Voici la méthode.
Public
Sub
RemplirDataSheet
(
vSql As
String
)
' remplit la datasheet
Dim
vRow As
Integer
, vCol As
Integer
, i As
Integer
Dim
vDb As
Database, vRst As
Recordset
Set
vDb =
CurrentDb
Set
vRst =
vDb.OpenRecordset
(
vSql, dbOpenSnapshot)
' on écrit le nom des champs sur la ligne 1
For
vCol =
1
To
vRst.Fields.Count
vlDataSheet.Cells
(
1
, vCol).Value
=
vRst.Fields
(
vCol -
1
).Name
Debug.Print
vlDataSheet.Cells
(
1
, vCol).Value
Next
' on écrit les valeurs dans les cellules
vRst.MoveFirst
While
Not
vRst.EOF
vRow =
vRow +
1
For
vCol =
1
To
vRst.Fields.Count
' pour chaque champ
vlDataSheet.Cells
(
vRow +
1
, vCol).Value
=
Nz
(
vRst.Fields
(
vCol -
1
), 0
)
Next
vRst.MoveNext
Wend
End
Sub
On peut remarquer à la lecture du code que l'adressage des cellules commence à 1 contrairement au Recordset. L' « Option Base 1 » pourrait harmoniser le fonctionnement entre les deux objets.
Cette méthode peut vous permettre de créer des graphiques à partir de n'importe quelle source, même si celle-ci ne peut être exprimée avec une requête.
Vous pouvez compléter une source de données par cette méthode pour ajouter ou modifier des données.
V-A-2-a. Bonus▲
Une méthode d'exploration de la DataSheet est toujours utile pour vérifier les données.
Public
Sub
AfficherDataSheet
(
)
Dim
vRow As
Integer
, vCol As
Integer
, i As
Integer
Do
While
True
' les lignes
vRow =
vRow +
1
vCol =
0
Do
While
True
' les colonnes
vCol =
vCol +
1
If
IsEmpty
(
vlDataSheet.Cells
(
vRow, vCol)) Then
Exit
Do
Debug.Print
vlDataSheet.Cells
(
vRow, vCol).Value
Loop
If
IsEmpty
(
vlDataSheet.Cells
(
vRow, 1
)) Then
Exit
Do
Loop
End
Sub
VI. Catégorie ou série : le PlotBy▲
Lorsque vous chargez des données dans la DataSheet, par l'une des méthodes présentées ci-dessus, invariablement une question se pose : dans quel sens mes données seront-elles présentées ?
Séries et catégories ne seront-elles pas inversées ?
La propriété PlotBy est là pour résoudre ce problème.
Créez la propriété « pPlotBy » :
Public
Property
Let
pPlotBy
(
vval As
XlRowCol)
'Maitrise du (row col / Category Serie)
If
pPlotBy <>
vval Then
vlChart.Application.PlotBy
=
vval
End
If
End
Property
Private
Property
Get
pPlotBy
(
) As
XlRowCol
pPlotBy =
vlChart.Application.PlotBy
End
Property
On se rend compte que cette propriété n'est pas directement liée au Chart, mais à l'objet Application du Chart.
VI-A. Un essai▲
Tapez le code suivant dans le formulaire :
vGraph.pPlotBy
=
xlRows
MsgBox
"en ligne"
vGraph.pPlotBy
=
xlColumns
MsgBox
"en colonne"
On voit très bien l'effet immédiat du PlotBy sur le graphique. Catégories et séries sont inversées. Mais que se passe-t-il sur la DataSheet ? Rien sur les données, simplement l'interface signale que les catégories sont en ligne lors de l'application de la constante XlRows.
Et en colonne lors de l'affectation de XlColumns.
Sur le graphique l'effet est immédiat.
|
|
En ligne |
En colonne |
Le PlotBy peut être utilisé, quelle que soit la méthode utilisée pour renseigner les données.
VII. Camembert, histogramme et autres : le ChartType▲
Maintenant que l'alimentation du graphique n'a plus de secret pour vous, nous allons nous intéresser à un point obligatoire : son type.
La propriété ChartType de l'objet Chart dispose de 14 types de graphiques parmi 70 variations accessibles via le groupe de constantes XlChartType.
Pour notre essai, nous devons créer la propriété qui nous y donnera accès.
Créez la propriété « pChartType » comme ceci :
Public
Property
Let
pChartType
(
vval As
XlChartType)
'Maitrise du type de graphique
If
vlChart.ChartType
<>
vval Then
vlChart.ChartType
=
vval
End
If
End
Property
Public
Property
Get
pChartType
(
) As
XlChartType
'Maitrise du type de graphiques
pChartType =
vlChart.ChartType
End
Property
Dans le formulaire, vous n'avez plus qu'à procéder à quelques essais toujours à partir d'un bouton de commande :
vGraph.pChartType
=
xl3DColumn
MsgBox
"Histogramme 3D"
vGraph.pChartType
=
xlConeCol
MsgBox
"Type Cone 3D"
Vous disposez à présent des propriétés de base pour composer des graphiques.
VIII. Conclusion▲
Dans ce cours, nous nous sommes familiarisés avec la bibliothèque MS Graph en manipulant l'essentiel des objets. Dans un prochain article, nous nous intéresserons à la partie esthétique au travers des couleurs, effets, polices et autres.
IX. Liens▲
La version en ligne du modèle MS Graph.
http://msdn.microsoft.com/en-us/library/aa171177(v=office.11).aspx
X. Remerciements▲
Je remercie Raymond (Ram-0000) et Jacques-Jean pour leurs judicieuses remarques ainsi que les corrections qu'ils ont apportées à ce document.
Consultez sa page personnelle. La page personnelle de Ram-0000.