You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在工作表中嵌入图表-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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:57:07