VBA跨工作表复制数据时出现Application-defined or object-defined error求助
解决VBA跨工作表复制时的Application-defined or object-defined error
嘿,我来帮你排查这个报错问题!你的核心问题出在没有明确指定Cells对象所属的工作表,这是VBA跨工作表操作时非常容易踩的坑。
错误根源分析
VBA里如果单独写Cells(row, col),它默认指向当前活动工作表的单元格。但你出错的这行代码:
Set rngDest = wksDest.Range(Cells(i, firstPos))
是想用wksDest(Sheet2)的Range去包裹一个默认属于活动表的Cells对象,相当于把两个不同工作表的对象混在一起,VBA无法识别,所以抛出了"Application-defined or object-defined error"。
而且不止这一行,你前面的源范围定义Set rngSource = wksSource.Range(Cells(i, firstPos), Cells(i + 1, secondPos))也存在同样的问题!
修正后的关键代码
把所有Cells都明确绑定到对应的工作表对象上,修改后的代码如下:
Set wksSource = ActiveWorkbook.Sheets("Sheet1") Set wksDest = ActiveWorkbook.Sheets("Sheet2") For Each firstPos In FirstRowArrayCol1 If firstPos = 0 Then Exit For For Each secondPos In SecondRowArrayCol1 If secondPos = 0 Then Exit For Diff = Abs(firstPos - secondPos) If Diff > 0 And Diff <= 5 Then Debug.Print (column3 & firstPos & "," & column3 & secondPos & "," & column4 & firstPos & "," & column4 & secondPos) ' 修正:给Cells指定所属的源工作表 Set rngSource = wksSource.Range(wksSource.Cells(i, firstPos), wksSource.Cells(i + 1, secondPos)) ' 去掉不必要的Select操作,直接复制更高效 rngSource.Copy ' 修正:给Cells指定所属的目标工作表 Set rngDest = wksDest.Range(wksDest.Cells(i, firstPos)) rngDest.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False End If Next secondPos ' 第二个循环的代码也要做同样的Cells限定修改,示例如下 For Each secondPos In SecondRowArrayCol2 If secondPos = 0 Then Exit For Diff = Abs(firstPos - secondPos) If Diff > 0 And Diff <= 5 Then Debug.Print (column3 & firstPos & "," & column3 & secondPos & "," & column4 & firstPos & "," & column4 & secondPos) ' 后续代码里的Cells都要加上wksSource/wksDest的前缀,比如: ' Set rngSource = wksSource.Range(wksSource.Cells(...), wksSource.Cells(...)) End If Next secondPos
额外优化小建议
- 删掉不必要的
Select操作:你代码里的rngSource.Range(Cells(...)).Select完全没用,还会拖慢代码运行速度。 - 可以在代码开头加
Application.ScreenUpdating = False,结尾加Application.ScreenUpdating = True,避免复制过程中屏幕闪烁,提升体验。 - 确保
i、column3、column4这些变量都已经正确赋值,避免隐性的未定义错误。
内容的提问来源于stack exchange,提问作者zion
相关产品推荐
相关产品推荐

