Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Apprendre Automatisation des graphiques | Automatisation des tableaux et des rapports
VBA Excel Pour l'Automatisation des Entreprises

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.

Figure 4.4

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
Analyse ligne par ligne
expand arrow
  • AddChart2 crée la forme du graphique — Style:=201 sélectionne un style visuel intégré, XlChartType:=xlColumnClustered choisit 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 ;
  • SetSourceData indique à la forme du graphique, qui est vide par défaut, quelles données tracer — en le pointant vers tbl.ListColumns("Profit").Range, cela trace la colonne Profit pour chaque ligne visible du tableau ;
  • HasTitle = True doit être défini avant d’assigner ChartTitle.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

  1. Exécuter BuildProfitChart et vérifier qu’un graphique en colonnes apparaît, affichant le Profit pour les quinze lignes (les trois mois, non filtrés).
  2. 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.
  3. Filtrer tblReports pour ne garder que janvier et relancer SetSourceData sur tbl.ListColumns("Profit").Range — observer si le graphique respecte le filtre.
Indice
expand arrow

1. Exécution de BuildProfitChart

  • Copier la Sub exactement 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.Chart est 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.RGB est 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 AutoFilter sur Month (Field:=1) restreint à "January" — même technique que dans la section 4.2.
  • Appeler ensuite à nouveau SetSourceData avec exactement la même expression tbl.ListColumns("Profit").Range que dans BuildProfitChart — 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.
Solution
expand arrow
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.

Note
Remarque

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.

Tout était clair ?

Comment pouvons-nous l'améliorer ?

Merci pour vos commentaires !

Section 4. Chapitre 4

Demandez à l'IA

expand

Demandez à l'IA

ChatGPT

Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion

Section 4. Chapitre 4
some-alt