VBA动态范围求和报错:原正常代码现触发应用程序错误
搞定VBA求和代码的"应用程序或用户定义错误"
问题回顾
你提到一段之前正常运行的VBA求和代码现在触发了"应用程序或用户定义错误",代码如下:
sum_range = Application.Sum(ThisWorkbook.Worksheets("Shifting").Range(Cells(20, col), Cells(rw - 1, col)))
而且你已经找到了问题根源:变量col被赋值为0。
为什么会报错?
Excel的单元格列索引是从1开始的,Cells(20, 0)属于完全无效的单元格引用,自然会触发应用程序错误。接下来我们可以把代码改得更稳健,彻底避免这类问题。
修复&优化方案
这里给你几个实用的修改方向:
添加变量合法性校验
在执行求和逻辑前,先检查col(以及rw)的取值是否合理,提前拦截错误:' 校验col是否为有效列索引,同时确保结束行不小于起始行 If col < 1 Or rw - 1 < 20 Then MsgBox "变量赋值有问题:col得≥1,且结束行要大于等于20哦!" Exit Sub ' 可根据需求替换成其他错误处理逻辑 End If ' 再执行求和操作 sum_range = Application.Sum(ThisWorkbook.Worksheets("Shifting").Range(Cells(20, col), Cells(rw - 1, col)))给单元格绑定明确工作表(更推荐)
原代码中的Cells没有指定所属工作表,如果当前激活的不是"Shifting"工作表,会导致单元格引用指向错误的表,也可能引发意外问题。我们可以明确绑定工作表对象,让代码更可靠:Dim shiftWs As Worksheet Set shiftWs = ThisWorkbook.Worksheets("Shifting") ' 先做合法性校验 If col < 1 Or rw - 1 < 20 Then MsgBox "单元格范围无效,请检查col或rw的赋值!" Exit Sub End If ' 所有Cells都明确关联到shiftWs工作表 sum_range = Application.Sum(shiftWs.Range(shiftWs.Cells(20, col), shiftWs.Cells(rw - 1, col)))简化动态范围的写法
如果你觉得Range(Cells(...), Cells(...))的写法有点繁琐,可以用Resize函数来简化动态范围的定义:' 从第20行开始,向下扩展(rw-20)行,列数保持1列 sum_range = Application.Sum(shiftWs.Cells(20, col).Resize(rw - 20, 1))
额外小提示
- 你可以根据需求选择
Application.Sum或WorksheetFunction.Sum:前者遇到错误会返回错误值(比如#VALUE!),后者会直接触发VBA运行时错误,方便你用On Error语句捕获处理。
内容的提问来源于stack exchange,提问作者user14296107
相关产品推荐
相关产品推荐

