Plus loin avec MS Graph

Découvrez d'autres propriétés de MS Graph

Fabrice Constans

Ce cours est le deuxième consacré à la programmation de MS Graph. La première partie nous a donné un bref aperçu du composant MS Graph. Ce cours va être l'occasion d'aller plus loin avec ce composant essentiel de Microsoft.

Commentez cet article : Commentez

- Titre : Plus loin avec MS Graph

- Auteur : Fabrice Constans

- Parution : 2 février 2011

- Mise à jour : 6 février 2011

- Licence : Copyright ® 2011 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. Avertissement

- II. Les objets

- III. Police, taille et style

- IV. Les séries de données

- V. Les étiquettes de données

- V-A. Points

- VI. Fond et plancher

- VII. Grilles

- VIII. Gestion de la 3D

- VIII-A. Précaution

- VIII-B. Perspective

- VIII-C. Elevation

- VIII-D. Rotation

- VIII-E. Rotation, Elevation, Perspective

- IX. Légende

- IX-A. Les entrées

- X. Particularité : Les propriétés Has

- XI. Conclusion

- Remerciements

I - Introduction

La première partie de cette série d'articles nous a permis de faire une rapide prise en main du composant MS Graph. Dans cette partie nous allons nous intéresser à la mise en forme de notre graphique.

I-A - Avertissement

L'utilisation d'un objet MS Graph nécessite qu'il soit toujours actif. Ce cours étant composé d'exercices distincts, il peut arriver que le code soit réinitialisé lors des modifications successives du code. Dans ce cas le message suivant apparaîtra.

Relancez le formulaire pour que les variables objets soient réinitialisées et que le code se remette à fonctionner.

II - Les objets

Pour aller plus loin dans l'exploration de MS Graph il est important de détailler les objets qu'il contient. L'image suivante indique les principaux objets à manipuler.

Notez que certains objets ne sont disponibles que pour des graphiques 3D.

III - Police, taille et style

Pour mettre en forme le texte nous disposons de l'objet Font qui comporte plusieurs propriétés. Il est disponible dans chaque objet comportant du texte (ChartTitle, Legend.). Pour notre exemple nous utiliserons l'objet ChartArea qui désigne la zone d'affichage du graphique. Il contient tous les autres objets du graphique qui hériteront de fait de la configuration.

Commencez par déclarer l'objet dans l'en-tête du module.

ChartArea

Dim vlArea As Graph.ChartArea

Puis dans la méthode « Initialiser ».

ChartArea

Set vlArea = vlChart.ChartArea                   'la zone du graphique

Puis la procédure qui nous permettra de régler la police.

Font

Public Sub pFont(vFontName As String, vFontStyle As String, vFontSize As Integer)
vlArea.Font.Name = vFontName
vlArea.Font.FontStyle = vFontStyle
vlArea.Font.Size = vFontSize
End Sub

L'appel se fait simplement à partir de notre bouton « Modifier ».

vGraph.pFont "Calibri", "Normal", 10

La totalité des objets de type texte a hérité des nouveaux réglages. Ceci ne nous empêche pas de définir un autre réglage pour un objet contenu dans le graphique.

Repérez la procédure « AfficherTitrePrincipal » de la classe et ajoutez le code ci-dessous.

Font

vlChart.ChartTitle.Text = vlTitrePrincipal
With vlChart.ChartTitle.Font
.Name = "Broadway"
.Bold = True
.Size = 14
.Color = RGB(0, 128, 255)
End With

Bold permet de mettre la police en gras et Color gère la couleur. Cette dernière accepte une valeur de type Long.

Consultez l'aide et la liste de l'auto complétion pour les autres propriétés disponibles.

IV - Les séries de données

SeriesCollection est une collection qui regroupe les séries de données. Chaque série de données est organisée suivant le plotby (voir le cours précédent).

Actuellement le graphique comprend la série intitulée Coût et celle intitulée Gain. Nous allons faire quelques manipulations de base pour nous familiariser avec cet objet.

