Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Вивчайте Автоматизація діаграм | Автоматизація таблиць і звітів
Excel VBA для автоматизації бізнесу

Автоматизація діаграм

Свайпніть щоб показати меню

Діаграми є фігурами, розташованими поверх аркуша, і, як і все інше в цьому розділі, кожна властивість, яку ви встановлюєте вручну у вікні форматування, має еквівалент у VBA.

Рисунок 4.4

Створення діаграми

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
Покроковий розбір коду
expand arrow
  • 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 повністю прибирає легенду, що варто робити, якщо діаграма містить лише один ряд даних, оскільки легенда для одного кольору лише захаращує простір без додаткової інформації.

Завдання

  1. Запустіть BuildProfitChart і переконайтеся, що з'явилася стовпчикова діаграма з показником Profit для всіх п'ятнадцяти рядків (усі три місяці, без фільтрації).
  2. Додайте три рядки для зафарбовування стовпчиків діаграми темно-зеленим кольором (RGB(24,106,60)) та видалення легенди, як показано вище.
  3. Відфільтруйте tblReports лише за січнем і повторно виконайте SetSourceData для tbl.ListColumns("Profit").Range — зверніть увагу, чи враховує діаграма фільтр.
Підказка
expand arrow

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 щойно приховав? Саме це спостереження і є основною метою завдання, а не просто запуск коду.
Розв'язок
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

Виконуйте ці макроси у такому порядку: BuildProfitChart, потім FormatProfitChart, потім FilterJanuaryAndRefreshChart. Для пункту 3 — зверніть увагу на результат. Діаграми Excel зазвичай враховують активний AutoFilter, автоматично приховуючи стовпці для відфільтрованих рядків навіть без повторного запуску SetSourceData. Повторний виклик тут лише підтверджує, що діаграма все ще прив’язана до повної колонки — саме фільтр відповідає за візуальне приховування, а не виклик SetSourceData. Варто протестувати з фільтром увімкненим і вимкненим, щоб побачити різницю самостійно.

Note
Примітка

Запуск BuildProfitChart більше одного разу створює нову діаграму щоразу, не видаляючи попередню — у результаті кілька діаграм накладаються одна на одну. ChartObjects(1) завжди посилається на першу створену діаграму, яка може бути прихована під новішою копією. Саме тому зміни форматування можуть виконуватися успішно, але не відображатися візуально.

Все було зрозуміло?

Як ми можемо покращити це?

Дякуємо за ваш відгук!

Секція 4. Розділ 4

Запитати АІ

expand

Запитати АІ

ChatGPT

Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат

Секція 4. Розділ 4
some-alt