【问题标题】:Get file from folder based on pattern criteria and exceptions根据模式标准和例外从文件夹中获取文件
【发布时间】: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
  • 通常不是我怎么做的,但由于标准列在一个单元格内,我采用了这种方法。

标签: vba foreach


【解决方案1】:

听起来您想先检查 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

【讨论】:

  • 我在试图解决函数内部的问题时是盲目的,但你是对的,如果第一次没有找到任何东西,那么只运行两次函数就不会那么混乱了。谢谢!
猜你喜欢
  • 2019-11-24
  • 1970-01-01
  • 2019-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多