Automazione dei grafici
Scorri per mostrare il menu
I grafici sono forme posizionate sopra un foglio di lavoro e, come tutto il resto in questo capitolo, ogni proprietà che imposteresti manualmente nel riquadro Formato ha un equivalente in VBA.
Creazione di un grafico
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 crea effettivamente la forma del grafico —
Style:=201seleziona uno stile visivo predefinito,XlChartType:=xlColumnClusteredseleziona un grafico a colonne standard, e Left/Top/Width/Height ne determinano posizione e dimensioni sul foglio di lavoro in punti, la stessa unità che Excel utilizza internamente per il posizionamento delle forme; - AddChart2 restituisce in realtà un oggetto Chart, non il contenitore ChartObject che lo circonda — il
.Chart.Parentalla fine di quella riga serve a risalire al contenitore, che è il tipo con cui chartObj è dichiarato; questa particolarità è facile da dimenticare e vale la pena copiarla esattamente; SetSourceDataindica alla forma del grafico, altrimenti vuota, quali dati rappresentare — puntando atbl.ListColumns("Profit").Rangesi rappresenta la colonna Profit su tutte le righe visibili della Tabella;HasTitle = Truedeve essere impostato prima di assegnareChartTitle.Text— provare a impostare il testo del titolo su un grafico che non ha ancora un titolo attivo causerà un errore.
Aggiornamento dei dati del grafico
Quando la tabella sottostante cresce, indirizzare il grafico al nuovo intervallo con SetSourceData invece di eliminarlo e ricostruirlo — questo preserva qualsiasi formattazione manuale già applicata:
Dim cht As Chart
Set cht = ThisWorkbook.Worksheets("Reports").ChartObjects(1).Chart
cht.SetSourceData Source:=tbl.ListColumns("Profit").Range
ChartObjects(1) si riferisce alla prima forma grafico sul foglio in base alla posizione — va bene quando c'è un solo grafico, ma diventa fragile nel momento in cui viene aggiunto un secondo grafico, poiché "primo" può silenziosamente significare qualcosa di diverso dopo. Fare riferimento a un grafico tramite un nome impostato esplicitamente (chartObj.Name = "ProfitChart", poi ChartObjects("ProfitChart")) è più robusto quando un foglio contiene più di un grafico.
Formattazione dei grafici
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) è la prima (e qui unica) serie di dati rappresentata — il suo Format.Fill.ForeColor.RGB determina il colore effettivo delle barre, utilizzando la stessa funzione RGB(...) degli esempi di formattazione del Capitolo 1. Axes(xlValue) si riferisce specificamente all'asse numerico (in contrapposizione a xlCategory, l'asse che elenca i nomi delle regioni) — applicare NumberFormat qui controlla come vengono visualizzati i numeri lungo quell'asse, esattamente come NumberFormat su una cella del foglio. HasLegend = False rimuove completamente la legenda, operazione consigliata quando un grafico ha una sola serie, poiché una legenda che spiega un solo colore aggiunge confusione senza fornire informazioni.
Attività
- Eseguire
BuildProfitCharte verificare che venga visualizzato un grafico a colonne che mostra il Profit per tutte e quindici le righe (tutti e tre i mesi, non filtrati). - Aggiungere tre righe per colorare le barre del grafico di verde scuro (RGB(24,106,60)) e rimuovere la legenda, come mostrato sopra.
- Filtrare tblReports solo per gennaio e rieseguire
SetSourceDatasutbl.ListColumns("Profit").Range— osservare se il grafico rispetta il filtro.
1. Esecuzione di BuildProfitChart
- Copiare la
Subesattamente come mostrato nel capitolo ed eseguirla — non sono necessarie modifiche per questa parte. - Si dovrebbe vedere un grafico apparire nel foglio Reports che traccia il Profit per ogni riga attualmente visibile nella tabella.
2. Colorazione delle barre e rimozione della legenda
- Entrambe le proprietà appartengono all'oggetto chart, non al foglio di lavoro —
chartObj.Chartè il punto di accesso, come nell'esempio di formattazione nel capitolo. - Il colore delle barre si trova su
SeriesCollection(1), poiché viene tracciata solo una serie di dati (Profit) —.Format.Fill.ForeColor.RGBè la proprietà specifica da impostare. - La rimozione della legenda è una singola proprietà booleana (
HasLegend), separata dalla riga del colore di riempimento.
3. Filtraggio e ri-esecuzione di SetSourceData
- Applicare un
AutoFiltersu Month (Field:=1) limitato a "January" — la stessa tecnica della sezione 4.2. - Quindi chiamare nuovamente
SetSourceDatacon la stessa espressionetbl.ListColumns("Profit").RangediBuildProfitChart— non è necessario modificare quella riga. - Osservare attentamente cosa succede al grafico dopo: si restringe solo alle cinque regioni di January, oppure mostra ancora tutte e quindici le righe comprese quelle appena nascoste da AutoFilter? Questa osservazione è il vero obiettivo di questo esercizio, non solo l'esecuzione del codice.
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
Eseguire questi in ordine: BuildProfitChart, poi FormatProfitChart, poi FilterJanuaryAndRefreshChart. Per il punto 3 in particolare — prestare attenzione a ciò che accade realmente. I grafici di Excel generalmente rispettano un AutoFilter attivo, nascondendo automaticamente le barre delle righe filtrate, anche senza rieseguire SetSourceData. Rieseguirlo qui serve principalmente a confermare che il grafico è ancora correttamente puntato sull'intera colonna — è il filtro stesso che gestisce la visualizzazione, non la chiamata a SetSourceData. Vale la pena testare con il filtro sia attivo che disattivo per vedere la differenza.
Eseguire BuildProfitChart più di una volta crea ogni volta un nuovo grafico senza eliminare quello precedente — quindi diversi grafici finiscono per essere sovrapposti uno sopra l'altro. ChartObjects(1) si riferisce sempre al primo creato, che potrebbe ora essere nascosto sotto una copia più recente. Ecco perché le modifiche di formattazione possono essere eseguite con successo ma sembrare non avere alcun effetto visibile.
Grazie per i tuoi commenti!
Chieda ad AI
Chieda ad AI
Chieda pure quello che desidera o provi una delle domande suggerite per iniziare la nostra conversazione
Automazione dei grafici
I grafici sono forme posizionate sopra un foglio di lavoro e, come tutto il resto in questo capitolo, ogni proprietà che imposteresti manualmente nel riquadro Formato ha un equivalente in VBA.
Creazione di un grafico
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 crea effettivamente la forma del grafico —
Style:=201seleziona uno stile visivo predefinito,XlChartType:=xlColumnClusteredseleziona un grafico a colonne standard, e Left/Top/Width/Height ne determinano posizione e dimensioni sul foglio di lavoro in punti, la stessa unità che Excel utilizza internamente per il posizionamento delle forme; - AddChart2 restituisce in realtà un oggetto Chart, non il contenitore ChartObject che lo circonda — il
.Chart.Parentalla fine di quella riga serve a risalire al contenitore, che è il tipo con cui chartObj è dichiarato; questa particolarità è facile da dimenticare e vale la pena copiarla esattamente; SetSourceDataindica alla forma del grafico, altrimenti vuota, quali dati rappresentare — puntando atbl.ListColumns("Profit").Rangesi rappresenta la colonna Profit su tutte le righe visibili della Tabella;HasTitle = Truedeve essere impostato prima di assegnareChartTitle.Text— provare a impostare il testo del titolo su un grafico che non ha ancora un titolo attivo causerà un errore.
Aggiornamento dei dati del grafico
Quando la tabella sottostante cresce, indirizzare il grafico al nuovo intervallo con SetSourceData invece di eliminarlo e ricostruirlo — questo preserva qualsiasi formattazione manuale già applicata:
Dim cht As Chart
Set cht = ThisWorkbook.Worksheets("Reports").ChartObjects(1).Chart
cht.SetSourceData Source:=tbl.ListColumns("Profit").Range
ChartObjects(1) si riferisce alla prima forma grafico sul foglio in base alla posizione — va bene quando c'è un solo grafico, ma diventa fragile nel momento in cui viene aggiunto un secondo grafico, poiché "primo" può silenziosamente significare qualcosa di diverso dopo. Fare riferimento a un grafico tramite un nome impostato esplicitamente (chartObj.Name = "ProfitChart", poi ChartObjects("ProfitChart")) è più robusto quando un foglio contiene più di un grafico.
Formattazione dei grafici
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) è la prima (e qui unica) serie di dati rappresentata — il suo Format.Fill.ForeColor.RGB determina il colore effettivo delle barre, utilizzando la stessa funzione RGB(...) degli esempi di formattazione del Capitolo 1. Axes(xlValue) si riferisce specificamente all'asse numerico (in contrapposizione a xlCategory, l'asse che elenca i nomi delle regioni) — applicare NumberFormat qui controlla come vengono visualizzati i numeri lungo quell'asse, esattamente come NumberFormat su una cella del foglio. HasLegend = False rimuove completamente la legenda, operazione consigliata quando un grafico ha una sola serie, poiché una legenda che spiega un solo colore aggiunge confusione senza fornire informazioni.
Attività
- Eseguire
BuildProfitCharte verificare che venga visualizzato un grafico a colonne che mostra il Profit per tutte e quindici le righe (tutti e tre i mesi, non filtrati). - Aggiungere tre righe per colorare le barre del grafico di verde scuro (RGB(24,106,60)) e rimuovere la legenda, come mostrato sopra.
- Filtrare tblReports solo per gennaio e rieseguire
SetSourceDatasutbl.ListColumns("Profit").Range— osservare se il grafico rispetta il filtro.
1. Esecuzione di BuildProfitChart
- Copiare la
Subesattamente come mostrato nel capitolo ed eseguirla — non sono necessarie modifiche per questa parte. - Si dovrebbe vedere un grafico apparire nel foglio Reports che traccia il Profit per ogni riga attualmente visibile nella tabella.
2. Colorazione delle barre e rimozione della legenda
- Entrambe le proprietà appartengono all'oggetto chart, non al foglio di lavoro —
chartObj.Chartè il punto di accesso, come nell'esempio di formattazione nel capitolo. - Il colore delle barre si trova su
SeriesCollection(1), poiché viene tracciata solo una serie di dati (Profit) —.Format.Fill.ForeColor.RGBè la proprietà specifica da impostare. - La rimozione della legenda è una singola proprietà booleana (
HasLegend), separata dalla riga del colore di riempimento.
3. Filtraggio e ri-esecuzione di SetSourceData
- Applicare un
AutoFiltersu Month (Field:=1) limitato a "January" — la stessa tecnica della sezione 4.2. - Quindi chiamare nuovamente
SetSourceDatacon la stessa espressionetbl.ListColumns("Profit").RangediBuildProfitChart— non è necessario modificare quella riga. - Osservare attentamente cosa succede al grafico dopo: si restringe solo alle cinque regioni di January, oppure mostra ancora tutte e quindici le righe comprese quelle appena nascoste da AutoFilter? Questa osservazione è il vero obiettivo di questo esercizio, non solo l'esecuzione del codice.
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
Eseguire questi in ordine: BuildProfitChart, poi FormatProfitChart, poi FilterJanuaryAndRefreshChart. Per il punto 3 in particolare — prestare attenzione a ciò che accade realmente. I grafici di Excel generalmente rispettano un AutoFilter attivo, nascondendo automaticamente le barre delle righe filtrate, anche senza rieseguire SetSourceData. Rieseguirlo qui serve principalmente a confermare che il grafico è ancora correttamente puntato sull'intera colonna — è il filtro stesso che gestisce la visualizzazione, non la chiamata a SetSourceData. Vale la pena testare con il filtro sia attivo che disattivo per vedere la differenza.
Eseguire BuildProfitChart più di una volta crea ogni volta un nuovo grafico senza eliminare quello precedente — quindi diversi grafici finiscono per essere sovrapposti uno sopra l'altro. ChartObjects(1) si riferisce sempre al primo creato, che potrebbe ora essere nascosto sotto una copia più recente. Ecco perché le modifiche di formattazione possono essere eseguite con successo ma sembrare non avere alcun effetto visibile.
Grazie per i tuoi commenti!