添加数据系列后如何刷新/重绘Excel图表?
向选中图表添加数据系列的VBA刷新问题(Excel 2013/2016)
我编写了一段VBA代码,用于给选中的现有图表添加新数据系列,代码如下:
Sub AddSeriesToSelectedChart() Dim chartObj As ChartObject Dim chartSeries As Series If Not TypeOf Selection Is ChartObject Then MsgBox "Please select a chart first." Exit Sub End If Set chartObj = Selection Set chartSeries = chartObj.Chart.SeriesCollection.NewSeries chartSeries.Values = Range("B2:B10") chartSeries.XValues = Range("A2:A10") chartSeries.Name = "Average line" End Sub
实际使用中发现,这段代码能成功添加数据系列,但在Excel 2013和2016版本中,新系列不会立刻显示——必须手动调出xlDialogChartSourceData对话框,或者保存文件后重新打开,图表才会刷新显示新系列。数据和系列实际已经存在,但图表就是不渲染。
我试过以下方法都没用:
- 调用图表的
.Refresh()方法 - 重新计算工作表或工作簿数据
- 通过修改图表属性尝试触发重绘
- 想过用代码调出刷新对话框再关闭,但该对话框需要用户操作,没有
.Close()方法,无法实现
O365个人订阅版本中一切正常,只有2013/2016版本存在此问题,求解决思路和帮助。
可行解决方法
针对Excel 2013/2016的这个渲染BUG,推荐尝试以下几种方案:
- 强制调整图表容器触发重绘
通过临时修改图表的宽度或高度,触发UI重绘机制,之后再恢复原尺寸:
' 在添加完数据系列后插入这段代码 Dim originalWidth As Double originalWidth = chartObj.Width chartObj.Width = originalWidth + 1 chartObj.Width = originalWidth
- 重新绑定图表数据源
模拟手动调出数据源对话框的刷新逻辑,直接通过代码重新设置图表数据源,注意要包含所有系列的完整数据范围:
' 添加完系列后执行 Dim fullSourceRange As Range ' 根据实际情况设置包含所有系列数据的范围 Set fullSourceRange = Range("A1:C10") chartObj.Chart.SetSourceData Source:=fullSourceRange
- 调用Chart.Dirty方法
部分旧版本Excel中,.Dirty方法可以标记图表需要重绘,触发后台刷新:
chartObj.Chart.Dirty
- 切换激活状态触发刷新
通过激活图表所在工作表,再激活图表本身,强制UI更新:
chartObj.Parent.Activate chartObj.Activate
整合重绘逻辑的完整代码示例
以第一种方案为例,优化后的完整代码如下:
Sub AddSeriesToSelectedChart() Dim chartObj As ChartObject Dim chartSeries As Series Dim originalWidth As Double If Not TypeOf Selection Is ChartObject Then MsgBox "请先选中一个图表。" Exit Sub End If Set chartObj = Selection Set chartSeries = chartObj.Chart.SeriesCollection.NewSeries chartSeries.Values = Range("B2:B10") chartSeries.XValues = Range("A2:A10") chartSeries.Name = "平均线" ' 强制重绘,解决Excel 2013/2016显示问题 originalWidth = chartObj.Width chartObj.Width = originalWidth + 1 chartObj.Width = originalWidth End Sub
内容的提问来源于stack exchange,提问作者Kon
相关产品推荐
相关产品推荐

