VBA循环遍历文件复制工作表数组时报错424(需要对象)如何解决
错误根源
你遇到的424错误核心原因是代码存放在Personal.xlsb中,直接书写Sheet1、Sheet2默认指代的是Personal.xlsb内部的工作表代码名称,而非你当前遍历的其他工作簿内的工作表,因此找不到对应对象触发报错。
修正后完整代码
Sub PleaseWork() Dim wb As Workbook Dim ws1 As Worksheet, ws2 As Worksheet For Each wb In Application.Workbooks If UCase(wb.Name) <> "PERSONAL.XLSB" Then Debug.Print wb.Name ' 直接获取目标工作簿的前两个工作表(符合你描述的每个文件仅2个工作表的规则) Set ws1 = wb.Worksheets(1) Set ws2 = wb.Worksheets(2) ' 两次复制原始工作表到最前面 wb.Sheets(Array(ws1.Name, ws2.Name)).Copy Before:=wb.Sheets(1) wb.Sheets(Array(ws1.Name, ws2.Name)).Copy Before:=wb.Sheets(1) ' 批量写入差值公式 wb.Sheets(1).UsedRange.SpecialCells(xlCellTypeFormulas, 23).FormulaR1C1 = _ "=ROUND('" & wb.Sheets(3).Name & "'!RC-'" & wb.Sheets(5).Name & "'!RC,4)" wb.Sheets(2).UsedRange.SpecialCells(xlCellTypeFormulas, 23).FormulaR1C1 = _ "=ROUND('" & wb.Sheets(4).Name & "'!RC-'" & wb.Sheets(6).Name & "'!RC,4)" ' 直接操作原始第二个工作表,无需激活 With ws2 .Columns("J:J").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove .Range("I16:I18,AD2:AG14").ClearContents .Range("N3,N21,X3,X21,AC21,AC3").Value = "Cash Flows" End With End If Next wb MsgBox "All Finished!" End Sub
修改说明
- 新增
ws1、ws2两个对象变量,显式绑定当前遍历工作簿的前两个工作表,避免默认关联到Personal.xlsb - 所有工作表操作前都添加了
wb.限定符,确保所有操作都指向目标工作簿,不会出现对象找错的问题 - 去掉了不必要的
Activate操作,代码运行更稳定,执行速度也更快 - 对工作簿名称判断增加了
UCase转换,避免因为大小写差异(比如Personal.xlsb和PERSONAL.XLSB)导致的判断错误
内容的提问来源于stack exchange,提问作者berclaw
相关产品推荐
相关产品推荐

