【发布时间】:2021-07-09 12:52:10
【问题描述】:
无法弄清楚如何实现以下用例。
我将文件夹和条件(由“;”分隔)传递给函数,如果条件匹配,则检索文件。 这工作得很好,但我有一个例外:
如果第一个位置的条件模式是“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
【问题讨论】:
-
旁注:在同一个变量中传递多个条件是一种不好的做法,并且是不必要的。 VBA 已经支持将数组作为参数传递,或者您可以传递参数数组(如
getInputFilePath( Directory, mycriteria1, mycriteria2, mycriteria3)。参见ParamArray 和教程here。 -
通常不是我怎么做的,但由于标准列在一个单元格内,我采用了这种方法。