VBA调用workbook.open跨工作簿复制工作表报copy方法失败求助
VBA跨工作簿复制工作表触发「Copy method of Worksheet failed」错误修复
核心错误原因
代码报错由以下逻辑问题直接导致:
- 循环逻辑冗余:每次循环都重复调用
Workbooks.Open打开D3路径指向的目标工作簿,首次循环后目标文件已被Excel进程锁定,后续重复打开会造成目标对象引用失效,直接中断复制操作 - 单元格引用未绑定父对象:
Rows.Count未指定所属工作表,代码运行时若活动工作表不是Target表,会读取到错误的最后行号,后续A列路径读取可能拿到空值或无效路径,造成源文件打开失败 - 潜在兼容问题:源文件首张工作表与目标工作簿内现有工作表重名、目标工作簿开启结构保护、源文件处于受保护视图未启用编辑、文件路径含未转义特殊字符时,都会触发该复制错误
- 对象类型不匹配:
Sheets集合包含图表页、宏表等非工作表对象,若目标工作簿最后一个条目是这类对象,传入After参数时会直接触发方法调用失败 - 变量类型隐患:循环变量
i定义为Integer类型,当数据行超过32767时会出现值溢出,中断代码运行
修复后可运行代码
Sub copysheets() Dim wb As Workbook Dim wba As Workbook Dim wbk As Workbook Dim i As Long Dim lrow As Long Dim targetPath As String, sourcePath As String Set wb = ThisWorkbook ' 绑定Target工作表固定引用,避免活动表切换导致取数错误 With wb.Sheets("Target") lrow = .Range("A" & .Rows.Count).End(xlUp).Row targetPath = .Range("D3").Value End With ' 循环外仅打开一次目标工作簿,避免重复打开造成文件锁定 Set wba = Workbooks.Open(targetPath) For i = 6 To lrow sourcePath = wb.Sheets("Target").Range("A" & i).Value ' 跳过路径为空的无效行 If sourcePath <> "" Then Set wbk = Workbooks.Open(sourcePath) ' 明确引用普通工作表集合作为复制锚点,避免非工作表对象触发报错 wbk.Sheets(1).Copy After:=wba.Worksheets(wba.Worksheets.Count) wbk.Close SaveChanges:=False End If Next i ' 操作完成可按需开启保存、关闭目标工作簿的逻辑 ' wba.Save ' wba.Close End Sub
额外排查点
如果运行修复后代码仍报错,逐一核对以下项:
- 确认D3单元格、A列存储的是文件的完整绝对路径,不是相对路径,且对应文件未被其他程序占用
- 确认目标工作簿没有开启工作表结构保护,开启结构保护的工作簿不允许新增/复制工作表
- 确认打开的源文件不是处于受保护视图,手动打开源文件点击「启用编辑」后再运行代码
- 若存在工作表重名冲突,可在复制代码后增加重命名逻辑,给新复制的工作表指定唯一名称
内容的提问来源于stack exchange,提问作者RK144
相关产品推荐
相关产品推荐

