Les graphiques en VBA : ChartObject, Chart, ChartType et SetSourceData
Créer le même graphique chaque mois, l’actualiser quand le tableau grandit, changer son type ou ses couleurs : VBA pilote les graphiques d’Excel. Un graphique incorporé dans une feuille est un objet ChartObject, le cadre posé sur la grille, qui contient un objet Chart, le graphique lui-même, avec sa zone de traçage, son titre et sa légende. Les simulateurs reproduisent une feuille Ventes : les graphiques s’y dessinent, se déplacent à la souris et affichent leurs propriétés. Voir aussi les formules et les cellules.
ChartObject, PlotArea, ChartTitle et Legend
Un graphique se compose d’objets emboîtés. La feuille possède une collection ChartObjects ; chaque ChartObject est un cadre avec un nom, une position et une taille. Sa propriété Chart donne le graphique, qui contient la zone de graphique (ChartArea), la zone de traçage (PlotArea, entre les axes), le titre (ChartTitle), la légende (Legend) et les séries (SeriesCollection). Cochez « Afficher les zones » pour les repérer.
| Objet | Rôle | Accès |
|---|---|---|
ChartObject | Le cadre sur la feuille : Name, Left, Top, Width, Height, Delete | ActiveSheet.ChartObjects(1) |
Chart | Le graphique : type, données, titre, légende | ActiveSheet.ChartObjects(1).Chart |
ChartArea | Tout le fond du graphique | .Chart.ChartArea.Interior.Color |
PlotArea | La zone de traçage, entre les axes | .Chart.PlotArea.Interior.Color |
ChartTitle | Le titre, si HasTitle = True | .Chart.ChartTitle.Text |
Legend | La légende, si HasLegend = True | .Chart.Legend.Position |
Series | Une série de données | .Chart.SeriesCollection(1) |
ChartTitle et Legend n’existent que si HasTitle et HasLegend valent True ; sinon, erreur 1004.co.Left = Range("F2").Left et co.Top = Range("F2").Top alignent le graphique sur une cellule.Charts.Add. Il n’a alors pas de ChartObject.La variable Chart
Écrire ActiveSheet.ChartObjects(1).Chart à chaque ligne est long et fragile. On déclare une variable objet Dim cht As Chart et on l’affecte avec Set, dès la création du graphique : Set cht = ActiveSheet.ChartObjects.Add(Left, Top, Width, Height).Chart. Le code agit ensuite sur cht, sans activer ni sélectionner le graphique, et cht.Parent remonte au ChartObject pour le déplacer ou le renommer.
| Création | Résultat |
|---|---|
ActiveSheet.ChartObjects.Add(250, 10, 220, 160) | Un ChartObject vide à la position indiquée ; on ajoute les données avec SetSourceData. |
ActiveSheet.Shapes.AddChart2(201, xlColumnClustered, 250, 10, 220, 160) | Un graphique au style moderne (Excel 2013 et plus), construit sur la zone de la cellule active, avec un titre. |
ActiveChart | Le graphique activé : c’est ce qu’écrit l’enregistreur de macros. |
ChartObjects.Add renvoie un ChartObject. Pour une variable As Chart, ajoutez .Chart à la fin.cht.Export ThisWorkbook.Path & "\ventes.png" enregistre le graphique en PNG, par exemple pour un courriel.Le type du graphique : cht.ChartType
ChartType lit ou modifie le type du graphique à l’aide d’une constante xl…. Le changement est immédiat et conserve les données, le titre et la légende. Chaque constante correspond à un nombre, que renvoie Debug.Print cht.ChartType.
| Constante | Valeur | Type |
|---|---|---|
xlColumnClustered | 51 | Histogramme groupé |
xlColumnStacked / xlColumnStacked100 | 52 / 53 | Histogramme empilé / empilé 100 % |
xlBarClustered / xlBarStacked | 57 / 58 | Barres groupées / empilées |
xlLine / xlLineMarkers | 4 / 65 | Courbes / courbes avec marqueurs |
xlPie / xlDoughnut | 5 / -4120 | Secteurs / anneau |
xlArea | 1 | Aires |
cht.SeriesCollection(3).ChartType = xlLine trace la troisième série en courbe.La source de données : cht.SetSourceData
SetSourceData relie le graphique à une plage : cht.SetSourceData Source:=Range("A1:D5"). La première ligne fournit les noms des séries, la première colonne les catégories. L’argument facultatif PlotBy choisit l’orientation : xlColumns, une série par colonne, ou xlRows, une série par ligne. Sans PlotBy, Excel trace les séries dans le sens où le tableau a le moins d’éléments. Pour un tableau qui grandit, Range("A1").CurrentRegion évite de réécrire l’adresse.
ListObjects(1).Range comme source suit automatiquement les lignes ajoutées.Range("A1:A5,C1:C5") trace seulement les formations et le 2e trimestre.Exercice : le graphique des sessions
Classeur d’exercice (Énoncé et Corrigé)
- Enregistrez le classeur en .xlsm et collez le code de la feuille « Code VBA » dans un module standard.
- Exécutez
CreerGraphique(ChartObjects.Add, variable Chart, SetSourceData, ChartType, titre, légende). - Exécutez
ChangerTypeplusieurs fois : le graphique alterne entre histogramme, courbes et barres. - Exécutez
SecteursT1etParFormation(PlotBy:=xlRows), puisListerGraphiques. - Répondez aux questions de la feuille Contrôle, puis nettoyez avec
SupprimerGraphiques.