如何利用Recordset清理远程驱动器?VBA代码报错438求助
问题分析与修复
错误原因
你遇到的错误438根源在于:
- 错误地将
FileSystemObject实例(fl)当作文件对象操作,FileSystemObject本身没有Name属性,该属性属于FSO的File对象。 Kill命令需要传入文件路径字符串,而非对象。- 代码重复创建了两个
FileSystemObject实例(fl和fso),属于冗余操作。
修复后的代码
以下是修正后的完整代码,同时补充了循环遍历记录集的逻辑(原代码仅处理前两条记录,无法批量清理重复项):
Option Compare Database Sub CleanUp() ' 仅创建一个FileSystemObject实例 Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") Dim db As DAO.Database Set db = CurrentDb Dim NewTbl As DAO.Recordset Set NewTbl = db.OpenRecordset("Sorted", dbOpenDynaset) Dim ThsFl As String, NxtFl As String Dim ThsHm As String, NxtHm As String Dim ThsExt As String, NxtExt As String Dim ThsSz As String, NxtSz As String Dim currentFilePath As String ' 先判断记录集是否为空 If Not (NewTbl.BOF And NewTbl.EOF) Then NewTbl.MoveFirst ' 初始化第一条记录的对比基准 ThsFl = NewTbl("File").Value ThsHm = NewTbl("Home").Value ThsExt = NewTbl("Ext").Value ThsSz = CStr(NewTbl("KB Size").Value) ' 循环遍历所有记录进行对比 Do While Not NewTbl.EOF NewTbl.MoveNext ' 最后一条记录无后续可对比,直接退出循环 If NewTbl.EOF Then Exit Do ' 获取下一条记录的信息 NxtFl = NewTbl("File").Value NxtHm = NewTbl("Home").Value NxtExt = NewTbl("Ext").Value NxtSz = CStr(NewTbl("KB Size").Value) ' 判断是否为重复项(可根据你的筛选逻辑调整条件) If ThsHm = NxtHm And ThsFl = NxtFl And ThsExt = NxtExt And ThsSz = NxtSz Then ' 拼接完整文件路径 currentFilePath = ThsHm & ThsFl & "." & ThsExt ' 先检查文件是否存在,避免触发不存在错误 If fso.FileExists(currentFilePath) Then ' 方式1:用Kill命令删除 Kill currentFilePath ' 方式2:用FSO的DeleteFile方法(支持强制删除只读文件) ' fso.DeleteFile currentFilePath, True End If End If ' 更新基准信息为当前记录,用于下一轮对比 ThsFl = NxtFl ThsHm = NxtHm ThsExt = NxtExt ThsSz = NxtSz Loop End If ' 释放资源 NewTbl.Close Set NewTbl = Nothing Set db = Nothing Set fso = Nothing End Sub
关键修改说明
- 精简
FileSystemObject实例,避免冗余创建。 - 直接拼接文件路径字符串,不再错误操作FSO对象属性。
- 增加
FileExists检查,提前规避文件不存在的报错。 - 补充循环逻辑,实现批量遍历对比重复项。
- 提供两种删除方案:
Kill命令适合常规文件,FSO.DeleteFile可处理只读等特殊文件。
内容的提问来源于stack exchange,提问作者AnthonyJ
相关产品推荐
相关产品推荐

