トップ > 汎用コード > 指定フォルダの全ブック対象に一括検索

指定フォルダの全ブック対象に一括検索2021.05.10 更新:2025.11.22

指定フォルダの全ブック・全シートを対象に、任意の文字列を一括検索するマクロです。

マクロ「searchAllBooksForAnyString」を実行すると、フォルダ参照ダイアログが表示されます。
フォルダを選択すると、そのフォルダ内の、全てのExcelブックの全シートを対象に、検索を開始します。
検索の結果は、新しいブックにまとめて出力されます(下図参照)。



検索する文字列は、複数の指定が可能です。


【お薦め】マクロ・プロシージャを管理する無料のツール!
 Excelマクロ管理ツール

サンプルコード

コードの貼り付け場所   VBAコードをカラーで印刷・Web掲載するためのツールはこちら

'--------------------------------------------------------
' 指定フォルダ内の全てのブックから任意の文字列を検索する
'--------------------------------------------------------
' ※非表示のセルは検索対象外です
'[作成日]2021.05.10 [更新日]2025.11.22
' https://excel.syogyoumujou.com/vba/find_allbooks.html
'--------------------------------------------------------
Sub searchAllBooksForAnyString()
    '--------------------------------
    ' 検索する文字列を配列として設定
    '--------------------------------
    Dim varArray As Variant
    varArray = Array("奈良市", "鎌倉市") ' 検索文字列

    '--------------------------------
    ' フォルダの選択
    '--------------------------------
    Dim strFolderPath As String
    With Application.FileDialog(msoFileDialogFolderPicker)
        If .Show = True Then strFolderPath = .SelectedItems(1)
    End With
    If Len(strFolderPath) = 0 Then Exit Sub

    '--------------------------------
    ' フォルダの存在確認
    '--------------------------------
    If Dir(strFolderPath, vbDirectory) = "" Then
        MsgBox "対象のフォルダが見つかりません", vbExclamation, "終了します"
        Exit Sub
    End If

    '--------------------------------
    ' フォルダ内ブックを検索
    '--------------------------------
    Dim strFileName As String
    strFolderPath = strFolderPath & Application.PathSeparator ' フォルダパスに区切り文字追加
    strFileName = Dir(strFolderPath & "*.xls?")               ' フォルダからExcelブックを検索
    If strFileName = "" Then                                  ' ブックのパスを取得できなければ終了
        MsgBox "指定フォルダ内にExcelブックが見つかりません", vbExclamation, "終了します"
        Exit Sub
    End If
    
    ' ファイルパスをコレクションに追加
    Dim colFilePath As New Collection
    Do
        colFilePath.Add strFolderPath & strFileName, CStr(colFilePath.Count + 1)
        strFileName = Dir()
    Loop Until strFileName = ""
    
    
    Application.ScreenUpdating = False                        ' 画面更新無効
    Application.EnableEvents = False                          ' イベント無効

    '--------------------------------
    ' 新規ブック追加・見出し設定
    '--------------------------------
    Dim shtWrite As Worksheet ' 書き込みシート
    Set shtWrite = Workbooks.Add.Worksheets(1)
    shtWrite.Range("A1:B1").Value = Array("検索日時", Now())
    shtWrite.Range("A3:B3").Value = Array("検索値", Join$(varArray, ","))
    shtWrite.Range("A5:D5").Value = Array("ブック名", "シート名", "セルアドレス", "値")
    shtWrite.Range("A1:A3,A5:D5").Interior.Color = RGB(217, 217, 217)
    
    '--------------------------------
    ' ブック内から文字列を検索
    '--------------------------------
    Dim i         As Long
    Dim wbkTarget As Workbook
    Dim shtTarget As Worksheet
    Dim rngTarget As Range
    Dim rng       As Range
    Dim varWhat   As Variant
    Dim lngCount  As Long
On Error Resume Next
    For i = 1 To colFilePath.Count
        ' ブックを開く
        Set wbkTarget = Workbooks.Open(colFilePath.Item(CStr(i)))
        
        If Not wbkTarget Is Nothing Then
            '各シートで検索を実行
            For Each shtTarget In wbkTarget.Worksheets
                For Each varWhat In varArray
                    '《対象セル範囲から任意の文字列を検索》
                    Set rngTarget = findTargetCell(shtTarget.Cells, varWhat)
                    
                    ' 検索に一致するセルが存在する場合は新規ブックに情報を書き込み
                    If Not rngTarget Is Nothing Then
                        For Each rng In rngTarget
                            With shtWrite.Cells(6 + lngCount, "A").Resize(1, 4)
                                .Value = Array(wbkTarget.Name, _
                                               shtTarget.Name, _
                                               rng.Address(False, False), _
                                               rng.Value)
                                lngCount = lngCount + 1
                            End With
                        Next
                    End If
                Next
            Next
            ' 開いたブックを保存せずに閉じる
            wbkTarget.Close SaveChanges:=False
        End If
        
        Set wbkTarget = Nothing
    Next
