VBA循环运行一次后rng1、rng2对象被销毁提示Object Required的原因
VBA循环中Range对象异常销毁的原因分析
常见触发原因
- 调用的目标函数操作了Range的父容器:你通过
Application.Run执行的函数中,如果删除了rng1/rng2所属的工作表、关闭了这两个Range对象所属的工作簿,或者把Range对应的单元格区域整段删除,Range对象失去依附的父对象就会自动销毁,所有属性变为<Object Required>。 - 公共变量被意外重置:如果
rng1、rng2不是当前过程的局部变量,而是模块级/全局变量,你调用的函数中如果显式执行了Set rng1 = Nothing/Set rng2 = Nothing,或者触发了VBA工程的状态重置(比如运行时出错未处理、执行了中断操作),都会直接清空这两个对象的引用。 - Range引用基于动态对象赋值:如果你给
rng1/rng2赋值时依赖ActiveSheet、Selection这类动态活动对象,被调用的函数如果切换了活动窗口、修改了选区,也可能导致原有Range引用丢失。
修复方案
- 优先把Range的值提前转存为数组,不依赖对象引用:
Set rng1 = some range Set rng2 = some range ' 提前转数组,后续直接遍历数组即可 Dim arr1, arr2 arr1 = rng1.Value arr2 = rng2.Value Set rng1 = Nothing ' 后续不需要Range对象,可提前释放 Set rng2 = Nothing For i = LBound(arr1,1) To UBound(arr1,1) For j = LBound(arr2,1) To UBound(arr2,1) Dim wb As Workbook Set wb = some workbook wb.Worksheets("Setup").Cells(1, 1).Value = arr1(i, 1) wb.Worksheets("Setup").Cells(1, 2).Value = arr2(j, 1) Application.Run some function Next j Next i
- 检查被调用的函数逻辑,禁止在函数中修改
rng1/rng2的引用,也不要操作两个Range所属的工作簿、工作表对象。 - 给Range赋值时显式指定所属的工作簿和工作表,避免使用
ActiveSheet这类动态对象,例如:Set rng1 = ThisWorkbook.Worksheets("数据源").Range("A1:A20")。
内容的提问来源于stack exchange,提问作者hopil95479
相关产品推荐
相关产品推荐

