I. Création d'un graphique 2D▲
Sur une feuille, placez un contrôle MSChart. Le nom de ce dernier restera celui généré par VB : MSChart1. La source de données est une simple table Access liée par un contrôle Adodc.(adodc1 sur la feuille.) Il n'y a aucun contrôle des enregistrements, ceci n'étant pas le but de ce cours.
Composition de la table Access :
Feuille de départ :
N. B. : le contrôle adodc1 peut être mis en Visible = False pour une visualisation optimisée.
I-A. Base du graphique 2D▲
Private Sub Form_Load()
' Initialisation de l'accès aux données
Dim MaBD As String
Dim i as Integer
MaBD = App.Path & "\Chart.mdb"
With Adodc1
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & MaBD & ";Persist Security Info=False"
.RecordSource = "SELECT * FROM Climatologie"
End With
Adodc1.Refresh
Adodc1.Recordset.MoveFirst
' Initialisation du graphique simple
MSChart1.AllowSelections = False ' Interdit la sélection dans le graphe
With MSChart1
.chartType = VtChChartType2dBar ' type de graphe
.ColumnCount = 1 ' nombre de barres
.RowCount = 12 ' nombre de mois
' lecture du nom des mois et des températures dans la BD
For i = 1 To 12
.Row = i
.Column = 1
.RowLabel = Adodc1.Recordset.Fields(0) ' le nom de chaque mois
.Data = Adodc1.Recordset.Fields(1).Value ' la valeur de température maximale
MoyMax = MoyMax + Adodc1.Recordset.Fields(1) ' cumul des valeurs pour calculer la moyenne
Adodc1.Recordset.MoveNext ' le mois suivant
Next i
End With
MoyMax = Format(MoyMax / 12, "#0.0")
' Pour que le curseur soit différent lorsque la souris passe sur le graphe
MSChart1.DoSetCursor = True
MSChart1.MousePointer = VtMousePointerArrowQuestion
End SubAvant de poursuivre l'exploration de la présentation graphique, il y a quelques petites notions importantes à signaler :
PLOT : fait référence à la zone sur laquelle le graphe est affiché.
SERIESCOLLECTION : permet d'atteindre via l'indice une série précise du graphe
SERIES (objet) : permet d'accéder aux éléments d'une collection SeriesCollection représentant un groupe de points de données sur un graphique.
Les références à ces propriétés sont permanentes lors de la création d'un graphe.
I-B. Titres, légende et note (footnote)▲
LEGENDE
MSChart1.ShowLegend = True
' Texte de la légende
With MSChart1.Plot.SeriesCollection(1)
.LegendText = "T° max"
End With
With MSChart1.Legend
.Location.LocationType = VtChLocationTypeTop ' La légende sera au-dessus
.TextLayout.HorzAlignment = VtHorizontalAlignmentCenter ' Alignement centré
.VtFont.VtColor.Set 255, 255, 0 ' Texte jaune.
.Backdrop.Fill.Style = VtFillStyleBrush ' Style de fond
.Backdrop.Fill.Brush.Style = VtBrushStyleHatched ' Style de remplissage
.Backdrop.Fill.Brush.FillColor.Set 159, 0, 255 ' Couleur de remplissage du fond de la
' légende
End WithTITRE ET MISE EN FORME DU TEXTE
MSChart1.TitleText = "Températures annuelles"
With MSChart1.Title.VtFont
.Name = "Comic Sans MS"
.Size = 15
.Effect = VtFontEffectUnderline
End With
' Titre pour l'axe des Y côté gauche
With MSChart1.Plot.Axis(1, 1)
.AxisTitle.VtFont.Size = 14
.AxisTitle.Visible = True
.AxisTitle.Text = "Températures"
End With
' Titre pour l'axe des Y côté droit
With MSChart1.Plot.Axis(2, 1)
.AxisTitle.VtFont.Size = 14
.AxisTitle.Visible = True
.AxisTitle.Text = "Températures"
End With
' Titre pour l'axe des X
With MSChart1.Plot.Axis(0, 1)
.AxisTitle.VtFont.Size = 14
.AxisTitle.Visible = True
.AxisTitle.Text = "Mois"
End WithNOTE (footnote)
MSChart1.FootnoteText = "Notes : ces températures sont données par l'Institut National de Météorologie"Toutes ces modifications amènent un graphe comme ci-dessous :
I-C. Couleurs de trait et du graphe▲
' Changer la couleur du graphe
With MSChart1.Plot.SeriesCollection(1)
.DataPoints(-1).Brush.FillColor.Set 45, 44, 78 ' couleur RGB
End With
' Changer la couleur du fond du graphe
With MSChart1.Backdrop.Fill
.Style = VtFillStyleBrush
.Brush.FillColor.Set 255, 255, 255 'fond blanc
End With
' Placer une ligne colorée entre les éléments de la légende de l'axe Y ainsi que la ligne 0
With MSChart1.Plot.Axis(VtChAxisIdX, 1)
.Pen.VtColor.Set 237, 44, 78
End WithVisualisation du résultat obtenu :
I-D. Copier/coller le graphe▲
Si vous désirez afficher une image de votre graphe dans une ImageBox, par exemple, placez un contrôle image (Image1) sur une feuille ainsi que le code suivant :
Image1.Stretch = True
MSChart1.EditCopy
Image1.Picture = Clipboard.GetData(vbCFBitmap)I-E. Deuxième série de points▲
Sur le même principe que la première série, ajoutons les températures annuelles minimales, calculons et affichons les moyennes annuelles.
MsgBox "Nombre axe : " & Str(MSChart1.ActiveSeriesCount) ' Nombre de séries actuellement
With MSChart1
.ColumnCount = 2 ' nombre de séries
.RowCount = 12 ' nombre de mois
Adodc1.Recordset.MoveFirst
For i = 1 To 12
.Row = i
.Column = 2
.Data = Adodc1.Recordset.Fields(2).Value ' la valeur de température minimale
MoyMin = MoyMin + Adodc1.Recordset.Fields(2)
Adodc1.Recordset.MoveNext
Next i
.Plot.SeriesCollection(2).LegendText = "T° min"
End With
MsgBox "Nombre axe : " & Str(MSChart1.ActiveSeriesCount) ' doit valoir 2 maintenant
MoyMin = Format(MoyMin / 12, "#0.0")Une moyenne n'ayant pas plusieurs valeurs, elle sera représentée par une ligne sur notre graphe. Dès lors, un problème se pose, car si nous ajoutons une série de données avec la valeur de cette moyenne, le résultat obtenu sera complètement erroné. Nous aurons 3 barres dont une ayant la même valeur pour tous les mois de l'année. Afin d'arriver au résultat escompté, il faut redéfinir le type de graphe à utiliser.
With MSChart1
' Changement du type de graphe pour afficher les valeurs linéaires des moyennes
.chartType = VtChChartType2dCombination
.ColumnCount = 4
For i = 1 To 12
.Row = i
.Column = 3
.Data = MoyMax
.Column = 4
.Data = MoyMin
Next i
.Plot.SeriesCollection(1).SeriesType = VtChSeriesType2dBar
.Plot.SeriesCollection(2).SeriesType = VtChSeriesType2dBar
.Plot.SeriesCollection(3).SeriesType = VtChSeriesType2dLine
.Plot.SeriesCollection(4).SeriesType = VtChSeriesType2dLine
.Plot.SeriesCollection(3).LegendText = "Moy max"
.Plot.SeriesCollection(4).LegendText = "Moy min"
.Refresh
End WithUne autre amélioration possible est l'affichage des valeurs pour chaque série lorsque la souris est positionnée sur cette série. Pour cela, on utilise l'événement MouseMove du graphe.
Private Sub MSChart1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
Dim Partie As Integer, Index1 As Integer, Index2 As Integer, Index3 As Integer, Index4 As Integer
' Annule sélection de la courbe précédente
MSChart1.ToolTipText = ""
MSChart1.SelectPart 4, 0, 0, 0, 0 '4 est une valeur de VtChChartType, voir tableau de correspondance dans MSDN
' Calcul l'emplacement actuel
MSChart1.TwipsToChartPart X, Y, Partie, Index1, Index2, Index3, Index4
' Parcourt les courbes pour trouver sur quelle série se trouve le curseur
For i = 1 To 4
If Partie = 5 And Index1 = i Then ' on est sur une série
MSChart1.SelectPart 7, i, 0, 0, 0 ' sélectionne la courbe sur laquelle le curseur se trouve
MSChart1.TwipsToChartPart X, Y, Partie, Index1, Index2, Index3, Index4 ' sélectionne les valeurs
If Index1 <> 0 And Index2 <> 0 Then
MSChart1.Column = Index1 ' valeur de l'abscisse
MSChart1.Row = Index2 ' valeur de l'ordonnée
MSChart1.ToolTipText = MSChart1.Data & " C°" ' affiche la valeur dans l'infobulle
End If
End If
Next i
End SubAprès toutes ces modifications, votre graphique a l'aspect suivant :
Nous voici arrivés au terme de notre périple dans les graphes en 2 dimensions. Il y a encore certainement d'autres possibilités que vous découvrirez en « jouant » avec les propriétés du MSChart. Il vous sera très facile de vous orienter dès que la notion de Plot, SeriesCollection et Serie sera acquise et j'espère que ces quelques exemples vous auront aidé.
Les graphes présentés ici sont tous accessibles dans la source « Graphe2D.zip » jointe à ce tutoriel.
Abordons maintenant la 3e dimension !
II. Création d'un graphique 3D▲
Le principe est strictement le même que pour les graphiques 2D, je ne reviendrai donc plus sur les titres de graphes, légendes et autres modifications de couleurs. La source de données est une simple table Access liée directement au graphe. Pour changer, nous allons tracer la courbe du volume des intempéries pour chaque mois.
Composition de la table Access :