Avant de créer la méthode vous devez inscrire dans les références de VBE la bibliothèque Microsoft Office xx.x Object Library. En effet nous allons devoir faire appel à des constantes contenues dans cette bibliothèque.

Dans la classe créez la méthode ci-dessous.

SeriesCollection

Public Sub ColoreGraphique()
Dim gSeries As Graph.SeriesCollection
Dim i As Integer
Set gSeries = vlChart.SeriesCollection
For i = 1 To gSeries.Count
With gSeries(i)
.Border.Weight = xlThin
.Border.LineStyle = xlAutomatic
.Fill.TwoColorGradient msoGradientHorizontal, 1
.Fill.ForeColor.SchemeColor = 2 + i  ' une couleur > à 3
.Fill.BackColor.SchemeColor = 2
End With
Next
Set gSeries = Nothing
End Sub

Pas de difficulté pour la création de l'objet « gSeries » qui va nous servir à parcourir les séries de données.  Vous pouvez utiliser une boucle For Each, cependant dans notre cas nous avons besoin d'un compteur c'est pour cette raison que j'ai opté pour une boucle de type For classique.

Info ! Les collections du modèle MS Graph démarrent à 1 et non à 0.

Comme son nom l'indique elle colore les barres de chaque série suivant la couleur définie dans la table des couleurs de MS Graph.

Border gère la bordure des barres. Deux propriétés permettent de régler le trait fin et le style de ligne en automatique.

Fill gère le remplissage de chaque barre de la série. TwoColorGradient met un effet de dégradé composé de deux couleurs. La couleur principale désignée par ForeColor est définie suivant une couleur supérieure à l'index numéro 3, donc ni noir ni blanc. La seconde, BackColor est définie en blanc (index numéro 2). Vous pouvez utiliser toutes les combinaisons que vous souhaitez.

En changeant les paramètres SchemeColor on peut obtenir de jolis dégradés.

Pour finir avec la gestion des couleurs la propriété TwoColorGradient accepte d'autres variations que le dégradé horizontal. Consultez l'aide Ms Graph pour en savoir plus.

Les constantes msoGradient sont contenues dans la bibliothèque que nous venons de déclarer.

V - Les étiquettes de données

Les DataLabels représentent les étiquettes de données qui peuvent être affichées au-dessus des barres. Généralement elles affichent la valeur, mais il faut savoir qu'elles peuvent également afficher la catégorie, la série, le pourcentage pour les types de graphiques qui acceptent cette donnée comme les camemberts par exemple.

L'exemple suivant affiche toutes les étiquettes de toutes les séries.

SeriesCollection

Public Sub AfficheLabels()
Dim gSeries As Graph.SeriesCollection
Dim gSerie As Graph.Series
Set gSeries = vlChart.SeriesCollection
For Each gSerie In gSeries
gSerie.HasDataLabels = True
Next
Set gSeries = Nothing
End Sub

La propriété HasDataLabels indique si l'affichage des étiquettes est activé ou non. Rien ne nous empêche de les afficher pour une seule série.

HasDataLabels

vlChart.SeriesCollection.Item(1).HasDataLabels = True
vlChart.SeriesCollection.Item(2).HasDataLabels = False

V-A - Points

Collection sous-ensemble de la série, Points permet de faire référence à une position de la série. En l'occurrence une barre d'une série. Un exemple concret avec ce code qui permet de mettre une étiquette sur la sixième barre de la première série.

HasDataLabel

With myChart.SeriesCollection(1).Points(6)
.HasDataLabel = True
End With

Attention ! Les étiquettes ne doivent pas être affichées pour la première série.

On peut également contrôler le style d'affichage de l'étiquette.

DataLabel

