You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:51:01