VBA跨表设置动态图表数据源触发错误1004问题咨询
VBA跨表绑定图表数据源报1004错误修复
错误原因
报错核心是隐式工作表引用错位:
- 执行
GraphUpdate过程时,代码首先激活了View工作表,所有未显式指定父工作表的Cells()调用,默认会指向当前活动的View工作表 - 原代码中
Worksheets("DataSheet").Range(Cells(2, 5), Cells(endRowNo, 5))逻辑上要读取DataSheet的单元格范围,但Range内部传入的两个Cells参数实际归属于View表,VBA不允许Range对象的父工作表和其参数单元格的父工作表不一致,直接触发1004错误。
修正方案
所有单元格、范围、图表对象都采用显式引用,不要依赖Activate、ActiveSheet、ActiveChart这类随操作上下文变化的隐式对象,从根源避免引用错位。
修正后的GraphUpdate过程代码如下:
Sub GraphUpdate(endRowNo As Long) Dim dataSht As Worksheet, viewSht As Worksheet ' 直接绑定工作表对象,无需激活工作表 Set dataSht = ThisWorkbook.Worksheets("DataSheet") Set viewSht = ThisWorkbook.Worksheets("View") ' 直接引用图表对象,无需激活图表 With viewSht.ChartObjects("BarChart").Chart .SeriesCollection(1).Name = "ValueA" ' 所有Cells显式绑定到DataSheet,和Range父对象保持一致 .SeriesCollection(1).XValues = dataSht.Range(dataSht.Cells(2, 5), dataSht.Cells(endRowNo, 5)) .SeriesCollection(1).Values = dataSht.Range(dataSht.Cells(2, 6), dataSht.Cells(endRowNo, 6)) .SeriesCollection(2).Name = "ValueB" .SeriesCollection(2).XValues = dataSht.Range(dataSht.Cells(2, 5), dataSht.Cells(endRowNo, 5)) .SeriesCollection(2).Values = dataSht.Range(dataSht.Cells(2, 7), dataSht.Cells(endRowNo, 7)) End With End Sub
其余
GetEndRowCountNo、SortDate过程也可以参考同样的显式引用逻辑优化,去掉不必要的Activate调用,进一步降低代码出错概率。
原问题完整代码参考
Sub Button_Click() Dim endRowNo As Long endRowNo = GetEndRowCountNo() SortDate (endRowNo) GraphUpdate (endRowNo) End Sub Function GetEndRowCountNo() As Long Worksheets("DataSheet").Activate Dim endRowNo As Long For endRowNo = Cells(Rows.Count, "A").End(xlUp).Row To 1 Step -1 If Cells(endRowNo, "A") <> "" Then Exit For Next endRowNo GetEndRowCountNo = endRowNo End Function Sub SortDate(endRowNo As Long) Worksheets("DataSheet").Activate ActiveSheet.Sort.SortFields.Clear ActiveSheet.Sort.SortFields.Add _ Key:=ActiveSheet.Cells(1, 1), _ SortOn:=xlSortOnValues, _ Order:=xlAscending, _ DataOption:=xlSortNormal With ActiveSheet.Sort .SetRange Range(Cells(1, 1), Cells(endRowNo, 7)) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub
数据源示例

内容的提问来源于stack exchange,提问作者BTOM
相关产品推荐
相关产品推荐