Public Sub gGerePoint()
Dim gPoints As Graph.Points
Set gPoints = vlChart.SeriesCollection(1).Points
With gPoints.Item(5)
.HasDataLabel = True
.DataLabel.Font.ColorIndex = 2
.DataLabel.Fill.ForeColor.SchemeColor = 3
End With
Set gPoints = Nothing
End Sub

La couleur de la police est le blanc et le fond de l'étiquette est rouge.

Info ! Lorsque vous réglez la couleur de la police en blanc son fond est automatiquement mis en noir.

L'étiquette est remontée de 20 points (1 inch = 72 points).

DataLabel

.DataLabel.Top = .DataLabel.Top - 20

VI - Fond et plancher

MS Graph est un produit complet. Il est donc normal que l'on puisse tout contrôler. Les murs, Walls et Floor, disposent des mêmes propriétés de mise en couleur. L'exemple suivant montre comment donner de la couleur à l'arrière-plan du graphique.

Walls

Public Sub gGereMurs()
Dim gWalls As Walls
Set gWalls = vlChart.Walls
With gWalls.Fill
.ForeColor.SchemeColor = 9
.BackColor.SchemeColor = 2
.TwoColorGradient Style:=msoGradientHorizontal, variant:=2
End With
Set gWalls = Nothing
End Sub

Deux couleurs sont assemblées avec un dégradé horizontal.

Pour le fond la méthode est la même pour l'objet Floor. Le code suivant permet de colorer le plancher en blanc (index numéro 2).

Floor

Public Sub gGerePlanche()
Dim gFloor As Floor
Set gFloor = vlChart.Floor
gFloor.Interior.ColorIndex = 2
Set gFloor = Nothing
End Sub

VII - Grilles

L'aspect des grilles est également modifiable. Elles appartiennent aux axes xlValue et xlCategory toujours conditionnés par le PlotBy.

Il existe deux types de grilles, MajorGridlines et MinorGridlines, qui se paramètrent toutes les deux sur les deux axes.

Vous pouvez les rendre totalement invisibles en paramétrant leurs propriétés respectives HasMajorGridlines et HasMinorGridlines à False.

HasMajorGridlines

Public Sub gGridLines()
vlChart.Axes(xlValue).HasMajorGridlines = False
vlChart.Axes(xlCategory).HasMajorGridlines = False
End Sub

Le code suivant exploite la totalité des Gridlines.

GridLines

With vlChart.Axes(xlValue)
.HasMajorGridlines = True
.MajorGridlines.Border.Color = RGB(0, 0, 255)
.MajorGridlines.Border.LineStyle = xlContinuous
.HasMinorGridlines = True
.MinorGridlines.Border.LineStyle = xlDot
End With
With vlChart.Axes(xlCategory)
.HasMajorGridlines = True
.MajorGridlines.Border.Color = RGB(0, 0, 255)
.MajorGridlines.Border.LineStyle = xlContinuous
.HasMinorGridlines = True
.MinorGridlines.Border.LineStyle = xlDot
End With

Border représente la ligne affichée. Sa propriété Color permet d'en définir la couleur comme déjà vu précédemment. LineStyle dont les paramètres sont les constantes de type xlLineStyle définit le style de ligne en pointillé, tiret.

L'exemple précédent est bien trop chargé pour permettre une lecture efficace du graphique.

VIII - Gestion de la 3D

Le graphique de type 3D n'en a pas que le nom, en effet comme dans Excel on peut agir sur les trois axes.

VIII-A - Précaution

Avant de modifier ces propriétés, il est conseillé de noter les valeurs d'origine. En effet une fois modifiées celles-ci seront perdues.

VIII-B - Perspective

D'une valeur de 0 à 100. Elle n'est disponible que si la propriété RightAngleAxes est à Faux. Ceci est logique puisque RightAngleAxes indique que les axes Catégorie et Valeur sont à angle droit.

A 0 il n'y a aucune perspective. Le plancher, Floor, apparaît comme une ligne horizontale.

VIII-C - Elevation

Comprise entre -90 et +90. Elle indique la position de l'oeil dans le plan vertical.

