ホーム > Excel > 複数ファイルシート一括検索

複数ファイルシート一括検索

2011 年 12 月 22 日 コメントをどうぞ コメント
このエントリーをはてなブックマークに追加
Bookmark this on Yahoo Bookmark

Windowsにはファイルの内容を検索する機能があります。
しかしExcelを検索する場合、どのファイルにあるかは表示されますが、どのシートにあるかは表示されません。
シートが多いと、そのファイルを開いてから、また検索する必要があります。

そこで、ある文字列について、特定のフォルダにある、すべてのExcelファイルのすべてのシートを検索し、どのシートにあるかを表示するマクロを考えました。
検索結果を表示するだけでなく、該当のセルにハイパーリンクを張るようになっています。
Excel2007で確認しました。

  1. 適当なExcelファイルを用意します。
  2. シートの名前を「検索結果」とします。ここに検索結果が表示されます。
  3. 下に書かれているコード(3つの部分)を標準モジュールに貼り付けます(3つまとめて)。
  4. マクロ「複数ファイルシート一括検索」を実行します。
  5. 検索したい文字列を入力します。
  6. 検索したいフォルダを指定します。
  7. 検索結果が表示されます。
  8. 「$A$1」という表示はセルを表し、リンクが張られています。クリックすると該当のファイルを開きジャンプします。

宣言

Const resultsn = "検索結果"
Dim gyo As Long

モジュールの先頭に書きます。

メイン

Sub 複数ファイルシート一括検索()
    Dim myfolder, myfn, myword
    myword = InputBox("検索文字列を入力")
    With Application.FileDialog(msoFileDialogFolderPicker)
        .Title = "フォルダを選択"
        .AllowMultiSelect = False
        If .Show = -1 Then
            myfolder = .SelectedItems(1)
        Else
            Exit Sub
        End If
    End With
    myfn = Dir(myfolder & "\*.xls", vbNormal)
    Sheets(resultsn).Select
    Cells.ClearContents
    Cells(1, 1) = "ファイル名"
    Cells(1, 2) = "シート名"
    Cells(1, 3) = "セルの内容"
    Cells(1, 4) = "リンク"
    gyo = 2
    Do Until myfn = ""
        Call ファイルを検索(myfolder, myfn, myword)
        myfn = Dir
    Loop
    Sheets(resultsn).Select
End Sub

フォルダの中のファイルを取得して、それぞれ処理します。

検索・編集

Function ファイルを検索(myfolder, myfn, myword)
    Dim mysheet
    Dim basefn, mysn, myadress As String
    Dim kekka
    Dim firstaddress As String
    basefn = ThisWorkbook.Name
    Workbooks.Open Filename:=myfn
    For Each mysheet In Worksheets
        mysn = mysheet.Name
        Set kekka = mysheet.Cells.Find(myword)
        If Not kekka Is Nothing Then
            firstaddress = kekka.Address
            Do
                myadress = myfolder & "\" & myfn & "#" & mysn & "!" & kekka.Address
                With Workbooks(basefn).Sheets(resultsn)
                    .Cells(gyo, 1) = myfn
                    .Cells(gyo, 2) = mysn
                    .Cells(gyo, 3) = kekka.Value
                    .Hyperlinks.Add Anchor:=.Range("D" & gyo), _
                        Address:=myadress, _
                        TextToDisplay:=kekka.Address
                End With
                gyo = gyo + 1
                Set kekka = mysheet.Cells.FindNext(kekka)
            Loop While Not kekka Is Nothing And kekka.Address <> firstaddress
        End If
    Next
    Workbooks(myfn).Close
End Function

取得したファイルに対して検索を実行し見付かった場合にはシートに書き出します。
シートを検索する手法とハイパーリンクを張る手法が使われています。

カテゴリー: Excel タグ: ,
  1. くまさん
    2012 年 2 月 17 日 09:49 | #1

    マクロ初心者です。
    一つ筆問なんですが、下層フォルダーまでは検索できない仕様なのでしょうか?

  2. 2012 年 2 月 17 日 13:53 | #2

    下位のフォルダは検索できません。
    手法はありますが、簡単には修正できそうにありません。
    申し訳ありません。

  1. トラックバックはまだありません。