You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于模式条件与例外规则从文件夹获取文件的优先级实现问题

解决方案:实现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

关键逻辑说明

  1. 优先级触发判断:通过isABCCriteria变量统一转大写判断第一个条件是否为ABC,避免大小写敏感问题
  2. 双文件存储机制:用两个变量分别存储高、次优先级的匹配文件,确保不会遗漏目标
  3. 遍历规则调整:
    • 找到带RD_的匹配文件时,直接终止遍历(符合"立即停止"的要求)
    • 找到带SD_的匹配文件时,仅记录但继续遍历,确保不会漏掉可能存在的RD_文件
    • 非ABC条件下,保留原函数的高效逻辑,找到第一个匹配文件就返回
  4. 结果返回规则:严格按照优先级返回,优先RD_,其次SD_,都没有则返回空字符串

内容的提问来源于stack exchange,提问作者smartini

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 21:39:08