VBA批量合并多文件数据遇‘Object required’错误求助
VBA代码错误修复与优化
错误原因分析
你遇到的「Object required」错误,是因为lastrow是数值型变量(Long),但你用了仅适用于对象变量的Set关键字赋值,直接去掉Set即可。
除此之外,代码还有多处语法逻辑问题,以下是完整修正版代码及问题说明:
修正后的完整代码
Sub Compile() Dim I As Long Dim WB_Target As Workbook, WB_Source As Workbook ' 明确声明每个变量类型 Dim WS_Files As Worksheet, WS_Target As Worksheet Dim lastrow As Long Dim sourcePath As String ' 关闭屏幕刷新和提示,提升运行效率 Application.ScreenUpdating = False Application.DisplayAlerts = False Set WB_Target = ThisWorkbook Set WS_Files = WB_Target.Sheets("FilePaths") ' 存储源文件路径的工作表 Set WS_Target = WB_Target.Sheets("TargetSheet") ' 目标汇总工作表 ' 遍历H列的所有文件路径 For I = 1 To WS_Files.Range("H1").End(xlDown).Row sourcePath = WS_Files.Range("H" & I).Value ' 检查文件是否存在 If Len(Dir(sourcePath)) > 0 Then Set WB_Source = Workbooks.Open(sourcePath) With WB_Source.Sheets("Account") ' 复制Account表中A1到M列的有效数据(若源表带表头,可改为从A2开始复制) .Range("A1:M" & .Range("A1").End(xlDown).Row).Copy End With ' 计算目标表的最后一行(从A列向上查找有效数据行) lastrow = WS_Target.Cells(WS_Target.Rows.Count, "A").End(xlUp).Row + 1 ' 确保数据从A5开始粘贴,即使目标表只有表头 If lastrow < 5 Then lastrow = 5 WS_Target.Range("A" & lastrow).PasteSpecial xlPasteValuesAndNumberFormats ' 避免格式干扰,建议用指定粘贴方式 Application.CutCopyMode = False WB_Source.Close SaveChanges:=False ' 直接用对象变量关闭,避免名称匹配错误 End If Next I ' 恢复屏幕刷新和系统提示 Application.ScreenUpdating = True Application.DisplayAlerts = True End Sub
关键问题修正说明
- 变量声明规范:原代码
Dim WB_Target, WB_Source As Workbook仅将WB_Source声明为Workbook类型,WB_Target默认是Variant类型,修正为每个变量明确指定类型。 - Set关键字误用:移除
lastrow赋值前的Set,Long是数值类型,无需用Set赋值。 - 工作表引用错误:原代码
Sheets("Full")应为目标工作表WS_Target,且Cells(Rows.Count, "A4")语法错误,列参数需用列字母(如"A")或列号(如1),不能是单元格地址。 - 文件路径引用错误:原代码
WS_Files.Range("H") & i应为WS_Files.Range("H" & I).Value,且Dir(path.Range(...))中的path应为WS_Files。 - 循环结构错误:原代码Else块后的
Next位置错误,应放在If块结束后。 - 工作簿关闭方式:原代码
Workbooks("WB_Source").Close逻辑错误,直接使用对象变量WB_Source.Close更可靠。 - 粘贴优化:改用
PasteSpecial指定粘贴内容(如值和数字格式),避免不必要的格式干扰。 - 起始行保障:增加
If lastrow <5 Then lastrow=5,确保数据从A5开始粘贴,即使目标表只有表头。
内容的提问来源于stack exchange,提问作者Claire Melinda Dunphy
相关产品推荐
相关产品推荐

