Excel录制的宏在新工作表运行时报-2147024809指定值超出范围
Excel宏运行时报"-2147024809 (80070057)"错误解决方案
报错根本原因
触发错误的核心原因有两个:
- 硬编码的形状名
"Chart 1"不可靠:Excel每次新建图表都会自动递增命名,只有首次运行时新插入的图表才叫Chart 1,后续运行时新图表名称会变成Chart 2、Chart 3等,ActiveSheet.Shapes("Chart 1")找不到对应对象就会触发值越界错误。 ActiveChart替换方法错误:ActiveChart本身就是图表对象,不需要再通过Shapes集合引用,你之前的替换逻辑依然套用了Shapes()的调用规则,自然无法生效。
修复方案
最稳定的写法是给图表定义对象变量,完全不依赖硬编码名称和Select操作,核心修改步骤如下:
- 在插入图表的代码前声明图表对象变量
- 把新建的图表赋值给变量,后续所有图表操作直接调用该变量
- 删除原来所有引用
Shapes("Chart 1")的代码,替换为对象变量操作
核心修改代码示例
' 原来的插入图表代码 ' ActiveSheet.Shapes.AddChart2(251, xlPie).Select ' 替换为下面两行 Dim myChart As Chart Set myChart = ActiveSheet.Shapes.AddChart2(251, xlPie).Chart ' 后面所有原本用ActiveChart、Selection、Shapes("Chart 1")的操作都可以直接用myChart,比如: myChart.SetSourceData Source:=Range("Sheet1!$A$3:$B$8") myChart.SetElement msoElementDataLabelBestFit ' ... 省略中间原有图表配置代码 ... ' 原来报错的4行代码,直接替换为: myChart.ChartArea.Format.TextFrame2.TextRange.Font.Size = 12 With myChart.ChartArea.Format.TextFrame2.TextRange.Font .NameComplexScript = "Times New Roman" .NameFarEast = "Times New Roman" .Name = "Times New Roman" .Bold = msoTrue With .Fill .Visible = msoTrue .ForeColor.ObjectThemeColor = msoThemeColorText1 .ForeColor.TintAndShade = 0 .ForeColor.Brightness = 0 .Transparency = 0 .Solid End With End With ' 后续移动图表、页面设置等操作也可以用myChart,对象依然有效 myChart.Location Where:=xlLocationAsNewSheet With myChart.PageSetup ' ... 原有页面配置代码 ... End With
额外优化建议
录制宏生成的代码包含大量冗余的Select、Selection操作,你可以直接把Select+Selection.xxx的写法合并为对象直接调用,比如:
- 原代码:
Rows("2:2").Select: Selection.ClearContents: Selection.Delete Shift:=xlUp - 优化后:
Rows("2:2").ClearContents: Rows("2:2").Delete Shift:=xlUp
运行速度更快,也能避免切换工作表时的对象引用错误。
内容的提问来源于stack exchange,提问作者EF3328
相关产品推荐
相关产品推荐