Cocher les références ADO dans votre projet(1).
III. Base du graphique 3D▲
Private Sub Form_Load()
' Initialisation de l'accès aux données
Dim MaBD As String
Dim Cnn As ADODB.Connection
Dim Rs As ADODB.Recordset
Dim CnnStr As String
Set Cnn = New ADODB.Connection
Set Rs = New ADODB.Recordset
MaBD = App.Path & "\Chart.mdb"
CnnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & MaBD & ";Persist Security Info=False"
Cnn.Open CnnStr
Rs.Open "SELECT * FROM Intempéries", Cnn, adOpenKeyset, adLockReadOnly
' Alloue les données au graphique
Set MSChart1.DataSource = Rs
MSChart1.chartType = VtChChartType3dLine
End SubIV. Encore quelques instructions de graphisme▲
Une petite variante pour afficher le titre du graphe avec un effet d'ombrage.
With MSChart1.Title
.Location.Visible = True
.Text = "Intempéries mensuelles"
.Backdrop.Frame.Width = 1
.Backdrop.Frame.FrameColor.Set 45, 255, 125
.Backdrop.Frame.Style = VtFrameStyleDoubleLine
.Backdrop.Shadow.Style = VtShadowStyleDrop
.Backdrop.Shadow.Offset.X = 10
.Backdrop.Shadow.Offset.Y = 10
End WithUn fond de couleur avec un cadre pour mettre le graphique en valeur et vous pouvez toujours mettre une légende aux axes.
FOND DU GRAPHE
With MSChart1.Plot.Backdrop
.Frame.Style = VtFrameStyleThickOuter
.Fill.Style = VtFillStyleBrush
.Fill.Brush.FillColor.Set 255, 255, 125
End WithTITRES DES AXES
With MSChart1.Plot.Axis(VtChAxisIdX).AxisTitle
.VtFont.Name = "arial"
.VtFont.Size = 12
.VtFont.VtColor.Set 0, 127, 0
.Text = "Mois de l'année "
.Visible = True
End WithIl suffit de remplacer « VtChAxisIdX » par « VtChAxisIdY » et/ou « VtChAxisIdY2 » pour mettre un titre à l'axe Y et Y2 respectivement.
Le graphique obtenu est le suivant :
Voici encore quelques instructions qui modifient l'apparence du graphe que vous pourrez explorer vous-même, car elles ne sont pas utilisées dans notre exemple.
LUMINOSITÉ
Pourcentage de lumière ambiante
MSChart1.Plot.Light.AmbientIntensity = 1 ' donne 100 % d'intensitéIntensité de la lumière utilisée pour dessiner les bords des objets
MSChart1.Plot.Light.EdgeIntensity = 0.5 ' donne 50 % d'intensitéReprésente la source lumineuse utilisée pour éclairer les éléments puis l'intensité de cette source
MSChart1.Plot.Light.LightSources(0).Intensity = 1BASE GRAPHIQUE ET RATIO
Pour modifier l'aspect ainsi que la taille de la base du graphe.
With MSChart1.Plot.PlotBase
' Modifie la hauteur de la base.
.BaseHeight = 20
' Utilise un style de motif pour la base.
.Brush.Style = VtBrushStylePattern
.Brush.Index = VtBrushPatternHorizontal
.Brush.FillColor.Set 255, 160, 160
.Brush.PatternColor.Set 180, 180, 255
.Pen.Style = VtPenStyleSolid
.Pen.VtColor.Set 72, 72, 255
End WithPourcentage de la hauteur du graphique à utiliser comme profondeur.
MSChart1.Plot.DepthToHeightRatio = 2.5Pourcentage de la hauteur du graphique à utiliser comme largeur.
MSChart1.Plot.WidthToHeightRatio = 2.5V. Orientation d'un graphique▲
Comme tout objet 3D, le graphique peut être orienté c'est-à-dire que l'on peut le faire pivoter d'un certain angle pour choisir la vision la plus appropriée. Pour visualiser les différentes manières d'afficher un graphe 3D, vous pouvez vous référer à la source jointe « Graphe3D ». Voici les exemples de syntaxe :
CHANGER LA PROJECTION
MSChart1.Plot.Projection = VtProjectionTypeObliqueELEVATION ET ROTATION
MSChart1.Plot.View3d.Elevation = 0L'élévation est toute valeur de 0 à 90 degrés, unité par défaut excepté si vous avez changé cette unité par une instruction du type :
MSChart1.Plot.AngleUnit = VtAngleUnitsGrads 'ou VtAngleUnitsRadiansMSChart1.Plot.View3d.Rotation = 90La rotation est toute valeur de 0 à 360 degrés. La remarque au niveau des unités est aussi valable que pour l'élévation.
On peut combiner l'élévation et la rotation en une seule instruction :
MSChart1.Plot.View3d.Set 90, 10 '(Rotation, Elevation)VI. Modification des valeurs - Affichage sur le graphe▲
Revenons à notre graphe de départ, mais choisissons le type « Ligne ». Ce qui donne :
Par défaut, l'axe des Y commence à 0, mais, il y a possibilité de modifier cette valeur de départ. Dans le cas actuel, le graphe pourrait commencer à 40 pour se terminer à 95.
With MSChart1.Plot.Axis(VtChAxisIdY).ValueScale
.Auto = False
.Maximum = 95
.Minimum = 40
End WithIl est aussi possible d'afficher les valeurs des points du graphe. Ce sont les labels de valeurs (DataPointLabel).
With MSChart1.Plot.SeriesCollection(1).DataPoints(-1)
.Marker.Visible = True
With .DataPointLabel
.Custom = False
.Component = VtChLabelComponentValue
.LocationType = VtChLabelLocationTypeAbovePoint
End With
End WithLe graphe est aussi très grand et vous désirez diminuer ses proportions :
With MSChart1.Plot
.AutoLayout = False
.LocationRect.Min.X = .LocationRect.Min.X * 0.8
.LocationRect.Min.Y = .LocationRect.Min.Y * 0.8
.LocationRect.Max.X = .LocationRect.Max.X * 0.8
.LocationRect.Max.Y = .LocationRect.Max.Y * 0.8
End WithOn peut aussi changer l'aspect de la ligne :
With MSChart1.Plot.SeriesCollection(1)
.ShowGuideLine(VtChAxisIdY) = True
.GuideLinePen.Style = VtPenStyleDitted
.Pen.Style = VtPenStyleDitted
End WithOu encore modifier l'espacement entre les divisions sur les axes pour aérer le graphe :
With MSChart1.Plot
.DepthToHeightRatio = 2
.WidthToHeightRatio = 2
.xGap = 0
.zGap = 0.8
End WithEt pour terminer, encore un peu de graphisme, dessiner un « mur » en support du graphe :
MSChart1.Plot.Wall.Width = 1000 ' détermine " l'épaisseur " du support
MSChart1.Plot.Wall.Pen.VtColor.Set 255, 255, 125Ce qui nous amène à un graphique comme suit :
Les valeurs de modification sont évidemment exagérées afin de bien visualiser les changements.
VII. Trucs et astuces▲
Si vous avez plusieurs séries de données, il ne faut pas mettre un code par série, mais vous pouvez utiliser l'instruction « For Each » :
Dim Ser As Series
For Each Ser In MSChart1.Plot.SeriesCollection
Ser. ....
NextLes marqueurs ne vous plaisent pas ? il suffit de les changer comme suit :
With MSChart1.Plot.SeriesCollection(1)
.SeriesMarker.Auto = False ' pour passer en mode manuel de choix de marqueur
With .DataPoints(-1).Marker
.Visible = True
.Style = VtMarkerStyleDownTriangle ' à spécifier pour choisir la forme de marqueur
.Size = 30 ' à spécifier pour choisir la taille du marqueur
.Pen.VtColor.Set 255, 255, 125
End With
End WithVIII. Impression▲
Voici une solution pour imprimer votre graphique :
Dim Titre As String
Titre = "Ceci est un exemple d'impression d'un graphe"
Mschart1.EditCopy
With Printer
.CurrentX = (.ScaleWidth - .TextWidth(Titre)) / 2
Printer.Print Titre
.PaintPicture Clipboard.GetData, 0, .CurrentY, Printer.ScaleWidth
.EndDoc
End WithPrinter.ScaleWidth imprime le graphe sur toute la largeur de la feuille. Il suffit de placer une valeur pour adapter la grandeur du graphe selon vos besoins. Attention, cette valeur dépend du ScaleMode dans lequel vous avez placé l'imprimante.
Nous voici arrivés au terme de notre survol du contrôle MSChart. Comme vous pouvez le constater, bien des découvertes sont encore à faire. Pour cela, la source « Graphe3D .zip » jointe au tutoriel vous permettra de réaliser tous les essais possibles sur ce contrôle.











