VBA批量复制工作簿数据遇类型不匹配错误,求排查解决
解决VBA批量复制工作簿数据时的“类型不匹配”错误
错误核心原因
- 直接将
File对象赋值给字符串变量、用File对象作为Workbooks.Open的参数,这两个操作都要求传入字符串类型,但你传入了File对象,触发“类型不匹配”错误。 - 重复创建
FileSystemObject实例,属于冗余代码,虽不直接报错,但会增加不必要的资源消耗。
修正步骤
- 替换
File对象为文件路径字符串:所有需要用到文件路径的地方,用oFile.Path(完整路径)或oFile.Name(仅文件名)代替直接使用oFile。 - 清理冗余的
FileSystemObject实例:只保留一个即可。 - 修复复制粘贴逻辑:明确复制来源是打开的工作簿中的工作表,粘贴目标是指定工作表。
修正后的完整代码
Option Explicit Sub CopyDataFromDump() Dim SourceFolder As String Dim Wb As Workbook Dim CopyFromSheet As Worksheet Dim PasteToSheet As Worksheet Dim LastRow As Long Dim oFSO As Object Dim oFolder As Object Dim oFile As Object ' 目标文件夹路径 SourceFolder = "C:\Users\jschlautman\Desktop\Dump\" ' 初始化文件系统对象 Set oFSO = CreateObject("Scripting.FileSystemObject") Set oFolder = oFSO.GetFolder(SourceFolder) ' 指定粘贴目标工作表(当前工作簿的第一个工作表,可按需修改) Set PasteToSheet = ThisWorkbook.Sheets(1) For Each oFile In oFolder.Files ' 仅处理Excel文件,避免打开非Excel文件报错 If oFSO.GetExtensionName(oFile.Path) Like "xls*" Then ' 用文件完整路径打开工作簿 Set Wb = Workbooks.Open(oFile.Path) ' 指定复制来源工作表(打开工作簿的第一个工作表,可修改为指定表名) Set CopyFromSheet = Wb.Sheets(1) ' 复制数据(仅复制值,避免格式冲突) LastRow = PasteToSheet.Cells(PasteToSheet.Rows.Count, "A").End(xlUp).Row + 1 CopyFromSheet.UsedRange.Copy PasteToSheet.Cells(LastRow, 1).PasteSpecial xlPasteValues ' 关闭源工作簿,不保存更改 Wb.Close SaveChanges:=False End If Next oFile ' 释放对象,避免内存泄漏 Set oFile = Nothing Set oFolder = Nothing Set oFSO = Nothing Set CopyFromSheet = Nothing Set PasteToSheet = Nothing Set Wb = Nothing MsgBox "数据批量复制完成!", vbInformation End Sub
注意事项
- 如果源工作簿的目标工作表不是第一个,将
Wb.Sheets(1)改为Wb.Sheets("你的工作表名")。 - 代码中添加了Excel文件过滤逻辑,避免尝试打开文件夹中的非Excel文件导致报错。
内容的提问来源于stack exchange,提问作者Jacob schlautman
相关产品推荐
相关产品推荐

