Excel VBA 更新图表系列
Posted
技术标签:
【中文标题】Excel VBA 更新图表系列【英文标题】:Excel VBA Updating Chart Series 【发布时间】:2017-10-04 12:05:25 【问题描述】:我有一个将范围复制到某个单元格并将数据源更改为图表的代码。该图表具有组合图表类型,具有堆叠列和xlLineMarker
与最后一个系列(总计)。系列集合的数量根据用户选择(2个或更多)而有所不同。
它可以工作,但有时图表不会像所附图像那样完全更新(显示系列名称为“series1,series2,...”的空图表)。发生这种情况时,右键单击图表并单击选择数据,然后只需选择 series1 以外的任何系列即可更新图表。不刷新或重新分配数据源。只需在数据选择窗口中选择“series2”或其他,然后单击“取消”,我怀疑宏没有完全执行...,
我做错了吗?或者有什么方法可以完全更新图表?
Sub chtupdate()
Dim rng As Range
Dim i As Integer
Dim n As Integer
Set rng = Range("G37").CurrentRegion
ActiveSheet.ChartObjects("Chart1").Activate
With ActiveChart
.ChartArea.ClearContents
.SetSourceData Source:=rng, PlotBy:=xlRows
n = ActiveSheet.ChartObjects(1).Chart.SeriesCollection.Count
For i = 1 To n - 1
.SeriesCollection(i).ChartType = xlColumnStacked
Next i
.SeriesCollection(n).ChartType = xlLineMarkers
End With
End Sub
【问题讨论】:
“我怀疑宏没有完全执行” -- 你为什么不通过调试器来验证呢? atm 我想到的唯一建议是 1) 不是Activate
图表(不需要); 2) 在宏期间禁用屏幕更新; 3)由于您在With clause
内,请将n = ActiveSheet.ChartObjects(1).Chart.SeriesCollection.Count
替换为更简单的n = .SeriesCollection.Count
@Danny Yun 在下面我的答案中尝试代码
感谢您的评论。我已经摆脱了激活图表。我确实有代码可以在下面的代码之间禁用和启用屏幕更新代码。我只是没有在这里添加。根据您的建议,我在调试器中使用了“Step In”。问题仍然存在。它起初有效,但第二次失败。我不确定为什么它有时会起作用而不起作用。并感谢有关“.SeriesCollection.Count”的提示。是的,它更干净。无论如何,问题仍然存在。
【参考方案1】:
试试下面的代码,我添加了ChartObject
和Series
对象变量以获得更简单和“更干净”的代码。另外,为了避免使用ActiveSheet
和ActiveChart
- 一种不可靠的方法。
代码
Option Explicit
Sub chtupdate()
Dim MyCht As ChartObject
Dim Ser As Series
Dim Rng As Range
Dim i As Long
Dim n As Long
' fully qualify all your Ranges and Cells
With Worksheets("Sheet3") ' <-- replace "Sheet1| with your sheet's name
Set Rng = .Range("G37").CurrentRegion
' set the chart object
Set MyCht = .ChartObjects("Chart1")
End With
With MyCht
.Chart.ChartArea.ClearContents
.Chart.SetSourceData Source:=Rng, PlotBy:=xlRows
For Each Ser In .Chart.SeriesCollection
Ser.ChartType = xlColumnStacked
Next Ser
' modify the last one
Set Ser = .Chart.SeriesCollection(.Chart.SeriesCollection.Count)
Ser.ChartType = xlLineMarkers
End With
End Sub
【讨论】:
谢谢。但它仍然是一样的。我有一张带有一张数据透视表、一张普通表(在转置视图中复制的数据透视表)、一张图表的多张工作表。我将数据透视表复制到常规表的原因是数据透视图在 Mac Excel 中不起作用。所以我将数据透视表复制到选定的范围,并将这个复制的范围设置为图表数据源。 每张工作表都有一个或多个下拉按钮。通过选择这些下拉按钮,数据透视表得到更新(删除现有行字段并将选定字段添加到行字段/删除现有值项将选定值项添加到值字段/删除现有列字段并将选定字段添加到列字段)。 所以,我有一个代码 addRow()、addColumn() 和 addValue()。这些代码分配给“下拉”按钮。然后,一旦数据透视表得到更新,我就会在 Worksheet_PivotTableUpdate 事件中调用 copyPivotTable() 和 chtupdate() 代码。我使用此事件触发“chtupdate”的原因是切片器。我正在使用切片器进行过滤,但我无法将宏分配给切片器,因此我使用数据透视表更新事件。这是我使用 ActiveSheet 而不是工作表名称的原因之一。 (在 Mac 上,工作表事件不起作用,所以我又添加了一个按钮来执行“复制枢轴”和“chtupdate”) 顺便说一句,您更新图表的代码非常干净。谢谢你。但它仍然做同样的事情。当我将下拉列表从一个切换到另一个时,它会起作用。但它有时也有同样的问题。它会完全更新图表,有时会显示带有“series1”、“series2”......的空白图表,如果我再次打开选择数据弹出窗口并选择“series1”以外的系列,则图表会完全更新。以上是关于Excel VBA 更新图表系列的主要内容,如果未能解决你的问题,请参考以下文章
无法在 Excel 2007 VBA 中使用 Option Strict Off 进行后期绑定