VBA脚本NewestFile异常:同事遇Run Time Error 52且无法获取最新文件
问题分析与解决:VBA脚本Run Time Error 52及文件识别异常
问题描述
- 本人运行
NewestFileVBA脚本无异常,但同事触发Run Time Error 52(文件或路径错误) - 脚本未拉取同事本地最新文件,反而加载上周旧文件;当本人本地无匹配文件时,同事的
MyFile仍显示上周旧文件名 - 已确认同事的
MyPath路径、系统日期均正确
错误根源排查
- Run Time Error 52:
FileDateTime函数访问文件时,若文件正被占用(如下载未完成、被其他进程锁定)或无读取权限,会触发该错误;此外Dir函数可能因系统缓存未刷新,返回非实时的文件列表。 - 旧文件误判:变量
LatestDate未初始化(VBA中Date类型默认值为0),若部分文件的修改时间无法读取,第一个被遍历的旧文件会始终被判定为"最新";同时Dir的缓存机制可能导致未获取文件夹最新状态。
修复后的脚本代码
Sub NewestFile() ' 关闭所有受保护视图窗口 Do While Application.ProtectedViewWindows.Count > 0 Application.ProtectedViewWindows(1).Edit Loop Application.DisplayAlerts = False Dim MyPath As String Dim MyFile As String Dim LatestFile As String Dim LatestDate As Date Dim LMD As Date Dim fileAccessible As Boolean ' 构建用户下载路径 MyPath = "C:\Users\" & Environ("username") & "\Downloads\" If Right(MyPath, 1) <> "\" Then MyPath = MyPath & "\" ' 初始化Dir获取最新文件列表,避免缓存干扰 MyFile = Dir(MyPath & "*.xlsx", vbNormal) ' 初始化LatestDate为极小值,确保后续时间比较逻辑正常 LatestDate = DateSerial(1900, 1, 1) If Len(MyFile) = 0 Then MsgBox "未找到匹配的xlsx文件...", vbExclamation Exit Sub End If Do While Len(MyFile) > 0 ' 捕获文件访问错误,跳过无法读取的文件 On Error Resume Next LMD = FileDateTime(MyPath & MyFile) fileAccessible = (Err.Number = 0) On Error GoTo 0 ' 仅当文件可访问且修改时间更新时,更新最新文件记录 If fileAccessible And LMD > LatestDate Then LatestFile = MyFile LatestDate = LMD End If MyFile = Dir Loop ' 验证找到有效文件后再打开,避免空值报错 If Len(LatestFile) > 0 Then Workbooks.Open MyPath & LatestFile Else MsgBox "无法读取有效文件的修改时间,请检查文件权限或是否被占用", vbCritical Exit Sub End If Application.DisplayAlerts = True ' 修正原Wait参数错误(ms未定义),改为等待1秒 Application.Wait (Now + TimeValue("00:00:01")) Call USEforPBIDownload End Sub
修复说明
- 解决Run Time Error 52:添加错误捕获逻辑,跳过无法读取修改时间的锁定/占用文件
- 修正旧文件识别:初始化
LatestDate为极小值,确保只有真正最新的文件会被选中;增加文件可访问性校验,避免错误数据干扰判断 - 修复语法错误:替换原未定义的
ms参数,用TimeValue实现合法的等待逻辑 - 增强鲁棒性:添加
LatestFile非空判断,防止无有效文件时触发打开错误
内容的提问来源于stack exchange,提问作者user22441973
相关产品推荐
相关产品推荐