- -90 : le graphique est vu de dessous.

- 0 : vous êtes en face.

- +90 : vous vous tenez au dessus.

VIII-D - Rotation

Comprise entre 0 et 360°. Le graphique tourne autour d'un axe vertical.

- 0° ou 360° : vous êtes face à lui.

- 90° : le mur de l'axe des valeurs, xlValue, est à l'arrière-plan.

- 190° : vous le regardez de dos. Dans cette position le fond, Walls, est au premier plan.

- 270° : le mur de l'axe des valeurs, xlValue, est au premier plan.

VIII-E - Rotation, Elevation, Perspective

L'exemple suivant met en lumière les propriétés agissant sur la vue 3D du graphique.

3D

Public Sub g3dRotate(pPerspective As Integer, pElevation As Integer, pRotation As Integer)
With vlChart
.RightAngleAxes = False
.Perspective = pPerspective             ' Vue en Perspective
.Elevation = pElevation                 ' Position des yeux
.Rotation = pRotation                   ' Rotation sur un axe vertical
End With
End Sub

Un petit test avec les valeurs suivantes.

vGraph.g3dRotate 50, 50, 20

J'espère que vous n'avez pas le vertige.

Pour revenir à une représentation classique réglez la propriété RightAngleAxes à Vrai et réattribuez les valeurs que vous avez dû conserver conformément aux conseils donnés en début de chapitre.

IX - Légende

La légende, Legend, est un objet complexe au même titre que l'objet ChartArea. Il contient la collection de lignes, LegendEntries, représentant chaque Série.

Comme pour ChartTitle la propriété HasTitle doit être paramétrée à Vrai.

Dans l'exemple suivant nous allons déplacer la légende à l'aide de la propriété Position.

HasLengend

Public Sub gManipulerLegende()
Dim vlegend As Legend
Set vlegend = vlChart.Legend
vlChart.HasLegend = True
vlegend.Position = xlLegendPositionCorner
Set vlegend = Nothing
End Sub

Les positions peuvent être définies grâce aux membres de xlLegendPosition.

La propriété Shadow permet de mettre un ombrage sur le cadre.

Shadow

vlChart.HasLegend = True
vlegend.Position = xlLegendPositionCorner
vlegend.Shadow = True
Set vlegend = Nothing

Comme la plupart des objets, les caractères (Font), l'aspect intérieur (Fill) et le cadre (Border) peuvent être modifiés.

IX-A - Les entrées

Chaque ligne de la légende peut être manipulée indépendamment. Dans l'exemple suivant nous mettons la taille de la police de la deuxième ligne à taille+2.

LegendEntries

vlChart.Legend.LegendEntries(2).Font.Size = _ vlChart.Legend.LegendEntries(2).Font.Size + 2

Comme avec les autres collections d'objets l'indice commence à 1.

La méthode irréversible Delete permet de supprimer la ligne choisie.

X - Particularité : Les propriétés Has

Chaque propriété Has (HasTitle, HasLegend.) permet l'affichage et l'accès à un objet.

Il faut garder à l'esprit que lorsque la propriété est mise à Faux l'objet est détruit.

- Tenter d'y accéder provoque un message d'erreur.

- Les réglages effectués précédemment sont irrémédiablement perdus.

XI - Conclusion

Voici ce nouveau chapitre sur MS Graph achevé et comme vous avez pu le voir les possibilités de manipulation sont nombreuses et les objets sont plus ou moins complexes.

N'oubliez pas de consulter la documentation de l'objet MS Graph, la fenêtre des variables - en ayant pris soin d'instancier l'objet - et éventuellement l'enregistreur de macros d'Excel à la recherche de nouvelles propriétés et méthodes. Rendez-vous dans un prochain chapitre pour aller toujours plus loin dans les profondeurs de MS Graph.

Remerciements

Je remercie ClaudeLELOUP pour ses corrections et Philippe JOCHMANS pour ses remarques.