按创建时间优先移动最早文件时遇Run Time Error 58问题求助
解决VBA移动文件时的Run Time Error 58问题
运行这段按创建时间移动文件的VBA代码两周后出现Run Time Error 58: File Already Exist,即使源和目标文件夹为空也会触发错误,根源出在以下几点:
- 当源文件夹为空时,
OldestFile函数返回空字符串,此时执行Name FromPath & fileName As ToPath & fileName相当于尝试移动源文件夹到目标文件夹路径,但目标文件夹已存在,直接触发错误58。 Dir(ToPath & fileName)的检查逻辑不严谨,Dir默认只检测文件且存在缓存问题,可能导致误判。OldestFile函数初始把lastFile设为Now,如果遇到创建时间异常的文件(比如系统时间被修改),可能无法正确识别最早的文件。
修复后的代码
Function OldestFile(strFold As String) As String Dim FSO As Object, Folder As Object, File As Object, oldF As String ' 初始化为极小日期,确保第一个文件的创建时间一定会小于它 Dim lastFile As Date: lastFile = DateSerial(1900, 1, 1) Set FSO = CreateObject("Scripting.FileSystemObject") ' 先检查文件夹是否存在,避免无效路径报错 If Not FSO.FolderExists(strFold) Then OldestFile = "" Exit Function End If Set Folder = FSO.GetFolder(strFold) oldF = "" ' 显式初始化空字符串 For Each File In Folder.Files If File.DateCreated < lastFile Then lastFile = File.DateCreated oldF = File.Name End If Next OldestFile = oldF End Function Sub MoveOldestFile() Dim FromPath As String, ToPath As String, fileName As String, limit As Long Dim filesmoved As Long, FSO As Object FromPath = "C:\Users\user\Desktop\Source\" ToPath = "C:\Users\user\Desktop\Destination\" limit = 20 filesmoved = 0 Set FSO = CreateObject("Scripting.FileSystemObject") ' 确保目标文件夹存在,不存在则自动创建 If Not FSO.FolderExists(ToPath) Then FSO.CreateFolder ToPath End If fileName = OldestFile(FromPath) Do Until fileName = "" Or filesmoved = limit ' 用FSO检查目标文件是否存在,比Dir更可靠 If Not FSO.FileExists(ToPath & fileName) Then On Error Resume Next ' 临时开启错误处理,避免单个文件移动失败导致程序崩溃 Name FromPath & fileName As ToPath & fileName If Err.Number = 0 Then filesmoved = filesmoved + 1 Else ' 可选:记录错误日志,比如 Debug.Print "移动失败:" & fileName & ",错误:" & Err.Description End If On Error GoTo 0 ' 关闭错误处理 End If fileName = OldestFile(FromPath) Loop End Sub
关键修改说明
OldestFile函数优化:
- 将
lastFile初始化为1900年1月1日,确保能正确捕获最早创建的文件,避免Now作为初始值的潜在问题。 - 增加文件夹存在性检查,避免传入无效路径时崩溃。
- 显式初始化
oldF为空字符串,逻辑更清晰。
- 将
MoveOldestFile子过程优化:
- 增加目标文件夹存在性检查,不存在则自动创建,避免路径不存在的错误。
- 用FSO的
FileExists替代Dir检查文件,避免Dir的缓存问题,判断更准确。 - 增加临时错误处理,即使移动时出现异常(比如文件被占用),程序也能继续运行,不会直接崩溃。
- 依赖
fileName = ""的循环终止条件,从根源避免空文件名导致的文件夹移动错误。
内容的提问来源于stack exchange,提问作者Salman Shafi
相关产品推荐
相关产品推荐

