如何用VBA获取下载文件夹最新CSV文件?修正代码循环错误
遍历下载文件夹导入最新修改CSV的VBA解决方案
原代码的核心问题是变量混淆:初始strPath被设为带通配符的路径(如C:\Users\AlexandreBrandt\Downloads\*.csv),但循环中又将其赋值为单个文件名,导致后续FileDateTime函数引用的路径无效,触发调试错误。以下是修正后的完整实现,逻辑更清晰且避免变量冲突:
Sub ImportLastCSVFile() Dim downloadPath As String Dim currentFile As String Dim latestFile As String Dim latestFileTime As Date Dim targetWB As Workbook Dim targetWS As Worksheet ' 指定下载文件夹路径,确保末尾带反斜杠 downloadPath = "C:\Users\AlexandreBrandt\Downloads\" ' 初始化最新文件变量 latestFile = "" latestFileTime = #1/1/1900# ' 初始化为早于任何文件的时间 ' 遍历文件夹中所有CSV文件 currentFile = Dir(downloadPath & "*.csv", vbNormal) Do While currentFile <> "" ' 获取当前文件的修改时间 Dim currentFileTime As Date currentFileTime = FileDateTime(downloadPath & currentFile) ' 比较并更新最新文件信息 If currentFileTime > latestFileTime Then latestFileTime = currentFileTime latestFile = currentFile End If ' 获取下一个文件 currentFile = Dir() Loop ' 检查是否找到CSV文件 If latestFile = "" Then MsgBox "下载文件夹中未找到CSV文件", vbExclamation Exit Sub End If ' 准备目标工作表 Set targetWB = ThisWorkbook On Error Resume Next Set targetWS = targetWB.Sheets("Import") On Error GoTo 0 ' 恢复错误捕获 ' 若存在旧的Import工作表则删除 If Not targetWS Is Nothing Then Application.DisplayAlerts = False targetWS.Delete Application.DisplayAlerts = True End If ' 新建Import工作表并导入CSV数据 Set targetWS = targetWB.Sheets.Add(After:=targetWB.Sheets(targetWB.Sheets.Count)) targetWS.Name = "Import" ' 使用QueryTables导入CSV,适配不同分隔符(可根据实际修改) With targetWS.QueryTables.Add( _ Connection:="TEXT;" & downloadPath & latestFile, _ Destination:=targetWS.Range("A1")) .TextFileParseType = xlDelimited .TextFileCommaDelimiter = True ' 假设CSV用逗号分隔,若为制表符则改为.TextFileTabDelimiter = True .Refresh BackgroundQuery:=False .Delete ' 导入后删除QueryTable对象,避免冗余 End With MsgBox "已成功导入最新CSV文件:" & latestFile, vbInformation End Sub
关键改进点:
- 变量职责分离:用
downloadPath固定存储文件夹路径,currentFile遍历单个文件名,latestFile和latestFileTime专门记录最新文件的信息,彻底避免变量混淆 - 时间比较逻辑清晰:初始时间设为极早值,确保第一个CSV文件能被选中,后续逐个比较更新
- 完整导入流程:补充了CSV文件的导入逻辑,包含工作表的创建、数据导入,以及错误提示(如无CSV文件时的提示)
- 错误处理优化:恢复默认错误捕获机制,避免全局
On Error Resume Next导致的潜在问题
内容的提问来源于stack exchange,提问作者Alexandre Brandt
相关产品推荐
相关产品推荐

