Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Automatisering af diagrammer | Automatisering af Tabeller og Rapporter
Excel VBA til Forretningsautomatisering

Automatisering af diagrammer

Stryg for at vise menuen

Diagrammer er figurer, der ligger oven på et regneark, og ligesom alt andet i dette kapitel har hver egenskab, du ville indstille manuelt i Format-panelet, en VBA-ækvivalent.

Figur 4.4

Oprettelse af et diagram

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
Gennemgang linje for linje
expand arrow
  • AddChart2 opretter selve diagramformen — Style:=201 vælger en indbygget visuel stil, XlChartType:=xlColumnClustered vælger et standard søjlediagram, og Left/Top/Width/Height placerer og størrelsesbestemmer det på regnearket i punkter, samme enhed som Excel bruger internt til formplacering;
  • AddChart2 returnerer faktisk et Chart-objekt, ikke ChartObject-beholderen omkring det — .Chart.Parent i slutningen af linjen går et niveau op til beholderen, som er den type, chartObj er erklæret som; denne detalje er let at overse og værd at kopiere nøjagtigt;
  • SetSourceData angiver, hvilke data det ellers tomme diagram skal vise — når den peger på tbl.ListColumns("Profit").Range, betyder det, at Profit-kolonnen vises for alle synlige rækker i tabellen;
  • HasTitle = True skal sættes, før ChartTitle.Text tildeles — hvis man forsøger at sætte titlen på et diagram, der endnu ikke har en titel slået til, vil det fejle.

Opdatering af diagramdata

Når den underliggende tabel vokser, skal diagrammet pege på det nye område med SetSourceData i stedet for at slette og genopbygge det — dette bevarer eventuel manuel formatering, der allerede er anvendt:

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

ChartObjects(1) henviser til den første diagramform på arket efter placering — det fungerer, når der kun er ét diagram, men bliver skrøbeligt, så snart et andet diagram tilføjes, da "første" derefter kan betyde noget andet. At referere til et diagram med et navn, du selv har angivet (chartObj.Name = "ProfitChart", derefter ChartObjects("ProfitChart"))), er mere robust, når et ark har mere end ét diagram.

Formatering af diagrammer

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) er den første (og her eneste) dataserie, der vises — dens Format.Fill.ForeColor.RGB bestemmer farven på selve søjlerne, ved brug af samme RGB(...) funktion som i kapitel 1's formateringseksempler. Axes(xlValue) henviser specifikt til den numeriske akse (i modsætning til xlCategory, som viser Regionsnavne) — at anvende NumberFormat her styrer, hvordan tallene på den akse vises, præcis som NumberFormat på en celle i regnearket. HasLegend = False fjerner hele forklaringen, hvilket er værd at gøre, når et diagram kun har én serie, da en forklaring på én farve blot tilføjer støj uden at give ekstra information.

Opgave

  1. Kør BuildProfitChart og bekræft, at et søjlediagram vises med Profit for alle femten rækker (alle tre måneder, ufiltreret).
  2. Tilføj tre linjer for at farve diagrammets søjler mørkegrønne (RGB(24,106,60)) og fjern forklaringen, som vist ovenfor.
  3. Filtrér tblReports til kun januar og kør SetSourceData igen på tbl.ListColumns("Profit").Range — bemærk, om diagrammet respekterer filteret.
Tip
expand arrow

1. Kørsel af BuildProfitChart

  • Kopiér Sub-proceduren nøjagtigt som vist i kapitlet og kør den — ingen ændringer er nødvendige for denne del.
  • Du bør se et diagram dukke op på rapportarket, der viser Profit for hver række, der aktuelt er synlig i tabellen.

2. Farvelægning af søjler og fjernelse af forklaring

  • Begge egenskaber tilhører diagramobjektet, ikke regnearket — chartObj.Chart er dit udgangspunkt, ligesom i formateringseksemplet i kapitlet.
  • Søjlefarven findes på SeriesCollection(1), da der kun vises én dataserie (Profit) — .Format.Fill.ForeColor.RGB er den specifikke egenskab, der skal indstilles.
  • Fjernelse af forklaringen er en enkelt boolesk egenskab (HasLegend), adskilt fra linjen med udfyldningsfarve.

3. Filtrering og genkørsel af SetSourceData

  • Anvend et AutoFilter på Month (Field:=1), begrænset til "January" — samme teknik som i afsnit 4.2.
  • Kald derefter SetSourceData igen med det nøjagtige samme udtryk tbl.ListColumns("Profit").Range fra BuildProfitChart — intet ved den linje skal ændres.
  • Hold nøje øje med, hvad der sker med diagrammet bagefter: Skrumper det ind til kun januars fem regioner, eller viser det stadig alle femten rækker, inklusive dem AutoFilter netop har skjult? Det er faktisk pointen med denne opgave, ikke blot at køre koden.
Løsning
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

Kør disse i rækkefølge: BuildProfitChart, derefter FormatProfitChart, derefter FilterJanuaryAndRefreshChart. For punkt 3 — vær opmærksom på, hvad der faktisk sker. Excel-diagrammer respekterer generelt en aktiv AutoFilter og skjuler automatisk søjler for filtrerede rækker, selv uden at genkøre SetSourceData. At genkøre den her bekræfter mest, at diagrammet stadig peger korrekt på hele kolonnen — det er selve filteret, der står for den visuelle skjulning, ikke SetSourceData-kaldet. Det er værd at teste med filteret både slået til og fra for at se forskellen selv.

Note
Bemærk

Hvis du kører BuildProfitChart mere end én gang, oprettes der et nyt diagram hver gang uden at slette det gamle — så flere diagrammer bliver stablet oven på hinanden. ChartObjects(1) henviser altid til det første oprettede, som nu kan være skjult under en nyere kopi. Derfor kan formateringsændringer gennemføres uden at det ser ud til at have nogen synlig effekt.

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 4. Kapitel 4

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Sektion 4. Kapitel 4
some-alt