问题描述
无法弄清楚如何实现以下用例。
我将文件夹和条件(以“;”分隔)传递给函数,如果条件匹配,则检索文件。 这工作得很好,但我有一个例外:
如果第一个位置的标准模式是“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