首页 > 解决方案 > VBA - 动态图表

问题描述

我有一段非常有用的 VBA 代码,它根据用户数据集填充的数据行数创建动态图表。

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

但是我注意到,当我只有一行的值时(见下文):

在此处输入图像描述

我的一段代码没有读取类别名称。它使用 1 而不是名称填充图表(见下文)

在此处输入图像描述

我怀疑它是如何设置范围的:

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

并且它不喜欢图表中的“R2:R2”,但我不确定您如何在

谢谢

标签: excelvba

解决方案


问题 - 为什么会这样?

如果您设置数据源,.SetSourceData Source:=实际上让 Excel 猜测该范围内的数据是如何排列的。如果在那个范围内不止一行,那么 Excel 可以分析和猜测得很好。

但是只有一行数据 Excel 无法正确确定图表标题是哪个文本数据以及哪个行/类别名称。

解决它...</h3>

这意味着您的定义必须更加精确。

例如,如果您包含第 1 行,则猜测会更好一些:

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

但随后图表标题和类别名称翻转为 Excel 的默认值,结果为:

在此处输入图像描述
图 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

在此处输入图像描述
图 2:通过精确定义哪些数据在哪里,Excel 无需猜测即可获得所需的结果。

结论

如果您没有给出确切的指示,Excel 会非常有耐心。所以它会猜测并给出一个结果(这可能不是你所期望的)。但是你给出的指令越精确,Excel 的猜测就越少,结果就越精确和可靠。

最佳实践:始终尽可能精确以避免意外:)


推荐阅读