Автоматизація діаграм
Свайпніть щоб показати меню
Діаграми є фігурами, розташованими поверх аркуша, і, як і все інше в цьому розділі, кожна властивість, яку ви встановлюєте вручну у вікні форматування, має еквівалент у VBA.
Створення діаграми
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 створює саму фігуру діаграми —
Style:=201вибирає вбудований візуальний стиль,XlChartType:=xlColumnClusteredвибирає стандартну стовпчикову діаграму, а Left/Top/Width/Height визначають її розташування та розмір на аркуші у пунктах, саме в тих одиницях, які Excel використовує для розміщення фігур; - AddChart2 насправді повертає об'єкт Chart, а не контейнер ChartObject навколо нього —
.Chart.Parentнаприкінці цього рядка повертає нас до контейнера, типу якого оголошено chartObj; цю особливість легко забути, тому варто копіювати цей рядок точно; SetSourceDataвказує порожній фігурі діаграми, які дані потрібно відобразити — посилання наtbl.ListColumns("Profit").Rangeозначає, що буде побудовано графік по стовпцю Profit для всіх видимих рядків таблиці;HasTitle = Trueпотрібно встановити перед присвоєннямChartTitle.Text— спроба задати текст заголовка для діаграми, у якої ще не увімкнено заголовок, призведе до помилки.
Оновлення даних діаграми
Коли основна таблиця збільшується, вкажіть діаграмі новий діапазон за допомогою SetSourceData замість видалення та створення її заново — це зберігає всі застосовані вручну формати:
Dim cht As Chart
Set cht = ThisWorkbook.Worksheets("Reports").ChartObjects(1).Chart
cht.SetSourceData Source:=tbl.ListColumns("Profit").Range
ChartObjects(1) означає першу фігуру діаграми на аркуші за позицією — це підходить, коли діаграма лише одна, але стає ненадійним, якщо додати другу, оскільки "перша" може означати вже інший об'єкт. Звертатися до діаграми за іменем, яке ви явно задали (chartObj.Name = "ProfitChart", потім ChartObjects("ProfitChart")), набагато надійніше, якщо на аркуші кілька діаграм.
Форматування діаграм
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) — це перший (і тут єдиний) ряд даних, який відображається на діаграмі; його Format.Fill.ForeColor.RGB визначає колір стовпчиків, використовуючи ту ж функцію RGB(...), що й у прикладах форматування з Розділу 1. Axes(xlValue) означає саме числову вісь (на відміну від xlCategory, осі з назвами регіонів) — застосування NumberFormat тут контролює вигляд чисел на цій осі, так само як NumberFormat у клітинці аркуша. HasLegend = False повністю прибирає легенду, що варто робити, якщо діаграма містить лише один ряд даних, оскільки легенда для одного кольору лише захаращує простір без додаткової інформації.
Завдання
- Запустіть
BuildProfitChartі переконайтеся, що з'явилася стовпчикова діаграма з показником Profit для всіх п'ятнадцяти рядків (усі три місяці, без фільтрації). - Додайте три рядки для зафарбовування стовпчиків діаграми темно-зеленим кольором (RGB(24,106,60)) та видалення легенди, як показано вище.
- Відфільтруйте tblReports лише за січнем і повторно виконайте
SetSourceDataдляtbl.ListColumns("Profit").Range— зверніть увагу, чи враховує діаграма фільтр.
1. Запуск BuildProfitChart
- Скопіюйте
Subточно так, як показано в розділі, і запустіть — для цієї частини змін не потрібно. - Ви побачите діаграму на аркуші Reports, яка будує графік прибутку для кожного рядка, що наразі відображається в таблиці.
2. Зміна кольору стовпців і видалення легенди
- Обидві властивості належать об'єкту діаграми, а не аркушу —
chartObj.Chartє точкою входу, як і у прикладі форматування в розділі. - Колір стовпців задається на
SeriesCollection(1), оскільки відображається лише один ряд даних (Profit) —.Format.Fill.ForeColor.RGBце конкретна властивість для встановлення кольору. - Видалення легенди — це окрема булева властивість (
HasLegend), не пов'язана з рядком встановлення кольору.
3. Фільтрація та повторний запуск SetSourceData
- Застосуйте
AutoFilterдо Month (Field:=1) з обмеженням на "January" — та ж техніка, що й у розділі 4.2. - Потім викличте
SetSourceDataще раз з тією ж самою конструкцієюtbl.ListColumns("Profit").RangeзBuildProfitChart— цей рядок змінювати не потрібно. - Уважно спостерігайте, що відбувається з діаграмою після цього: чи зменшується вона лише до п’яти регіонів січня, чи все ще показує всі п’ятнадцять рядків, включаючи ті, які AutoFilter щойно приховав? Саме це спостереження і є основною метою завдання, а не просто запуск коду.
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
Виконуйте ці макроси у такому порядку: BuildProfitChart, потім FormatProfitChart, потім FilterJanuaryAndRefreshChart. Для пункту 3 — зверніть увагу на результат. Діаграми Excel зазвичай враховують активний AutoFilter, автоматично приховуючи стовпці для відфільтрованих рядків навіть без повторного запуску SetSourceData. Повторний виклик тут лише підтверджує, що діаграма все ще прив’язана до повної колонки — саме фільтр відповідає за візуальне приховування, а не виклик SetSourceData. Варто протестувати з фільтром увімкненим і вимкненим, щоб побачити різницю самостійно.
Запуск BuildProfitChart більше одного разу створює нову діаграму щоразу, не видаляючи попередню — у результаті кілька діаграм накладаються одна на одну. ChartObjects(1) завжди посилається на першу створену діаграму, яка може бути прихована під новішою копією. Саме тому зміни форматування можуть виконуватися успішно, але не відображатися візуально.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат