指定したフォルダ配下でファイル名に特定の文字列を含み、かつ含んではならない文字列が含まれていないファイルを検索
タイトルのマクロは、以下です。
'**************************************
'* 文字列を検索して、ファイル名を返す。
'* 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
全体の概要
GetFilePath
サブルーチン:- 指定したフォルダパス内のファイルを検索し、特定の条件を満たすファイルのフルパスを取得します。
FileSerch
プライベートサブルーチン:- フォルダ内のファイルおよびサブフォルダ内のファイルを再帰的に処理し、条件を満たすファイルを検索します。
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
に格納され、メッセージボックスに表示されます。
このマクロは、特定の文字列が複数の検索条件を満たし、かつ複数の除外条件を満たさないかどうかを判断するための使用例です。