在工作表中嵌入图表-VBA:Chart.SetSourceData代码报错求助
排查VBA图表数据源报错的问题
看起来你的代码之前运行正常,现在突然在ch2016.Chart.SetSourceData ActiveSheet.Range("A19").CurrentRegion这行报错,而且你没修改过代码——这种情况基本都是数据源本身的问题,或者代码依赖的工作表状态变了。下面给你列几个最可能的原因和解决办法:
1. A19所在的CurrentRegion无效
CurrentRegion会选中从指定单元格开始的连续数据块,但如果出现以下情况就会报错:
- A19单元格是空的,或者这个区域里没有能被图表识别的有效数据(比如全是文本、空值)
- 数据透视表更新后,原来的A19位置不再是有效数据区域的起点,导致
CurrentRegion选中了空区域或不符合图表要求的范围
解决步骤:
- 打开"statistics"工作表,选中A19,按
Ctrl+*(星号),看看选中的区域是不是你预期的数据源范围 - 如果选中的区域不对,说明数据透视表的结构变了,你需要重新确认正确的数据源起始单元格,或者直接引用数据透视表的范围(见下面的方法)
2. 数据透视表结构或位置变化
因为你是基于数据透视表创建图表,透视表刷新或布局调整后,数据区域的位置可能偏移,原来的A19可能已经不在数据块里了。
更稳妥的写法:直接引用数据透视表的整个区域,而不是固定单元格+CurrentRegion,比如:
Sub Opgave4() Dim wsStats As Worksheet Dim ch2015 As Shape Dim ch2016 As ChartObject Dim ch2017 As ChartObject Dim pt2016 As PivotTable ' 对应2016数据的透视表 Set wsStats = ThisWorkbook.Worksheets("statistics") ' 替换成你实际的2016数据透视表名称 Set pt2016 = wsStats.PivotTables("PivotTable2016") Set ch2015 = wsStats.Shapes.AddChart(Left:=0, Top:=0, Width:=450, Height:=200) Set ch2016 = wsStats.ChartObjects.Add(Left:=450, Top:=0, Width:=450, Height:=200) Set ch2017 = wsStats.ChartObjects.Add(Left:=900, Top:=0, Width:=450, Height:=200) ch2015.Chart.SetSourceData wsStats.Range("A2").CurrentRegion ch2016.Chart.SetSourceData Source:=pt2016.TableRange1 ' 直接引用透视表范围 ch2017.Chart.SetSourceData wsStats.Range("G1").CurrentRegion End Sub
TableRange1会引用透视表的整个数据区域(包括行/列标签和数值),不管透视表怎么调整,都能准确获取数据源。
3. 代码依赖ActiveSheet导致的错误
你的代码用了ActiveSheet.Select和ActiveSheet.Range,如果运行代码时激活的不是"statistics"工作表,那引用的A19就不是你要的那个表的单元格,自然会报错。
优化写法:直接指定工作表对象,彻底摆脱对ActiveSheet的依赖:
Sub Opgave4() Dim wsStats As Worksheet Dim ch2015 As Shape Dim ch2016 As ChartObject Dim ch2017 As ChartObject ' 直接绑定目标工作表,避免ActiveSheet的不确定性 Set wsStats = ThisWorkbook.Worksheets("statistics") Set ch2015 = wsStats.Shapes.AddChart(Left:=0, Top:=0, Width:=450, Height:=200) Set ch2016 = wsStats.ChartObjects.Add(Left:=450, Top:=0, Width:=450, Height:=200) Set ch2017 = wsStats.ChartObjects.Add(Left:=900, Top:=0, Width:=450, Height:=200) ch2015.Chart.SetSourceData wsStats.Range("A2").CurrentRegion ch2016.Chart.SetSourceData wsStats.Range("A19").CurrentRegion ch2017.Chart.SetSourceData wsStats.Range("G1").CurrentRegion End Sub
这样不管当前激活的是哪个工作表,代码都会准确操作"statistics"表,避免因激活错误导致的数据源引用问题。
4. 临时状态异常
如果上面的方法都没用,试试:
- 删除"statistics"表中已有的图表,重新运行代码
- 重启Excel,清除可能的缓存异常
内容的提问来源于stack exchange,提问作者yomomo
相关产品推荐
相关产品推荐

