MS Access使用VBA按指定时间范围批量导入CSV文件到单表的问题求助
问题修复方案
首先你的代码无报错但无效果,核心原因有3个:
- 参数类型选错:你使用的
acLinkDelim是创建CSV文件的链接表,仅建立和原文件的关联,不会把数据导入到Access本地表,自然不会产生新的本地表数据。 - 筛选逻辑未验证:你注释了调试输出代码,无法确认是否有符合创建日期范围的文件被匹配到,大概率是文本框传入的日期格式和文件创建日期的格式不匹配,导致所有文件都被筛选排除,导入语句从未执行。
- 变量冗余易出错:重复声明了两对日期变量(
EarliestDate/DateEarliest、LatestDate/DateLatest),多余的格式转换步骤增加了出错概率。
修复后可用代码
Dim FSO As Object Dim oFile As Object Dim Directory As String Dim FileName As String Dim DateEarliest As Date Dim DateLatest As Date ' 创建文件系统对象 Set FSO = CreateObject("Scripting.FileSystemObject") ' 配置目录路径 Directory = "E:\Op60\" If Right(Directory, 1) <> "\" Then Directory = Directory & "\" End If ' 读取日期筛选条件,增加非空校验 If IsNull(txt_Start_Date) Or IsNull(txt_Start_Date2) Then MsgBox "请先选择起止日期" Exit Sub End If DateEarliest = CDate(txt_Start_Date) DateLatest = CDate(txt_Start_Date2) ' 关闭警告和屏幕刷新提升速度 DoCmd.SetWarnings False Application.Echo False FileName = Dir(Directory & "*.CSV") Do While FileName <> "" Set oFile = FSO.GetFile(Directory & FileName) ' 匹配创建日期范围 If oFile.DateCreated >= DateEarliest And oFile.DateCreated <= DateLatest Then ' 用acImportDelim实现导入,多个文件会自动追加到同一张CsvTbl表 DoCmd.TransferText TransferType:=acImportDelim, TableName:="CsvTbl", FileName:=Directory & FileName, HasFieldNames:=True End If FileName = Dir Loop ' 恢复系统设置 DoCmd.SetWarnings True Application.Echo True Set oFile = Nothing Set FSO = Nothing MsgBox "导入完成"
注意:所有导入的CSV需要保持表头、列顺序、字段格式完全一致,否则会出现导入错位或报错。
更高性能的优化方案
如果需要处理大量CSV文件,可采用以下方法提升导入速度:
- 合并后单次导入:先把所有符合日期条件的CSV内容合并为一个临时CSV文件,再调用一次
TransferText导入,比循环逐个导入的速度提升40%以上,避免多次调用导入接口的开销。 - 预建目标表:提前手动创建好
CsvTbl表,明确每个字段的类型和长度,不要让Access在导入时自动推断字段类型,既可以避免类型识别错误,也能提升导入效率。 - 禁用自动索引:导入前临时关闭目标表的自动索引功能,导入完成后再重建索引,可大幅减少大体积文件导入的耗时。
内容的提问来源于stack exchange,提问作者sam goto
相关产品推荐
相关产品推荐

