複数ファイルシート一括検索
Windowsにはファイルの内容を検索する機能があります。
しかしExcelを検索する場合、どのファイルにあるかは表示されますが、どのシートにあるかは表示されません。
シートが多いと、そのファイルを開いてから、また検索する必要があります。
そこで、ある文字列について、特定のフォルダにある、すべてのExcelファイルのすべてのシートを検索し、どのシートにあるかを表示するマクロを考えました。
検索結果を表示するだけでなく、該当のセルにハイパーリンクを張るようになっています。
Excel2007で確認しました。
- 適当なExcelファイルを用意します。
- シートの名前を「検索結果」とします。ここに検索結果が表示されます。
- 下に書かれているコード(3つの部分)を標準モジュールに貼り付けます(3つまとめて)。
- マクロ「複数ファイルシート一括検索」を実行します。
- 検索したい文字列を入力します。
- 検索したいフォルダを指定します。
- 検索結果が表示されます。
- 「$A$1」という表示はセルを表し、リンクが張られています。クリックすると該当のファイルを開きジャンプします。
宣言
Const resultsn = "検索結果"
Dim gyo As Long
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
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
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
取得したファイルに対して検索を実行し見付かった場合にはシートに書き出します。
シートを検索する手法とハイパーリンクを張る手法が使われています。





















マクロ初心者です。
一つ筆問なんですが、下層フォルダーまでは検索できない仕様なのでしょうか?
下位のフォルダは検索できません。
手法はありますが、簡単には修正できそうにありません。
申し訳ありません。