Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Oppiskele Kaavioiden automatisointi | Taulukoiden ja Raporttien Automatisointi
Excel VBA Liiketoiminnan Automaatioon

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.

Kuvio 4.4

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
Rivikohtainen läpikäynti
expand arrow
  • AddChart2 luo itse kaaviomuodon — Style:=201 valitsee sisäänrakennetun visuaalisen tyylin, XlChartType:=xlColumnClustered valitsee 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.Parent rivin 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;
  • SetSourceData kertoo muuten tyhjälle kaaviomuodolle, mitä dataa piirtää — osoittamalla sen kohtaan tbl.ListColumns("Profit").Range kaavio piirtää Profit-sarakkeen kaikki näkyvät rivit taulukosta;
  • HasTitle = True täytyy asettaa ennen kuin ChartTitle.Text mää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ä

  1. Suorita BuildProfitChart ja varmista, että pylväskaavio ilmestyy näyttäen Profit-arvot kaikilta viideltätoista riviltä (kaikki kolme kuukautta, ei suodatusta).
  2. Lisää kolme riviä, jotka värittävät kaavion pylväät tummanvihreiksi (RGB(24,106,60)) ja poistavat selitteen, kuten yllä on esitetty.
  3. Suodata tblReports vain tammikuuhun ja suorita SetSourceData uudelleen kohdistettuna tbl.ListColumns("Profit").Range — tarkkaile, kun kaavio päivittyy suodatuksen mukaisesti.
Vihje
expand arrow

1. BuildProfitChart-makron suorittaminen

  • Kopioi Sub tä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.Chart on 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.RGB on 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 SetSourceData uudelleen käyttäen täsmälleen samaa tbl.ListColumns("Profit").Range-ilmaisua kuin BuildProfitChart-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.
Ratkaisu
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

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.

Note
Huomio

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.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 4

Kysy tekoälyä

expand

Kysy tekoälyä

ChatGPT

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.

Kuvio 4.4

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
Rivikohtainen läpikäynti
expand arrow
  • AddChart2 luo itse kaaviomuodon — Style:=201 valitsee sisäänrakennetun visuaalisen tyylin, XlChartType:=xlColumnClustered valitsee 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.Parent rivin 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;
  • SetSourceData kertoo muuten tyhjälle kaaviomuodolle, mitä dataa piirtää — osoittamalla sen kohtaan tbl.ListColumns("Profit").Range kaavio piirtää Profit-sarakkeen kaikki näkyvät rivit taulukosta;
  • HasTitle = True täytyy asettaa ennen kuin ChartTitle.Text mää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ä

  1. Suorita BuildProfitChart ja varmista, että pylväskaavio ilmestyy näyttäen Profit-arvot kaikilta viideltätoista riviltä (kaikki kolme kuukautta, ei suodatusta).
  2. Lisää kolme riviä, jotka värittävät kaavion pylväät tummanvihreiksi (RGB(24,106,60)) ja poistavat selitteen, kuten yllä on esitetty.
  3. Suodata tblReports vain tammikuuhun ja suorita SetSourceData uudelleen kohdistettuna tbl.ListColumns("Profit").Range — tarkkaile, kun kaavio päivittyy suodatuksen mukaisesti.
Vihje
expand arrow

1. BuildProfitChart-makron suorittaminen

  • Kopioi Sub tä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.Chart on 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.RGB on 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 SetSourceData uudelleen käyttäen täsmälleen samaa tbl.ListColumns("Profit").Range-ilmaisua kuin BuildProfitChart-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.
Ratkaisu
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

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.

Note
Huomio

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.

Oliko kaikki selvää?

Miten voimme parantaa sitä?

Kiitos palautteestasi!

Osio 4. Luku 4
some-alt