VBA - Dynami c Графики - PullRequest
       0

VBA - Dynami c Графики

1 голос
/ 17 января 2020

У меня есть действительно полезный фрагмент кода VBA, который создает динамические c диаграммы в зависимости от того, сколько строк данных заполнено набором данных пользователей.

With Sheets("DynamicCharts")
    LastRow = .Range("R" & .Rows.Count).END(xlUp).row
    Set Rng1 = .Range("R2:R" & LastRow & ", S2:S" & LastRow)
    ShName = .Name
End With
With Sheets("Property Details").ChartObjects("Year").Chart
    .SetSourceData Source:=Rng1
End With

Однако я заметил, что когда у меня есть значения только одной строки (см. ниже):

enter image description here

мой фрагмент кода не читает название категории. Он заполняет диаграмму 1, а не именем (см. Ниже)

enter image description here

Я подозреваю, что именно так он устанавливает диапазон:

Set Rng1 = .Range("R2:R" & LastRow & ", S2:S" & LastRow)

и ему не нравится "R2: R2" на графике, но я не уверен, как вы строите работу вокруг в

Спасибо

1 Ответ

3 голосов
/ 17 января 2020

Проблема - почему это так?

Если вы установите источник данных с помощью .SetSourceData Source:=, вы фактически позволите Excel угадать, как расположены данные в этом диапазоне. Если в этом диапазоне более одной строки, то Excel может проанализировать и угадать это довольно хорошо.

Но только с одной строкой данных Excel не может правильно определить, какой из текстовых данных является заголовком диаграммы, а какое имя строки / категории.

Решение проблемы…

Что означает, что вы должны быть более точными в своем определении.

Например, если вы включите строку 1, угадывание станет немного лучше:

Set Rng1 = .Range("R1:R" & LastRow & ", S1:S" & LastRow)

, но затем название диаграммы и название категории перейдут к стандартному Excel и результат:

enter image description here
Изображение 1: Перевернуты название диаграммы и название категории. Предположение Excel не было ожидаемым результатом.

Если вы точнее и точно сообщите Excel, какие данные находятся в этом диапазоне, вы получите точный результат:

With Sheets("Property Details").ChartObjects("Year").Chart
    .SetSourceData Source:=Rng1
    .FullSeriesCollection(1).Name = "='" & ShName & "'!$S$1"                     '≙ "=DynamicCharts!$S$1"
    .FullSeriesCollection(1).Values = "='" & ShName & "'!$S$2:$S$" & LastRow     '≙ "=DynamicCharts!$S$2:$S$" & LastRow
    .FullSeriesCollection(1).XValues = "='" & ShName & "'!$R$2:$R$" & LastRow    '≙ "=DynamicCharts!$R$2:$R$" & LastRow
End With

enter image description here
Изображение 2: с точным определением, где находятся данные, Excel не нужно угадывать, и вы получите желаемый результат.

Заключение

Excel очень терпелив, если вы не даете точных указаний, что именно делать. Так что он будет угадывать и представлять результат (который может быть не тем, что вы ожидали). Но чем точнее вы даете инструкции, тем меньше догадок Excel и тем точнее и надежнее результат.

Лучшая практика: всегда будьте максимально точными, чтобы избежать неожиданностей:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...