Kaavioiden automatisointi
Pyyhkäise näyttääksesi valikon
Kaaviot ovat muotoja, jotka sijaitsevat laskentataulukon päällä, ja kuten kaikki muutkin tässä luvussa, jokaiselle ominaisuudelle, jonka asettaisit käsin Muotoile-paneelissa, löytyy VBA-vastine.
Kaavion luominen
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 luo itse kaaviomuodon —
Style:=201valitsee sisäänrakennetun visuaalisen tyylin,XlChartType:=xlColumnClusteredvalitsee tavallisen pylväskaavion, ja Left/Top/Width/Height määrittävät sijainnin ja koon taulukossa pisteinä, sama yksikkö jota Excel käyttää sisäisesti muotojen sijoitteluun; - AddChart2 palauttaa itse asiassa Chart-olion, ei sen ympärillä olevaa ChartObject-kontaineria —
.Chart.Parentrivin lopussa palaa takaisin kontaineriin, joka on se tyyppi, joksi chartObj on määritelty; tämä yksityiskohta on helppo unohtaa ja kannattaa kopioida täsmälleen; SetSourceDatakertoo muuten tyhjälle kaaviomuodolle, mitä dataa piirtää — osoittamalla sen kohtaantbl.ListColumns("Profit").Rangekaavio piirtää Profit-sarakkeen kaikki näkyvät rivit taulukosta;HasTitle = Truetäytyy asettaa ennen kuinChartTitle.Textmääritetään — jos yrittää asettaa otsikkotekstin kaaviolle, jolla ei vielä ole otsikkoa, se epäonnistuu.
Kaaviotietojen päivittäminen
Kun taulukko kasvaa, osoita kaavio uuteen alueeseen SetSourceData-komennolla sen sijaan, että poistaisit ja rakentaisit sen uudelleen — näin säilyvät kaikki aiemmin tehdyt manuaaliset muotoilut:
Dim cht As Chart
Set cht = ThisWorkbook.Worksheets("Reports").ChartObjects(1).Chart
cht.SetSourceData Source:=tbl.ListColumns("Profit").Range
ChartObjects(1) viittaa ensimmäiseen kaaviomuotoon taulukossa sijainnin perusteella — toimii hyvin, kun kaavioita on vain yksi, mutta muuttuu epäluotettavaksi heti kun lisätään toinen kaavio, koska "ensimmäinen" voi tarkoittaa eri asiaa sen jälkeen. Viittaaminen kaavioon nimellä, jonka olet itse määrittänyt (chartObj.Name = "ProfitChart", sitten ChartObjects("ProfitChart")), on kestävämpi ratkaisu, kun taulukossa on useampi kaavio.
Kaavioiden muotoilu
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) on ensimmäinen (ja tässä ainoa) piirrettävä tietosarja — sen Format.Fill.ForeColor.RGB määrittää pylväiden värin, käyttäen samaa RGB(...) -funktiota kuin luvun 1 muotoiluesimerkeissä. Axes(xlValue) viittaa nimenomaan numeeriseen akseliin (toisin kuin xlCategory, joka listaa alueiden nimet) — NumberFormatin asettaminen siihen määrittää, miten akselin numerot näytetään, aivan kuten NumberFormat solussa. HasLegend = False poistaa selitteen kokonaan, mikä kannattaa tehdä aina kun kaaviossa on vain yksi sarja, sillä yhden värin selite lisää vain turhaa visuaalista hälyä.
Tehtävä
- Suorita
BuildProfitChartja varmista, että pylväskaavio ilmestyy näyttäen Profit-arvot kaikilta viideltätoista riviltä (kaikki kolme kuukautta, ei suodatusta). - Lisää kolme riviä, jotka värittävät kaavion pylväät tummanvihreiksi (RGB(24,106,60)) ja poistavat selitteen, kuten yllä on esitetty.
- Suodata tblReports vain tammikuuhun ja suorita
SetSourceDatauudelleen kohdistettunatbl.ListColumns("Profit").Range— tarkkaile, kun kaavio päivittyy suodatuksen mukaisesti.
1. BuildProfitChart-makron suorittaminen
- Kopioi
Subtäsmälleen kuten luvussa ja suorita se — tähän osaan ei tarvita muutoksia. - Näet kaavion ilmestyvän Reports-välilehdelle, joka kuvaa Profit-arvon jokaiselle taulukon näkyvälle riville.
2. Palkkien väritys ja selitteen poistaminen
- Molemmat ominaisuudet kuuluvat kaavio-objektille, eivät laskentataulukolle —
chartObj.Charton lähtöpisteesi, kuten luvun muotoiluesimerkissä. - Palkin väri määritetään
SeriesCollection(1):lle, koska vain yksi tietosarja (Profit) piirretään —.Format.Fill.ForeColor.RGBon tarkka ominaisuus, jota muutetaan. - Selitteen poistaminen on yksittäinen Boolean-ominaisuus (
HasLegend), erillinen täyttövärin rivistä.
3. Suodatus ja SetSourceData:n uudelleensuoritus
- Käytä
AutoFilter-toimintoa kuukaudelle (Field:=1), rajattuna "January" — sama tekniikka kuin kohdassa 4.2. - Kutsu sitten
SetSourceDatauudelleen käyttäen täsmälleen samaatbl.ListColumns("Profit").Range-ilmaisua kuinBuildProfitChart-makrossa — tätä riviä ei tarvitse muuttaa. - Tarkkaile, mitä kaaviolle tapahtuu tämän jälkeen: kutistuuko se vain tammikuun viiteen alueeseen vai näyttääkö se edelleen kaikki viisitoista riviä, mukaan lukien AutoFilterin piilottamat? Tämän havainnointi on tehtävän varsinainen tarkoitus, ei pelkkä koodin suorittaminen.
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
Suorita nämä järjestyksessä: BuildProfitChart, sitten FormatProfitChart, sitten FilterJanuaryAndRefreshChart. Kohta 3 — kiinnitä erityistä huomiota siihen, mitä oikeasti tapahtuu. Excelin kaaviot yleensä huomioivat aktiivisen AutoFilter-suodatuksen ja piilottavat suodatetut rivit automaattisesti, vaikka SetSourceData-kutsua ei suoritettaisikaan uudelleen. Tässä sen uudelleensuoritus lähinnä varmistaa, että kaavio osoittaa edelleen oikeaan sarakkeeseen — itse suodatus piilottaa rivit visuaalisesti, ei SetSourceData. Kannattaa testata suodattimen ollessa sekä päällä että pois päältä, jotta näet eron itse.
BuildProfitChart-makron suorittaminen useammin kuin kerran luo joka kerta uuden kaavion poistamatta vanhaa — useita kaavioita siis pinoutuu päällekkäin. ChartObjects(1) viittaa aina ensimmäiseen luotuun kaavioon, joka saattaa nyt olla piilossa uudemman kopion alla. Siksi muotoilumuutokset voivat onnistua mutta eivät näy näkyvästi.
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Kaavioiden automatisointi
Kaaviot ovat muotoja, jotka sijaitsevat laskentataulukon päällä, ja kuten kaikki muutkin tässä luvussa, jokaiselle ominaisuudelle, jonka asettaisit käsin Muotoile-paneelissa, löytyy VBA-vastine.
Kaavion luominen
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 luo itse kaaviomuodon —
Style:=201valitsee sisäänrakennetun visuaalisen tyylin,XlChartType:=xlColumnClusteredvalitsee tavallisen pylväskaavion, ja Left/Top/Width/Height määrittävät sijainnin ja koon taulukossa pisteinä, sama yksikkö jota Excel käyttää sisäisesti muotojen sijoitteluun; - AddChart2 palauttaa itse asiassa Chart-olion, ei sen ympärillä olevaa ChartObject-kontaineria —
.Chart.Parentrivin lopussa palaa takaisin kontaineriin, joka on se tyyppi, joksi chartObj on määritelty; tämä yksityiskohta on helppo unohtaa ja kannattaa kopioida täsmälleen; SetSourceDatakertoo muuten tyhjälle kaaviomuodolle, mitä dataa piirtää — osoittamalla sen kohtaantbl.ListColumns("Profit").Rangekaavio piirtää Profit-sarakkeen kaikki näkyvät rivit taulukosta;HasTitle = Truetäytyy asettaa ennen kuinChartTitle.Textmääritetään — jos yrittää asettaa otsikkotekstin kaaviolle, jolla ei vielä ole otsikkoa, se epäonnistuu.
Kaaviotietojen päivittäminen
Kun taulukko kasvaa, osoita kaavio uuteen alueeseen SetSourceData-komennolla sen sijaan, että poistaisit ja rakentaisit sen uudelleen — näin säilyvät kaikki aiemmin tehdyt manuaaliset muotoilut:
Dim cht As Chart
Set cht = ThisWorkbook.Worksheets("Reports").ChartObjects(1).Chart
cht.SetSourceData Source:=tbl.ListColumns("Profit").Range
ChartObjects(1) viittaa ensimmäiseen kaaviomuotoon taulukossa sijainnin perusteella — toimii hyvin, kun kaavioita on vain yksi, mutta muuttuu epäluotettavaksi heti kun lisätään toinen kaavio, koska "ensimmäinen" voi tarkoittaa eri asiaa sen jälkeen. Viittaaminen kaavioon nimellä, jonka olet itse määrittänyt (chartObj.Name = "ProfitChart", sitten ChartObjects("ProfitChart")), on kestävämpi ratkaisu, kun taulukossa on useampi kaavio.
Kaavioiden muotoilu
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) on ensimmäinen (ja tässä ainoa) piirrettävä tietosarja — sen Format.Fill.ForeColor.RGB määrittää pylväiden värin, käyttäen samaa RGB(...) -funktiota kuin luvun 1 muotoiluesimerkeissä. Axes(xlValue) viittaa nimenomaan numeeriseen akseliin (toisin kuin xlCategory, joka listaa alueiden nimet) — NumberFormatin asettaminen siihen määrittää, miten akselin numerot näytetään, aivan kuten NumberFormat solussa. HasLegend = False poistaa selitteen kokonaan, mikä kannattaa tehdä aina kun kaaviossa on vain yksi sarja, sillä yhden värin selite lisää vain turhaa visuaalista hälyä.
Tehtävä
- Suorita
BuildProfitChartja varmista, että pylväskaavio ilmestyy näyttäen Profit-arvot kaikilta viideltätoista riviltä (kaikki kolme kuukautta, ei suodatusta). - Lisää kolme riviä, jotka värittävät kaavion pylväät tummanvihreiksi (RGB(24,106,60)) ja poistavat selitteen, kuten yllä on esitetty.
- Suodata tblReports vain tammikuuhun ja suorita
SetSourceDatauudelleen kohdistettunatbl.ListColumns("Profit").Range— tarkkaile, kun kaavio päivittyy suodatuksen mukaisesti.
1. BuildProfitChart-makron suorittaminen
- Kopioi
Subtäsmälleen kuten luvussa ja suorita se — tähän osaan ei tarvita muutoksia. - Näet kaavion ilmestyvän Reports-välilehdelle, joka kuvaa Profit-arvon jokaiselle taulukon näkyvälle riville.
2. Palkkien väritys ja selitteen poistaminen
- Molemmat ominaisuudet kuuluvat kaavio-objektille, eivät laskentataulukolle —
chartObj.Charton lähtöpisteesi, kuten luvun muotoiluesimerkissä. - Palkin väri määritetään
SeriesCollection(1):lle, koska vain yksi tietosarja (Profit) piirretään —.Format.Fill.ForeColor.RGBon tarkka ominaisuus, jota muutetaan. - Selitteen poistaminen on yksittäinen Boolean-ominaisuus (
HasLegend), erillinen täyttövärin rivistä.
3. Suodatus ja SetSourceData:n uudelleensuoritus
- Käytä
AutoFilter-toimintoa kuukaudelle (Field:=1), rajattuna "January" — sama tekniikka kuin kohdassa 4.2. - Kutsu sitten
SetSourceDatauudelleen käyttäen täsmälleen samaatbl.ListColumns("Profit").Range-ilmaisua kuinBuildProfitChart-makrossa — tätä riviä ei tarvitse muuttaa. - Tarkkaile, mitä kaaviolle tapahtuu tämän jälkeen: kutistuuko se vain tammikuun viiteen alueeseen vai näyttääkö se edelleen kaikki viisitoista riviä, mukaan lukien AutoFilterin piilottamat? Tämän havainnointi on tehtävän varsinainen tarkoitus, ei pelkkä koodin suorittaminen.
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
Suorita nämä järjestyksessä: BuildProfitChart, sitten FormatProfitChart, sitten FilterJanuaryAndRefreshChart. Kohta 3 — kiinnitä erityistä huomiota siihen, mitä oikeasti tapahtuu. Excelin kaaviot yleensä huomioivat aktiivisen AutoFilter-suodatuksen ja piilottavat suodatetut rivit automaattisesti, vaikka SetSourceData-kutsua ei suoritettaisikaan uudelleen. Tässä sen uudelleensuoritus lähinnä varmistaa, että kaavio osoittaa edelleen oikeaan sarakkeeseen — itse suodatus piilottaa rivit visuaalisesti, ei SetSourceData. Kannattaa testata suodattimen ollessa sekä päällä että pois päältä, jotta näet eron itse.
BuildProfitChart-makron suorittaminen useammin kuin kerran luo joka kerta uuden kaavion poistamatta vanhaa — useita kaavioita siis pinoutuu päällekkäin. ChartObjects(1) viittaa aina ensimmäiseen luotuun kaavioon, joka saattaa nyt olla piilossa uudemman kopion alla. Siksi muotoilumuutokset voivat onnistua mutta eivät näy näkyvästi.
Kiitos palautteestasi!