On Error GoTo 0

    '--------------------------------
    ' 検索値が見つからなければ終了
    '--------------------------------
    If lngCount = 0 Then
        shtWrite.Parent.Close SaveChanges:=False
        MsgBox "検索値は見つかりませんでした", vbInformation
        GoTo LBL_FINALLY
    End If

    '--------------------------------
    ' 新規ブックレイアウト調整
    '--------------------------------
    shtWrite.Columns("A:C").AutoFit  ' A~C列を自動調整する
    shtWrite.Columns("D:D").ColumnWidth = 100
    shtWrite.Range("A2:B2").Value = Array("フォルダ", Left$(strFolderPath, Len(strFolderPath) - 1))

    MsgBox "検索終了", vbInformation

LBL_FINALLY:
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

'-------------------------------------------------------------------------------- ' 対象セル範囲から任意の文字列を検索 '-------------------------------------------------------------------------------- '[引数] ' rngTarget :対象セル範囲 ' What :検索する文字列 ' LookIn :情報種類 値:xlValues[既定] 数式:xlFormulas コメント文:xlComments ' LookAt :一致の種類 部分一致:xlPart[既定] 全体一致:xlWhole ' SearchOrder :検索方法 1行ごと検索:xlByRows[既定] 1列ごと検索:xlByColumns ' SearchDirection:検索順 一致する次の値:xlNext[既定] 一致する前の値:xlPrevious ' MatchCase :大文字・小文字の区別 区別する:True 区別しない:False[既定] ' MatchByte :全角・半角の区別 区別する:True 区別しない:False[既定] '[戻り値] ' 検索に一致したセルの集合 検索値がない場合はNothing '[作成日]2023.12.19 [更新日]2025.11.22 ' https://excel.syogyoumujou.com/vba/find_allbooks.html '-------------------------------------------------------------------------------- Function findTargetCell(ByRef rngTarget As Range, _ ByVal What As String, _ Optional ByVal LookIn As XlFindLookIn = xlValues, _ Optional ByVal LookAt As XlLookAt = xlPart, _ Optional ByVal SearchOrder As XlSearchOrder = xlByRows, _ Optional ByVal SearchDirection As XlSearchDirection = xlNext, _ Optional ByVal MatchCase As Boolean = False, _ Optional ByVal MatchByte As Boolean = False) As Range ' 検索セル範囲を最適化 Set rngTarget = Intersect(rngTarget, rngTarget.Worksheet.UsedRange) If rngTarget Is Nothing Then Exit Function ' 検索実行 Dim rngFind As Range Set rngFind = rngTarget.Find(What, , LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte) ' 検索に一致のセルがない場合 If rngFind Is Nothing Then ' ※ 結合セルで検索に一致しないケースがあるため その対策処理 If SearchOrder = xlByRows Then SearchOrder = xlByColumns Else SearchOrder = xlByRows Set rngFind = rngTarget.Find(What, , LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte) If rngFind Is Nothing Then Exit Function End If Dim strAddress As String Dim rngUnion As Range strAddress = rngFind.Address '最初に検索一致したセルのアドレスを取得 Set rngUnion = rngFind Do Set rngUnion = Union(rngUnion, rngFind) 'セルを集合 Set rngFind = rngTarget.FindNext(rngFind) '次の一致セルを検索 If rngFind Is Nothing Then Exit Do Loop Until strAddress = rngFind.Address 'セルアドレスが最初のセルと同じ場合はループを抜ける Set findTargetCell = rngUnion End Function

「検索文字列」
 検索する文字列です。検索文字列の追加は、次の例を参考にしてください。
 例:Array("奈良市", "鎌倉市") → Array("奈良市", "鎌倉市", "仙台市", "福岡市")

サンプルコード 22025.11.22

指定したフォルダとその配下フォルダ内の全てのExcelファイルを検索対象とするサンプルコードです。

'---------------------------------------------------------------
' 指定フォルダ・配下フォルダ内の全ブックから任意の文字列を検索
'---------------------------------------------------------------
' ※非表示のセルは検索対象外です
'[作成日]2025.11.22
' https://excel.syogyoumujou.com/vba/find_allbooks.html#code2
'---------------------------------------------------------------
Sub 指定フォルダ配下フォルダの全ブックから任意の文字列を検索()
    '--------------------------------
    ' 検索する文字列を配列として設定
    '--------------------------------
    Dim varArray As Variant
    varArray = Array("神奈川県", "千葉県") ' 検索文字列

    '--------------------------------
    ' 指定・配下の全フォルダパス取得
    '--------------------------------
    Dim colFolderPath As New Collection
    '《指定フォルダ・配下フォルダのパス取得》
    ' ** 引数1:基準とするフォルダパス
    ' ** 引数2:フォルダパスを追加するコレクション
    '   戻り値: 0:成功
    '           -1:フォルダ選択ダイアログボックスで「キャンセル」を選択
    If getSubordinateFolders("", colFolderPath) = -1 Then Exit Sub
    
    ' 基準フォルダパス
    Dim strFolderPath As String
    strFolderPath = colFolderPath.Item(CStr(1))

    '--------------------------------
    ' 各フォルダのExcelパスを取得
    '--------------------------------
    Dim varFolderPath As Variant
    Dim strTarget     As String
    Dim colFilePath   As New Collection
    
    For Each varFolderPath In colFolderPath
        ' フォルダパスにフォルダ区切り文字追加
        varFolderPath = varFolderPath & Application.PathSeparator
        
        ' フォルダ内のExcelファイルを検索
        strTarget = Dir(varFolderPath & "*.xls?")

        Do Until strTarget = "" ' ファイルがなければ抜ける
            ' ファイルパスをコレクションに追加
            colFilePath.Add varFolderPath & strTarget, CStr(colFilePath.Count + 1)
            
            ' 次のファイル検索
            strTarget = Dir()
        Loop
    Next
    
    ' ファイルパス数が 0 の場合は終了
    If colFilePath.Count = 0 Then
        MsgBox "Excelファイルは見つかりませんでした", vbInformation
        Exit Sub
    End If
    
' -- 検索・出力 --

    Application.ScreenUpdating = False      ' 画面更新無効
    Application.EnableEvents = False        ' イベント無効

    '--------------------------------
    ' 新規ブック追加・見出し設定
    '--------------------------------
    Dim shtWrite As Worksheet ' 書き込みシート
    Set shtWrite = Workbooks.Add.Worksheets(1)
    shtWrite.Range("A1:B1").Value = Array("検索日時", Now())
    shtWrite.Range("A3:B3").Value = Array("検索値", Join$(varArray, ","))
    shtWrite.Range("A5:E5").Value = Array("ブック名", "シート名", "セルアドレス", "値", "フォルダ")
    shtWrite.Range("A1:A3,A5:E5").Interior.Color = RGB(217, 217, 217)
    
    '--------------------------------
    ' ブック内から文字列を検索
    '--------------------------------
    Dim i         As Long
    Dim wbkTarget As Workbook
    Dim shtTarget As Worksheet
    Dim rngTarget As Range
    Dim rng       As Range
    Dim varWhat   As Variant
    Dim lngCount  As Long
    
On Error Resume Next

    For i = 1 To colFilePath.Count
        ' フォルダ内のブックを開く
        Set wbkTarget = Workbooks.Open(colFilePath.Item(CStr(i)))
        
        If Not wbkTarget Is Nothing Then
            '--------------------------------
            'ブックの各シートで検索を実行
            '--------------------------------
            For Each shtTarget In wbkTarget.Worksheets
                For Each varWhat In varArray
                    '《対象セル範囲から任意の文字列を検索》
                    Set rngTarget = findTargetCell(shtTarget.Cells, varWhat)
                    
                    ' 検索に一致するセルが存在する場合は新規ブックに情報を書き込み
                    If Not rngTarget Is Nothing Then
                        For Each rng In rngTarget
                            With shtWrite.Cells(6 + lngCount, "A").Resize(1, 5)
                                .Value = Array(wbkTarget.Name, _
                                               shtTarget.Name, _
                                               rng.Address(False, False), _
                                               rng.Value, _
                                               Mid$(colFilePath.Item(CStr(i)), Len(strFolderPath) + 1))
                                lngCount = lngCount + 1
                            End With
                        Next
                    End If
                Next
            Next
            ' 開いたブックを保存せずに閉じる
            wbkTarget.Close SaveChanges:=False
        End If
        
        Set wbkTarget = Nothing
    Next
    
On Error GoTo 0

    '--------------------------------
    ' 検索値が見つからなければ終了
    '--------------------------------
    If lngCount = 0 Then
        shtWrite.Parent.Close SaveChanges:=False
        MsgBox "検索値は見つかりませんでした", vbInformation
        GoTo LBL_FINALLY
    End If

    '--------------------------------
    ' 新規ブックレイアウト調整
    '--------------------------------
    shtWrite.Columns("A:C").AutoFit  ' A~C列を自動調整する
    shtWrite.Columns("D:E").ColumnWidth = 60
    shtWrite.Range("A2:B2").Value = Array("基準フォルダ", strFolderPath)

    MsgBox "検索終了", vbInformation
    
LBL_FINALLY:
    Application.EnableEvents = True
    Application.ScreenUpdating = True
End Sub

