基于模式条件与例外规则从文件夹获取文件的优先级实现问题
解决方案:实现VBA文件查找的优先级规则
针对你提到的优先级需求,我们需要调整原函数的逻辑,在第一个条件为ABC时,区分RD_和SD_文件的优先级:优先锁定带RD_的匹配文件(找到就立刻停止遍历),只有当遍历完所有文件都没找到RD_的,才返回找到的SD_文件(如果有的话)。
以下是修改后的完整代码:
Sub getTargetFile() Debug.Print getInputFilePath("D:\", "ABC;11111") End Sub Function getInputFilePath(inputDirectoryToScanForFile, filenameCriteria) As String Dim vSplitCriteria: vSplitCriteria = Split(filenameCriteria, ";") Dim oFSO As Object Dim oFolder As Object Dim oFile As Object Dim i As Integer Dim sFoundRDFile As String ' 存储找到的RD_优先级文件 Dim sFoundSDFile As String ' 存储找到的SD_次优先级文件 Dim isABCCriteria As Boolean ' 判断是否是ABC开头的条件 Set oFSO = CreateObject("Scripting.FileSystemObject") Set oFolder = oFSO.GetFolder(inputDirectoryToScanForFile) ' 判断第一个条件是否为ABC(统一转大写避免大小写问题) isABCCriteria = (UBound(vSplitCriteria) >= 0) And (UCase(vSplitCriteria(0)) = "ABC") For Each oFile In oFolder.Files Dim blnCorrectFiles As Boolean blnCorrectFiles = True ' 检查是否匹配所有文件名条件 For i = LBound(vSplitCriteria) To UBound(vSplitCriteria) If Not InStr(1, UCase(oFile.Name), UCase(vSplitCriteria(i))) > 0 Then blnCorrectFiles = False Exit For End If Next i If blnCorrectFiles Then ' 处理ABC条件下的优先级逻辑 If isABCCriteria Then ' 检查是否包含RD_(大写匹配) If InStr(1, UCase(oFile.Name), "RD_") > 0 Then sFoundRDFile = oFile.Name Exit For ' 找到最高优先级文件,立刻终止遍历 ' 检查是否包含SD_,记录但继续遍历 ElseIf InStr(1, UCase(oFile.Name), "SD_") > 0 Then If sFoundSDFile = "" Then ' 仅记录第一个找到的SD_文件,可根据需求调整为最后一个 sFoundSDFile = oFile.Name End If ' 若有其他符合条件但不带RD/SD的文件,可在此扩展处理逻辑 End If Else ' 非ABC条件,保持原逻辑,找到第一个匹配的就返回 sFoundRDFile = oFile.Name Exit For End If End If Next oFile ' 确定返回结果:优先RD_文件,其次SD_文件,都没有返回空 If sFoundRDFile <> "" Then getInputFilePath = inputDirectoryToScanForFile & sFoundRDFile ElseIf sFoundSDFile <> "" Then getInputFilePath = inputDirectoryToScanForFile & sFoundSDFile Else getInputFilePath = "" End If End Function
关键逻辑说明
- 优先级触发判断:通过
isABCCriteria变量统一转大写判断第一个条件是否为ABC,避免大小写敏感问题 - 双文件存储机制:用两个变量分别存储高、次优先级的匹配文件,确保不会遗漏目标
- 遍历规则调整:
- 找到带
RD_的匹配文件时,直接终止遍历(符合"立即停止"的要求) - 找到带
SD_的匹配文件时,仅记录但继续遍历,确保不会漏掉可能存在的RD_文件 - 非ABC条件下,保留原函数的高效逻辑,找到第一个匹配文件就返回
- 找到带
- 结果返回规则:严格按照优先级返回,优先
RD_,其次SD_,都没有则返回空字符串
内容的提问来源于stack exchange,提问作者smartini
相关产品推荐
相关产品推荐

