VBA将Range赋值给数组时报应用程序或对象定义错误如何解决
问题根因
- 报错的核心原因是构造Range对象时内部的
Cells()未显式绑定父工作表,产生了跨工作表引用冲突:
你代码里的Range对象已经明确归属wkbOVHFile.Sheets(szAOPPage),但Range参数里的两个Cells()如果没有指定所属工作表,默认会指向当前活动工作簿的活动工作表。如果此时活动工作表不是wkbOVHFile.Sheets(szAOPPage),就相当于用A表的单元格坐标去B表构造Range,VBA不支持这种跨表构造逻辑,会直接抛出应用程序/对象定义错误。 - 第二行Copy代码可正常运行的原因:
你测试Copy代码时,刚好szAOPPage是当前活动工作表,Cells()的默认父对象和Range的父对象匹配,所以没有触发报错,实际上这行代码也存在相同的逻辑隐患,切换活动工作表后同样会报错。 - 添加
.Value无效的原因:
报错发生在Range对象的构造阶段,还没到读取Range值的步骤,因此修改Value属性无法解决问题。
修复方案
推荐使用With块统一绑定父对象,写法更简洁也避免遗漏:
With wkbOVHFile.Sheets(szAOPPage) arrActuals = .Range(.Cells(iStartCopy, IntActOVHCol), .Cells(iEndCopy, IntActOVHCol)).Value End With
也可以通过单元格地址构造Range避开父对象冲突:
arrActuals = wkbOVHFile.Sheets(szAOPPage).Range(Cells(iStartCopy, IntActOVHCol).Address, Cells(iEndCopy, IntActOVHCol).Address).Value
补充注意:如果最终构造的Range仅包含1个单元格,VBA不会自动将值转为数组,只会返回单个Variant类型值,此时也可能触发类型不匹配错误,你可以在赋值前先判断范围的单元格数量是否大于1,或者统一用
arrActuals = Array(.Range(...).Value)兼容单单元格场景。
内容的提问来源于stack exchange,提问作者RS123
相关产品推荐
相关产品推荐

