Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Leer Grafieken Automatiseren | Tabellen en Rapporten Automatiseren
Excel VBA voor Bedrijfsautomatisering

Grafieken Automatiseren

Veeg om het menu te tonen

Grafieken zijn vormen die bovenop een werkblad staan, en zoals alles in dit hoofdstuk, heeft elke eigenschap die je handmatig zou instellen in het opmaakvenster een VBA-equivalent.

Figuur 4.4

Een grafiek maken

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
Regel voor regel uitgelegd
expand arrow
  • AddChart2 maakt de grafiekvorm zelf aan — Style:=201 kiest een ingebouwde visuele stijl, XlChartType:=xlColumnClustered kiest een standaard kolomdiagram, en Left/Top/Width/Height positioneren en schalen het op het werkblad in punten, dezelfde eenheid die Excel intern gebruikt voor vormplaatsing;
  • AddChart2 retourneert daadwerkelijk een Chart-object, niet de ChartObject-container eromheen — de .Chart.Parent aan het einde van die regel is wat teruggaat naar de container, het type waar chartObj als is gedeclareerd; deze eigenaardigheid is gemakkelijk te vergeten en het is de moeite waard om dit exact over te nemen;
  • SetSourceData geeft aan welke gegevens in de verder lege grafiekvorm moeten worden weergegeven — door te verwijzen naar tbl.ListColumns("Profit").Range wordt de kolom Profit over elke zichtbare rij van de Table weergegeven;
  • HasTitle = True moet worden ingesteld voordat ChartTitle.Text wordt toegewezen — proberen de titeltekst toe te wijzen aan een grafiek die nog geen titel heeft, zal mislukken.

Grafiekgegevens bijwerken

Wanneer de onderliggende tabel groeit, wijs de grafiek naar het nieuwe bereik met SetSourceData in plaats van deze te verwijderen en opnieuw op te bouwen — dit behoudt alle handmatige opmaak die al is toegepast:

Dim cht As Chart
Set cht = ThisWorkbook.Worksheets("Reports").ChartObjects(1).Chart
cht.SetSourceData Source:=tbl.ListColumns("Profit").Range

ChartObjects(1) verwijst naar de eerste grafiekvorm op het blad op basis van positie — dit werkt zolang er maar één grafiek is, maar wordt kwetsbaar zodra er een tweede grafiek wordt toegevoegd, omdat "eerste" dan stilletjes iets anders kan betekenen. Verwijzen naar een grafiek via een expliciet ingestelde naam (chartObj.Name = "ProfitChart", daarna ChartObjects("ProfitChart")) is robuuster zodra een blad meer dan één grafiek bevat.

Grafieken opmaken

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) is de eerste (en hier enige) gegevensreeks die wordt weergegeven — de Format.Fill.ForeColor.RGB bepaalt de kleur van de daadwerkelijke balken, met dezelfde RGB(...) functie als in de opmaakvoorbeelden van hoofdstuk 1. Axes(xlValue) verwijst specifiek naar de numerieke as (in tegenstelling tot xlCategory, de as met de regiobenamingen) — het toepassen van NumberFormat daar bepaalt hoe de getallen langs die as worden weergegeven, precies zoals NumberFormat op een werkbladcel. HasLegend = False verwijdert de legenda volledig, wat zinvol is wanneer een grafiek slechts één reeks bevat, omdat een legenda die één kleur uitlegt alleen maar rommel toevoegt zonder extra informatie te geven.

Taak

  1. Voer BuildProfitChart uit en controleer of er een kolomdiagram verschijnt dat Profit toont voor alle vijftien rijen (alle drie maanden, ongefilterd).
  2. Voeg drie regels toe om de balken van de grafiek donkergroen te kleuren (RGB(24,106,60)) en verwijder de legenda, zoals hierboven weergegeven.
  3. Filter tblReports tot alleen januari en voer SetSourceData opnieuw uit op tbl.ListColumns("Profit").Range — let op of de grafiek het filter respecteert.
Hint
expand arrow

1. BuildProfitChart uitvoeren

  • Kopieer de Sub exact zoals getoond in het hoofdstuk en voer deze uit — voor dit onderdeel zijn geen wijzigingen nodig.
  • Je ziet een grafiek verschijnen op het tabblad Reports die de winst (Profit) weergeeft voor elke momenteel zichtbare rij in de tabel.

2. Balken kleuren en de legenda verwijderen

  • Beide eigenschappen behoren tot het grafiekobject, niet tot het werkblad — chartObj.Chart is het startpunt, net als in het formatteringsvoorbeeld in het hoofdstuk.
  • De balkkleur bevindt zich op SeriesCollection(1), omdat er slechts één gegevensreeks wordt weergegeven (Profit) — .Format.Fill.ForeColor.RGB is de specifieke eigenschap die je instelt.
  • Het verwijderen van de legenda is een enkele Booleaanse eigenschap (HasLegend), los van de regel voor de vulkleur.

3. Filteren en SetSourceData opnieuw uitvoeren

  • Pas een AutoFilter toe op Month (Field:=1) beperkt tot "January" — dezelfde techniek als in sectie 4.2.
  • Roep vervolgens opnieuw SetSourceData aan met exact dezelfde tbl.ListColumns("Profit").Range-expressie uit BuildProfitChart — aan die regel hoeft niets te worden gewijzigd.
  • Let goed op wat er daarna met de grafiek gebeurt: krimpt deze tot alleen de vijf regio's van januari, of worden nog steeds alle vijftien rijen getoond, inclusief de rijen die zojuist door AutoFilter zijn verborgen? Die observatie is het eigenlijke doel van deze taak, niet alleen het uitvoeren van de code.
Oplossing
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

Voer deze uit in volgorde: BuildProfitChart, daarna FormatProfitChart, vervolgens FilterJanuaryAndRefreshChart. Let bij punt 3 specifiek op wat er daadwerkelijk gebeurt. Excel-grafieken houden doorgaans wel rekening met een actieve AutoFilter en verbergen automatisch de balken van gefilterde rijen, zelfs zonder SetSourceData opnieuw uit te voeren. Het opnieuw uitvoeren hiervan bevestigt vooral dat de grafiek nog steeds correct naar de volledige kolom verwijst — het filter zelf zorgt voor het visueel verbergen, niet de SetSourceData-aanroep. Het is de moeite waard om het filter zowel aan als uit te testen om het verschil zelf te zien.

Note
Opmerking

Het meermaals uitvoeren van BuildProfitChart maakt elke keer een nieuwe grafiek aan zonder de oude te verwijderen — hierdoor komen er meerdere grafieken boven op elkaar te liggen. ChartObjects(1) verwijst altijd naar de eerste aangemaakte grafiek, die nu mogelijk onder een nieuwere versie verborgen ligt. Daarom kunnen opmaakwijzigingen succesvol worden uitgevoerd, maar lijkt het alsof er visueel niets verandert.

Was alles duidelijk?

Hoe kunnen we het verbeteren?

Bedankt voor je feedback!

Sectie 4. Hoofdstuk 4

Vraag AI

expand

Vraag AI

ChatGPT

Vraag wat u wilt of probeer een van de voorgestelde vragen om onze chat te starten.

Sectie 4. Hoofdstuk 4
some-alt