'-------------------------------------------------------------------------------- ' 指定フォルダ・配下フォルダのパス取得(再帰関数) '-------------------------------------------------------------------------------- '[引数] ' FolderPath :対象フォルダパス ' colFolderPath:フォルダパスを追加するコレクションオブジェクト '[戻り値] ' 0:成功 ' -1:フォルダ選択ダイアログボックスで「キャンセル」をクリック '[作成日]2023.07.07 [更新日]2025.11.22 ' https://excel.syogyoumujou.com/vba/find_allbooks.html '-------------------------------------------------------------------------------- Function getSubordinateFolders(ByVal FolderPath As String, _ ByRef colFolderPath As Collection) As Long ' フォルダパスが "" の場合はフォルダ選択ダイアログボックスを表示 If FolderPath = "" Then With Application.FileDialog(msoFileDialogFolderPicker) .Title = "フォルダを選択してください" If .Show = True Then ' フォルダ選択 FolderPath = .SelectedItems(1) Else ' 「キャンセル」をクリックした場合は終了 getSubordinateFolders = -1 Exit Function End If End With End If ' ファイルシステムオブジェクトの生成 Dim fso As Object Set fso = CreateObject("Scripting.FileSystemObject") ' フォルダの存在確認 存在しない場合は抜ける If Not fso.FolderExists(FolderPath) Then Exit Function ' コレクションにフォルダパスを追加 colFolderPath.Add FolderPath, CStr(colFolderPath.Count + 1) ' フォルダパスにフォルダ区切文字を追加 FolderPath = FolderPath & Application.PathSeparator On Error Resume Next Dim F As Object If 0 < fso.GetFolder(FolderPath).SubFolders.Count Then ' サブフォルダが存在する場合 配下のサブフォルダに移る For Each F In fso.GetFolder(FolderPath).SubFolders ' アクセス制限フォルダの場合は抜ける If F Is Nothing Then Exit Function '《再帰》 If getSubordinateFolders(FolderPath & F.Name, colFolderPath) = -1 Then getSubordinateFolders = -1 Exit For End If Next End If On Error GoTo 0 End Function
'-------------------------------------------------------------------------------- ' 対象セル範囲から任意の文字列を検索 '-------------------------------------------------------------------------------- '[引数] ' rngTarget :対象セル範囲 ' What :検索する文字列 ' LookIn :情報種類 値:xlValues[既定] 数式:xlFormulas コメント文:xlComments ' LookAt :一致の種類 部分一致:xlPart[既定] 全体一致:xlWhole ' SearchOrder :検索方法 1行ごと検索:xlByRows[既定] 1列ごと検索:xlByColumns ' SearchDirection:検索順 一致する次の値:xlNext[既定] 一致する前の値:xlPrevious ' MatchCase :大文字・小文字の区別 区別する:True 区別しない:False[既定] ' MatchByte :全角・半角の区別 区別する:True 区別しない:False[既定] '[戻り値] ' 検索に一致したセルの集合 検索値がない場合はNothing '[作成日]2023.12.19 [更新日]2025.11.22 ' https://excel.syogyoumujou.com/vba/find_allbooks.html '-------------------------------------------------------------------------------- Function findTargetCell(ByRef rngTarget As Range, _ ByVal What As String, _ Optional ByVal LookIn As XlFindLookIn = xlValues, _ Optional ByVal LookAt As XlLookAt = xlPart, _ Optional ByVal SearchOrder As XlSearchOrder = xlByRows, _ Optional ByVal SearchDirection As XlSearchDirection = xlNext, _ Optional ByVal MatchCase As Boolean = False, _ Optional ByVal MatchByte As Boolean = False) As Range ' 検索セル範囲を最適化 Set rngTarget = Intersect(rngTarget, rngTarget.Worksheet.UsedRange) If rngTarget Is Nothing Then Exit Function ' 検索実行 Dim rngFind As Range Set rngFind = rngTarget.Find(What, , LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte) ' 検索に一致のセルがない場合 If rngFind Is Nothing Then ' ※ 結合セルで検索に一致しないケースがあるため その対策処理 If SearchOrder = xlByRows Then SearchOrder = xlByColumns Else SearchOrder = xlByRows Set rngFind = rngTarget.Find(What, , LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte) If rngFind Is Nothing Then Exit Function End If Dim strAddress As String Dim rngUnion As Range strAddress = rngFind.Address '最初に検索一致したセルのアドレスを取得 Set rngUnion = rngFind Do Set rngUnion = Union(rngUnion, rngFind) 'セルを集合 Set rngFind = rngTarget.FindNext(rngFind) '次の一致セルを検索 If rngFind Is Nothing Then Exit Do Loop Until strAddress = rngFind.Address 'セルアドレスが最初のセルと同じ場合はループを抜ける Set findTargetCell = rngUnion End Function


ページトップへ戻る

Excel 汎用コード

Copyright(C) 2009- 坂江 保 All Rights Reserved.