excel - VBA - 动态图表

标签 excel 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

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

enter image description here

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

enter image description here

我怀疑它是如何设置范围的:
Set Rng1 = .Range("R2:R" & LastRow & ", S2:S" & LastRow)

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

谢谢

最佳答案

问题 - 为什么会这样?

如果将数据源设置为 .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 的猜测就越少,结果就越精确和可靠。

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

关于excel - VBA - 动态图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59787471/

相关文章:

json - 如何正确将JSON导入Excel

c# - 如何将特定 Excel 单元格值导入到 C# 中的现有 datagridview 单元格

excel - VBA 如何确定是否隐式使用默认属性?

vba - 为什么 VBA 中的 VLookup 失败并出现运行时错误 1004?

excel - 如何检查列表框的一行是否为空

ms-access - 在Access VBA中获取Combobox.Value

vba - 如何使用 VBA 进行 VLookup 比较 2 个不同的表并删除单元格表匹配的行?

按财政年度的 SQL 组数据

python - Python 中的索引匹配等效项

excel - ssrs报告导出到excel(公式)