Programmez MS Graph

Initiation à la programmation de MS Graph.

Fabrice Constans

Pour ceux qui ne connaissent pas Ms Graph, il s'agit d'un add-on d'Office. Il trouve toute sa puissance dans Excel où il est parfaitement intégré depuis de nombreuses versions. Dans ce cours, nous allons non pas nous intéresser à l'interface, mais plutôt à la manière de la programmer.

Attention, ce cours a pour but d'initier à la manipulation de Ms Graph à un public averti ayant de solides connaissances en VBA. Les codes fournis ne le sont qu'à titre d'exemple et ne sauraient être utilisés tels quels en production.

Commentez cet article : Commentez

- Titre : Programmez MS Graph

- Auteur : Fabrice Constans

- Parution : 17 septembre 2010

- Mise à jour : 9 novembre 2012

- Licence : Copyright ® 2010 Fabrice CONSTANS. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

- I. Introduction

- I-A. Prérequis

- I-B. Ai-je MS Graph ?

- I-C. Références

- I-D. Quelques termes

- II. Le Modèle Objet de Ms Graph

- III. Première manipulation

- III-A. Préparation

- III-B. Le contrôle graphique et le Chart

- III-B-1. Créer une instance d'un objet Chart

- III-B-2. Modifier le titre du graphique

- IV. Code réutilisable

- IV-A. Une classe

- IV-B. Côté formulaire

- V. Manipuler la source de données

- V-A. Propriétés RowSource vs. DataSheet

- V-A-1. RowSource

- V-A-1-a. Côté formulaire

- V-A-2. DataSheet

- V-A-2-a. Bonus

- VI. Catégorie ou série : le PlotBy

- VI-A. Un essai

- VII. Camembert, histogramme et autres : le ChartType

- VIII. Conclusion

- IX. Liens

- X. Remerciements

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.

http://www.microsoft.com/downloads/details.aspx?displaylang=en&FamilyID=db7ff7ff-1e4b-42ca-bade-1738afb6fad9

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.