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.
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
- AddChart2 opretter selve diagramformen —
Style:=201vælger en indbygget visuel stil,XlChartType:=xlColumnClusteredvæ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.Parenti 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; SetSourceDataangiver, 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 = Trueskal sættes, førChartTitle.Texttildeles — 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
- Kør
BuildProfitChartog bekræft, at et søjlediagram vises med Profit for alle femten rækker (alle tre måneder, ufiltreret). - Tilføj tre linjer for at farve diagrammets søjler mørkegrønne (RGB(24,106,60)) og fjern forklaringen, som vist ovenfor.
- Filtrér tblReports til kun januar og kør
SetSourceDataigen påtbl.ListColumns("Profit").Range— bemærk, om diagrammet respekterer filteret.
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.Charter dit udgangspunkt, ligesom i formateringseksemplet i kapitlet. - Søjlefarven findes på
SeriesCollection(1), da der kun vises én dataserie (Profit) —.Format.Fill.ForeColor.RGBer 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
AutoFilterpå Month (Field:=1), begrænset til "January" — samme teknik som i afsnit 4.2. - Kald derefter
SetSourceDataigen med det nøjagtige samme udtryktbl.ListColumns("Profit").RangefraBuildProfitChart— 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.
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.
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.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat