首次使用VBA,如何将8个单工作表工作簿导入主工作簿为独立工作表
原代码存在的可触发运行报错的具体问题
- 变量拼写错误:代码开头定义了目标工作簿变量
WbDest,后续赋值时误写为weDest,导致目标工作簿对象没有被正确关联,运行时会弹出「对象变量或 With 块变量未设置」的报错 - 路径拼接错误:
myPath变量已经在字符串末尾加了反斜杠,后续打开源文件时又额外拼接了"\",会形成双反斜杠的无效路径,无法正常定位文件 - 文件检索无过滤:直接读取
stats文件夹下的所有文件,遇到非Excel格式的内容(比如系统临时文件、文本文件)时,会触发“无法打开文件”的报错 - 缺少运行防护:没有判断文件夹是否存在、没有跳过主工作簿本身,遇到路径异常时会直接中断代码运行
修正后可直接运行的完整代码
Sub ImportStats() Dim WbDest As Workbook Dim wbSource As Workbook Dim wsSource As Worksheet Dim myPath As String Dim strFileName As String ' 关闭屏幕更新,提升导入速度、减少闪屏 Application.ScreenUpdating = False ' 关联主工作簿对象 Set WbDest = ThisWorkbook ' 定义源文件存储路径 myPath = ThisWorkbook.Path & "\stats\" ' 检测stats文件夹是否存在 If Dir(myPath, vbDirectory) = "" Then MsgBox "未找到stats文件夹,请确认该文件夹与主工作簿放在同一目录下", vbExclamation GoTo Cleanup End If ' 筛选路径下所有Excel格式文件(覆盖xls/xlsx/xlsm格式) strFileName = Dir(myPath & "*.xls*") ' 循环遍历匹配到的文件 Do Until strFileName = "" ' 跳过主工作簿本身,避免自导入报错 If strFileName <> ThisWorkbook.Name Then ' 打开源文件,禁用链接更新、默认只读打开 Set wbSource = Workbooks.Open( _ Filename:=myPath & strFileName, _ UpdateLinks:=0, _ ReadOnly:=True) ' 取源文件的第1个工作表 Set wsSource = wbSource.Worksheets(1) ' 将工作表拷贝到主工作簿的National2工作表之后 wsSource.Copy After:=WbDest.Worksheets("National2") ' 关闭源文件,不保存任何修改 wbSource.Close SaveChanges:=False End If ' 切换到下一个文件 strFileName = Dir() Loop MsgBox "全部文件导入完成", vbInformation Cleanup: ' 恢复屏幕更新设置 Application.ScreenUpdating = True ' 释放对象占用内存 Set wsSource = Nothing Set wbSource = Nothing Set WbDest = Nothing End Sub
运行注意事项
- 提前把所有待导入的源Excel文件,放到和主工作簿同目录下的
stats子文件夹内,不要放其他格式的无关文件 - 确认主工作簿内存在名为
National2的工作表,所有导入的工作表会依次排列在这个工作表的后面 - 导入时如果不同源文件的工作表同名,Excel会自动给新拷贝的工作表加数字后缀区分,不会覆盖主工作簿内已有的内容
- 打开源文件时默认只读加载,不会修改源文件内的任何原始内容
内容的提问来源于stack exchange,提问作者Northern
相关产品推荐
相关产品推荐

