Automatisation des graphiques
Glissez pour afficher le menu
Les graphiques sont des formes placées au-dessus d'une feuille de calcul et, comme tout le reste dans ce chapitre, chaque propriété que vous définiriez manuellement dans le volet Format possède un équivalent VBA.
Création d'un graphique
Sub BuildProfitChart()
Dim ws As Worksheet
Dim tbl As ListObject
Dim chartObj As ChartObject
Set ws = ThisWorkbook.Worksheets("Reports")
Set tbl = ws.ListObjects("tblReports")
Set chartObj = ws.Shapes.AddChart2(Style:=201, _
XlChartType:=xlColumnClustered, _
Left:=400, Top:=20, Width:=400, Height:=250).Chart.Parent
With chartObj.Chart
.SetSourceData Source:=tbl.ListColumns("Profit").Range
.HasTitle = True
.ChartTitle.Text = "Profit by Region"
End With
End Sub
- AddChart2 crée la forme du graphique —
Style:=201sélectionne un style visuel intégré,XlChartType:=xlColumnClusteredchoisit un graphique en colonnes standard, et Left/Top/Width/Height positionnent et dimensionnent le graphique sur la feuille en points, l’unité qu’Excel utilise en interne pour le placement des formes ; - AddChart2 retourne en réalité un objet Chart, et non le conteneur ChartObject autour de celui-ci — le
.Chart.Parentà la fin de cette ligne permet de remonter jusqu’au conteneur, qui est le type dans lequel chartObj est déclaré ; cette particularité est facile à oublier et il est recommandé de la copier exactement ; SetSourceDataindique à la forme du graphique, qui est vide par défaut, quelles données tracer — en le pointant verstbl.ListColumns("Profit").Range, cela trace la colonne Profit pour chaque ligne visible du tableau ;HasTitle = Truedoit être défini avant d’assignerChartTitle.Text— essayer de définir le texte du titre sur un graphique qui n’a pas encore de titre échouera.
Mise à jour des données du graphique
Lorsque le tableau sous-jacent s’agrandit, il est préférable de rediriger le graphique vers la nouvelle plage avec SetSourceData plutôt que de le supprimer et de le recréer — cela préserve tout formatage manuel déjà appliqué :
Dim cht As Chart
Set cht = ThisWorkbook.Worksheets("Reports").ChartObjects(1).Chart
cht.SetSourceData Source:=tbl.ListColumns("Profit").Range
ChartObjects(1) fait référence à la première forme de graphique sur la feuille par position — cela convient lorsqu’il n’y a qu’un seul graphique, mais devient fragile dès qu’un second graphique est ajouté, car « premier » peut alors désigner autre chose sans avertissement. Faire référence à un graphique par un nom que vous définissez explicitement (chartObj.Name = "ProfitChart", puis ChartObjects("ProfitChart")) est plus robuste dès qu’une feuille contient plusieurs graphiques.
Mise en forme des graphiques
With chartObj.Chart
.ChartTitle.Font.Size = 14
.ChartTitle.Font.Bold = True
.SeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(24, 106, 60)
.Axes(xlValue).TickLabels.NumberFormat = "#,##0"
.HasLegend = False
End With
SeriesCollection(1) correspond à la première (et ici, unique) série de données tracée — sa propriété Format.Fill.ForeColor.RGB permet de colorer les barres, en utilisant la même fonction RGB(...) que dans les exemples de mise en forme du chapitre 1. Axes(xlValue) fait spécifiquement référence à l’axe numérique (par opposition à xlCategory, l’axe listant les noms de région) — appliquer NumberFormat ici contrôle l’affichage des nombres le long de cet axe, exactement comme NumberFormat sur une cellule de feuille. HasLegend = False supprime entièrement la légende, ce qui est recommandé lorsqu’un graphique ne comporte qu’une seule série, car une légende expliquant une seule couleur ajoute de l’encombrement sans apporter d’information.
Tâche
- Exécuter
BuildProfitChartet vérifier qu’un graphique en colonnes apparaît, affichant le Profit pour les quinze lignes (les trois mois, non filtrés). - Ajouter trois lignes pour colorer les barres du graphique en vert foncé (RGB(24,106,60)) et supprimer la légende, comme illustré ci-dessus.
- Filtrer tblReports pour ne garder que janvier et relancer
SetSourceDatasurtbl.ListColumns("Profit").Range— observer si le graphique respecte le filtre.
1. Exécution de BuildProfitChart
- Copier la
Subexactement comme indiqué dans le chapitre et l’exécuter — aucune modification n’est nécessaire pour cette partie. - Un graphique doit apparaître sur la feuille Reports, affichant le Profit pour chaque ligne actuellement visible dans le tableau.
2. Coloration des barres et suppression de la légende
- Les deux propriétés appartiennent à l’objet graphique, et non à la feuille de calcul —
chartObj.Chartest votre point d’entrée, comme dans l’exemple de mise en forme du chapitre. - La couleur des barres se trouve sur
SeriesCollection(1), puisqu’il n’y a qu’une seule série de données tracée (Profit) —.Format.Fill.ForeColor.RGBest la propriété spécifique à définir. - La suppression de la légende est une propriété booléenne unique (
HasLegend), distincte de la ligne de couleur de remplissage.
3. Filtrage et réexécution de SetSourceData
- Appliquer un
AutoFiltersur Month (Field:=1) restreint à "January" — même technique que dans la section 4.2. - Appeler ensuite à nouveau
SetSourceDataavec exactement la même expressiontbl.ListColumns("Profit").Rangeque dansBuildProfitChart— rien n’a besoin d’être modifié dans cette ligne. - Observer attentivement ce qui se passe ensuite sur le graphique : se réduit-il aux cinq régions de janvier uniquement, ou affiche-t-il toujours les quinze lignes, y compris celles que l’AutoFilter vient de masquer ? Cette observation est le véritable objectif de cette tâche, pas seulement l’exécution du code.
Option Explicit
' Point 1 — run this exactly as shown in the chapter
Sub BuildProfitChart()
Dim ws As Worksheet
Dim tbl As ListObject
Dim chartObj As ChartObject
Set ws = ThisWorkbook.Worksheets("Reports")
Set tbl = ws.ListObjects("tblReports")
Set chartObj = ws.Shapes.AddChart2(Style:=201, _
XlChartType:=xlColumnClustered, _
Left:=400, Top:=20, Width:=400, Height:=250).Chart.Parent
With chartObj.Chart
.SetSourceData Source:=tbl.ListColumns("Profit").Range
.HasTitle = True
.ChartTitle.Text = "Profit by Region"
End With
End Sub
' Point 2 — color the bars and remove the legend
Sub FormatProfitChart()
Dim ws As Worksheet
Dim chartObj As ChartObject
Set ws = ThisWorkbook.Worksheets("Reports")
Set chartObj = ws.ChartObjects(1)
With chartObj.Chart
.SeriesCollection(1).Format.Fill.ForeColor.RGB = RGB(24, 106, 60)
.HasLegend = False
End With
End Sub
' Point 3 — filter to January, then re-point the chart at the same range
Sub FilterJanuaryAndRefreshChart()
Dim ws As Worksheet
Dim tbl As ListObject
Dim chartObj As ChartObject
Set ws = ThisWorkbook.Worksheets("Reports")
Set tbl = ws.ListObjects("tblReports")
Set chartObj = ws.ChartObjects(1)
tbl.Range.AutoFilter Field:=1, Criteria1:="January"
chartObj.Chart.SetSourceData Source:=tbl.ListColumns("Profit").Range
End Sub
Exécuter ces macros dans l’ordre : BuildProfitChart, puis FormatProfitChart, puis FilterJanuaryAndRefreshChart. Pour le point 3 en particulier — prêter attention à ce qui se passe réellement. Les graphiques Excel respectent généralement un AutoFilter actif, masquant automatiquement les barres des lignes filtrées, même sans relancer SetSourceData. Le relancer ici sert surtout à confirmer que le graphique pointe toujours vers la colonne complète — c’est le filtre lui-même qui masque visuellement, pas l’appel à SetSourceData. Il est intéressant de tester avec le filtre activé et désactivé pour constater la différence.
Exécuter BuildProfitChart plusieurs fois crée un nouveau graphique à chaque fois sans supprimer l’ancien — plusieurs graphiques se retrouvent donc superposés. ChartObjects(1) fait toujours référence au premier créé, qui peut maintenant être caché sous une copie plus récente. C’est pourquoi les modifications de mise en forme peuvent s’exécuter avec succès mais sembler n’avoir aucun effet visible.
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion