Excel VBA跨工作簿复制问题:调用宏时触发对象定义错误
VBA复制出错的排查与解决
你的问题核心是分步运行正常,但按钮触发宏时出错,大概率是对象引用的可靠性问题——分步运行时你手动确保了所有对象(工作簿、工作表)都存在且处于可访问状态,但按钮调用时没有做这些校验,或者当前环境和分步运行时不一致。
以下是具体的排查和解决步骤:
先确认基础条件
确保两个工作簿Feeder document for quoting.xlsm和Cost-Sell Sheet.xlsm都处于打开状态,且文件名完全匹配(包括空格、后缀,注意不要把文件路径也加进去,Workbooks()只需要文件名)。改用对象变量重构代码
直接链式调用Workbooks(...).Worksheets(...).Range(...)很容易因为某个对象不存在抛出模糊的错误,改成先定义变量并做校验,既能避免错误,还能精准定位问题:Sub Macro2() Dim sourceWB As Workbook, targetWB As Workbook Dim sourceWS As Worksheet, targetWS As Worksheet ' 检查源/目标工作簿是否打开 On Error Resume Next Set sourceWB = Workbooks("Feeder document for quoting.xlsm") Set targetWB = Workbooks("Cost-Sell Sheet.xlsm") On Error GoTo 0 If sourceWB Is Nothing Then MsgBox "请先打开「Feeder document for quoting.xlsm」" Exit Sub End If If targetWB Is Nothing Then MsgBox "请先打开「Cost-Sell Sheet.xlsm」" Exit Sub End If ' 检查工作表是否存在 On Error Resume Next Set sourceWS = sourceWB.Worksheets("Factor") Set targetWS = targetWB.Worksheets("RFJN") On Error GoTo 0 If sourceWS Is Nothing Then MsgBox "源工作簿里找不到名为「Factor」的工作表" Exit Sub End If If targetWS Is Nothing Then MsgBox "目标工作簿里找不到名为「RFJN」的工作表" Exit Sub End If ' 执行复制 sourceWS.Range("A4:AE34").Copy Destination:=targetWS.Range("A4:AE34") End Sub排查工作表保护问题
如果目标工作表RFJN被保护了,复制操作会失败。可以在复制前临时解除保护,完成后再恢复:' 复制前添加(如果有保护密码就填进去,没有就省略Password参数) If targetWS.ProtectContents Then targetWS.Unprotect Password:="你的保护密码" End If ' 复制代码... ' 复制完成后恢复保护 targetWS.Protect Password:="你的保护密码", Contents:=True按钮所在位置的影响
如果按钮是放在某个工作簿的工作表里,调用宏时当前活动工作簿可能和分步运行时不同,但上面的对象变量方法已经规避了这个问题——它直接绑定具体的工作簿对象,不依赖当前活动状态。
内容的提问来源于stack exchange,提问作者ham fam
相关产品推荐
相关产品推荐

