VBA已存在图表数据范围修改问题:动态选取列至无数据
问题分析与修正代码
原代码问题
- 依赖
Select和ActiveChart:这种方式不稳定,一旦操作中焦点切换,ActiveChart就会指向错误对象。 - 数据源参数错误:
SetSourceData需要传入Range对象,但原代码传入的是列号(数值类型),类型不匹配导致报错。 - 动态范围逻辑错误:
Range("B22:B23").End(xlToRight)如果B22:B23右侧无数据,会直接跳到工作表最后一列,无法正确定位实际有数据的列边界。
修正后的代码
Sub GraphData() Dim chrtObj As ChartObject Dim dataSheet As Worksheet Dim lastCol As Long Dim dataRange As Range ' 直接引用目标图表对象,避免Select/ActiveChart Set chrtObj = Sheets("ICB Time Series").ChartObjects("Chart1a") ' 引用数据工作表 Set dataSheet = Sheets("Charts Data") ' 从第22行最右侧往左找最后一个非空列的列号 lastCol = dataSheet.Cells(22, dataSheet.Columns.Count).End(xlToLeft).Column ' 构建动态数据范围:B22到lastCol列的22-23行 Set dataRange = dataSheet.Range(dataSheet.Cells(22, 2), dataSheet.Cells(23, lastCol)) ' 设置图表数据源 chrtObj.Chart.SetSourceData Source:=dataRange End Sub
关键修正点
- 直接通过
ChartObjects("Chart1a")获取图表对象并访问其Chart属性,完全避免激活/选中操作,稳定性更高。 - 用
Cells(22, Columns.Count).End(xlToLeft)精准定位第22行最后一个非空列的边界,不会出现无数据时跳至表尾的问题。 - 明确构建
Range对象作为数据源,确保参数类型匹配SetSourceData的要求。
内容的提问来源于stack exchange,提问作者fp2000
相关产品推荐
相关产品推荐

