根据模式标准和例外从文件夹中获取文件

问题描述

无法弄清楚如何实现以下用例。

我将文件夹和条件(以“;”分隔)传递给函数,如果条件匹配,则检索文件。 这工作得很好,但我有一个例外:

如果第一个位置的标准模式是“ABC”,则有多个文件可以匹配搜索模式。 我的目标是在某种意义上对发现进行优先级排序,即包含“RD_”的文件应该比包含字符串“SD_”的文件具有更高的优先级。

提示: 如果文件中包含字符串“RD_”并且也匹配其他条件,则该函数可以停止。 如果文件中包含字符串“SD_”并且也匹配其他条件,则该函数不应停止并仍然循环文件夹中的所有文件,并尝试找到匹配所有条件和“RD_”的文件

希望你能进一步帮助我。

Sub getTargetFile()
    Debug.Print getInputFilePath("D:\","ABC;11111")
End Sub


Function getInputFilePath(inputDirectoryToScanForFile,filenameCriteria) As String

    Dim vSplitCriteria:  vSplitCriteria = Split(filenameCriteria,";")  '   Split the criteria into pieces and put them into an array

    Dim oFSO As Object
    Dim oFolder As Object
    Dim oFile As Object
    Dim i As Integer
    Dim sFoundFile As String

    Set oFSO = CreateObject("Scripting.FileSystemObject")
    Set oFolder = oFSO.GetFolder(inputDirectoryToScanForFile)

    Dim blnCorrectFiles As Boolean
    For Each oFile In oFolder.Files     '   Loop through each file in folder
        blnCorrectFiles = True          '   assume the current file is correct
        'Debug.Print oFile.Name
        For i = LBound(vSplitCriteria) To UBound(vSplitCriteria)            '   Loop through all file name criteria
            If Not InStr(1,UCase(oFile.Name),UCase(vSplitCriteria(i))) > 0 Then   '   check whether criteia matched
                blnCorrectFiles = False
            End If
            If blnCorrectFiles = False Then Exit For
        Next i
        If blnCorrectFiles = True Then     '    if all criteria are matched,otherwise it was set to false inbetween the above loop
            sFoundFile = oFile.Name
            Exit For
        End If
    Next oFile

    If blnCorrectFiles = True Then
        getInputFilePath = inputDirectoryToScanForFile & sFoundFile
    Else
        getInputFilePath = ""
    End If


End Function

解决方法

听起来您想先检查 RD_,然后如果没有找到,则检查 SD_。听起来您只需要运行该函数两次。尝试在函数内部进行混合和匹配将很难概括,只会使事情变得混乱。

Sub Prioritize()
    Dim Directory As String
    Directory = "D:\"
    
    Dim Criteria As String
    Criteria = "ABC;11111"
    
    Dim fPath As String
    fPath = getInputFilePath(Directory,"RD_;" & Criteria)
    
    If fPath = "" Then fPath = getInputFilePath(Directory,"SD_;" & Criteria)
    
End Sub