指定したフォルダ配下でファイル名に特定の文字列を含み、かつ含んではならない文字列が含まれていないファイルを検索

タイトルのマクロは、以下です。

'**************************************
'* 文字列を検索して、ファイル名を返す。
'* folderPath:フォルダ名
'* searchStrings: ファイル名に全て含まれているべき文字列の配列
'* excludeStrings: ファイル名に含まれていてはならない文字列の配列
'* filePath: 条件を満たすファイルのフルパスを格納する変数
Sub GetFilePath(ByVal folderPath As String, ByRef searchStrings() As String, _
                ByRef excludeStrings() As String, ByRef filePath As String)
    Dim FSO As Object
    Dim folder As Object

    ' FileSystemObjectの作成
    Set FSO = CreateObject("Scripting.FileSystemObject")
    ' フォルダオブジェクトを取得
    Set folder = FSO.GetFolder(folderPath)

    ' フォルダ内のファイルとサブフォルダを再帰的に処理
    Call FileSerch(folder, searchStrings(), excludeStrings(), filePath)

    ' クリーニングアップ
    Set folder = Nothing
    Set FSO = Nothing
End Sub

'*******************************
'* フォルダ内のすべてのファイルから、特定の文字列を含むファイルのフルパスを取得する
'* folder:フォルダオブジェクト
'* searchStrings: ファイル名に全て含まれているべき文字列の配列
'* excludeStrings: ファイル名に含まれていてはならない文字列の配列
'* filePath: 条件を満たすファイルのフルパスを格納する変数
Private Sub FileSerch(ByRef folder As Object, ByRef searchStrings() As String, _
                ByRef excludeStrings() As String, ByRef filePath As String)
    Dim file As Object
    Dim subFolder As Object
    
    ' フォルダ内のすべてのファイルを処理
    For Each file In folder.Files
        If MultipleIncludesAndExcludes(file.Name, searchStrings(), excludeStrings()) Then
            filePath = file.Path
            Exit For
        End If
    Next file

    ' サブフォルダ内のファイルを再帰的に処理
    For Each subFolder In folder.SubFolders
        Call FileSerch(subFolder, searchStrings(), excludeStrings(), filePath)
    Next subFolder
End Sub
            
'**************************************************************
'* 複数の文字列を含みかつ複数の文字列を含まない、かどうかを判断
'* str: チェック対象の文字列
'* searchStrings: str に全て含まれているべき文字列の配列
'* excludeStrings: str に含まれていてはならない文字列の配列
'* 戻り値:trueで該当、falseで非該当
Private Function MultipleIncludesAndExcludes(ByVal str As String, _
            ByRef searchStrings() As String, _
            ByRef excludeStrings() As String) As Boolean

    ' 判定フラグを初期化(初期値は該当するものとしてTrue)
    Dim isMatche As Boolean
    isMatche = True

    ' ループ変数の宣言
    Dim i As Long
    
    ' 検索文字列が全て含まれているか確認
    For i = LBound(searchStrings) To UBound(searchStrings)
        ' 各検索文字列がstrに含まれていない場合、判定フラグをFalseに設定
        If InStr(str, searchStrings(i)) = 0 Then
            isMatche = False
        End If
    Next i

    ' 除外文字列が含まれていないか確認
    For i = LBound(excludeStrings) To UBound(excludeStrings)
        ' 各除外文字列がstrに含まれている場合、判定フラグをFalseに設定
        If InStr(str, excludeStrings(i)) > 0 And excludeStrings(i) <> "" Then
            isMatche = False
        End If
    Next i

    ' 判定フラグの値を関数の戻り値として返す
    MultipleIncludesAndExcludes = isMatche
End Function

全体の概要

  1. GetFilePath サブルーチン:
    • 指定したフォルダパス内のファイルを検索し、特定の条件を満たすファイルのフルパスを取得します。
  2. FileSerch プライベートサブルーチン:
    • フォルダ内のファイルおよびサブフォルダ内のファイルを再帰的に処理し、条件を満たすファイルを検索します。
  3. MultipleIncludesAndExcludes 関数:
    • ファイル名が特定の検索文字列を全て含み、かつ除外文字列を含まないかどうかを判断します。

詳細な説明

GetFilePath サブルーチン

  • folderPath: ファイルを検索するフォルダのパス。
  • searchStrings: ファイル名に含まれているべき文字列の配列。
  • excludeStrings: ファイル名に含まれていてはならない文字列の配列。
  • filePath: 条件を満たすファイルのフルパスを格納する変数。

このサブルーチンは、指定したフォルダ内およびサブフォルダ内のすべてのファイルを再帰的に処理して、条件を満たすファイルのフルパスを取得します。

FileSerch プライベートサブルーチン

  • folder: 現在処理中のフォルダオブジェクト。
  • searchStrings: ファイル名に含まれているべき文字列の配列。
  • excludeStrings: ファイル名に含まれていてはならない文字列の配列。
  • filePath: 条件を満たすファイルのフルパスを格納する変数。

このサブルーチンは、指定したフォルダ内のすべてのファイルをチェックし、条件を満たすファイルが見つかった場合、そのファイルのフルパスを取得します。また、サブフォルダ内のファイルも再帰的にチェックします。

MultipleIncludesAndExcludes 関数

説明は、以下を参考にしてください。

使用例

このマクロを実行するためには、以下のように GetFilePath サブルーチンを呼び出します。

Sub TestGetFilePath()
    Dim folderPath As String
    Dim searchStrings(1) As String
    Dim excludeStrings(1) As String
    Dim filePath As String
    
    ' フォルダパスを設定
    folderPath = "C:\TEMP"
    
    ' 検索文字列の配列を設定
    searchStrings(0) = "test"
    searchStrings(1) = "2024"
    
    ' 除外文字列の配列を設定
    excludeStrings(0) = "draft"
    excludeStrings(1) = "backup"
    
    ' ファイルパスを取得
    Call GetFilePath(folderPath, searchStrings, excludeStrings, filePath)
    
    ' 結果を表示
    MsgBox "Found file: " & filePath
End Sub

このサブルーチンを実行すると、指定したフォルダパス内およびサブフォルダ内で、searchStrings 配列の文字列をすべて含み、excludeStrings 配列の文字列を含まない最初のファイルのフルパスが filePath に格納され、メッセージボックスに表示されます。

このマクロは、特定の文字列が複数の検索条件を満たし、かつ複数の除外条件を満たさないかどうかを判断するための使用例です。

Follow me!