Programmez MS Graph

Initiation à la programmation de MS Graph.

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 le 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 : 4 commentaires

Article lu   fois.

L'auteur

Profil ProSite personnel

Liens sociaux

Viadeo Twitter Facebook Share on Google+   

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 tout puissance dans Excel.

Pour mettre en oeuvre 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 s'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.

image

Créez le contrôle sur le formulaire comme vous le feriez avec un cadre ou une image.

Suivez les instructions :

image

Sélectionnez la requête Analyse des ventes.

image

Sélectionnez les trois champs : Ventes, Année, Trimestre.

image

Cliquez sur Histogramme 3-D.

image

Faites glisser les trois étiquettes dans leur emplacement respectif.

image

Cliquez sur Terminer. Vous devriez obtenir ce résultat.

image

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 emmène 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.

 
Sélectionnez
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 contenu 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 ».

 
Sélectionnez
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.

 
Sélectionnez
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 ».

 
Sélectionnez
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 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.

 
Sélectionnez
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 ».

 
Sélectionnez
Dim vlTitrePrincipal As String

La propriété correspondante.

other
Sélectionnez
Public Property Let pTitrePrincipal(vTitre As Variant)
    vlTitrePrincipal = Nz(vTitre, "")   ' enregistre le titre
    AfficherTitrePrincipal
End Property

Enfin la méthode d'affichage.

 
Sélectionnez
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.

 
Sélectionnez
Option Compare Database
Option Explicit
Dim vGraph As New ClassGraph

Maintenant la variable « vGraph » est associée à la notre nouvelle classe « ClassGraph ».

Créez l'événement « OnLoad » de « Form » puis tapez le code suivant.

 
Sélectionnez
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.

 
Sélectionnez
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.


image image

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.

 
Sélectionnez
Dim vlCtrl As Control
Dim vlSql As String

Modifiez ensuite la méthode « Initialiser » comme ceci.

 
Sélectionnez
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 ».

 
Sélectionnez
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 ».

 
Sélectionnez
Private Sub AffecterSql()
    vlCtrl.RowSource = vlSql   'affecte la sql à la propriété du controle
End Sub

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

Dans le code du formulaire voici comment nous procédons.

 
Sélectionnez
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êtes 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.

image

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.

 
Sélectionnez
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 ».

 
Sélectionnez
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.

 
Sélectionnez
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-1. Bonus

Une méthode d'exploration de la DataSheet est toujours utile pour vérifier les données.

 
Sélectionnez
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 » :

 
Sélectionnez
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.

 
Sélectionnez
    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.

image

Et en colonne lors de l'affectation de XlColumns.

image

Sur le graphique l'effet est immédiat.

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

 
Sélectionnez
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.

other
Sélectionnez
    vGraph.pChartType = xl3DColumn
    MsgBox "Histogramme 3D"
    vGraph.pChartType = xlConeCol
    MsgBox "Type Cone 3D"

Vous disposez à présent des propriétés de bases 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

X. Remerciements

Je remercie Raymond (Ram-0000) et Jacques-Jean pour leurs judicieuses remarques ainsi que les corrections qu'ils ont apporté à ce document.

Consultez sa page personnelle. La page personnelle de Ram-0000.

Vous avez aimé ce tutoriel ? Alors partagez-le en cliquant sur les boutons suivants : Viadeo Twitter Facebook Share on Google+   

  

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. Droits de diffusion permanents accordés à Developpez LLC.