如何使用SQL查询将文件夹内所有文件批量上传到MS Access
Access批量导入指定文件夹内Excel文件的解决方案
以下提供两种可直接落地的操作方案,按需选择即可:
方案1:VBA脚本批量导入(最灵活,支持大量文件场景)
该方案支持两种导入逻辑:所有Excel文件导入到同一个表、每个Excel文件单独生成对应表,可按需修改参数。
- 打开你的Access数据库,按
Alt + F11唤出VBA编辑器,右键点击左侧当前数据库名称,选择「插入」-「模块」 - 将以下代码粘贴到模块编辑区,根据你的实际需求修改头部常量参数:
Sub BatchImportExcel() ' --------------- 以下参数可根据需求修改 --------------- Const EXCEL_FOLDER As String = "C:\Users\Usuari\Desktop\DATA\" ' 目标文件夹路径,注意末尾加\ Const HAS_HEADERS As Boolean = True ' Excel第一行是否为表头,是则填True,否则False Const MERGE_TO_ONE_TABLE As Boolean = True ' 是否合并到同一个表,是则填True,否则每个文件单独建表 Const TARGET_TABLE As String = "合并导入表" ' 合并导入时的目标表名 ' ----------------------------------------------------- Dim fso As Object Dim folder As Object Dim file As Object Dim ext As String Dim importCmd As String Set fso = CreateObject("Scripting.FileSystemObject") Set folder = fso.GetFolder(EXCEL_FOLDER) For Each file In folder.Files ext = LCase(fso.GetExtensionName(file.Path)) ' 仅处理Excel格式文件 If ext = "xlsx" Or ext = "xls" Or ext = "xlsb" Or ext = "xlsm" Then If MERGE_TO_ONE_TABLE Then ' 合并导入到同一张表 DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, _ TARGET_TABLE, file.Path, HAS_HEADERS Else ' 每个文件单独建表,表名用文件名去掉后缀 DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, _ Replace(fso.GetBaseName(file.Path), " ", "_"), file.Path, HAS_HEADERS End If Debug.Print "已导入文件:" & file.Name End If Next Set file = Nothing Set folder = Nothing Set fso = Nothing MsgBox "批量导入完成!", vbInformation End Sub
- 按
F5运行脚本即可完成批量导入。
注意事项
- 若选择合并导入逻辑,需确保所有Excel文件的列结构(列数、列数据类型)完全一致,避免导入报错
- 运行前需关闭所有正在打开的目标文件夹内的Excel文件,避免文件占用导致导入失败
- 若Access提示宏被禁用,可通过「文件」-「选项」-「信任中心」-「信任中心设置」-「宏设置」,选择「启用所有宏」后重启Access再运行
方案2:无代码批量合并导入(适合文件结构一致的场景)
如果不想编写VBA代码,可通过Excel的Power Query功能先批量合并所有文件,再一次性导入Access:
- 打开任意空白Excel文件,依次点击「数据」-「获取数据」-「自文件」-「自文件夹」,选择你的目标文件夹
C:\Users\Usuari\Desktop\DATA - 待加载出所有文件列表后,点击列表上方的「合并」-「合并并加载」,等待所有文件合并为一张Excel表
- 回到Access,按你熟悉的
External Data-> New Data Source-> From_File-> Excel路径,导入刚才合并完成的Excel文件即可
内容的提问来源于stack exchange,提问作者J.K Kim
相关产品推荐
相关产品推荐

