thumbnail 一問一答の一歩

【VBA】フォルダ内全てのWordファイルの文字列検索して、個数を出力する

文字を入力した後に入力確認することは正確性を保つために大丈夫なことである。少ないときはプル一フリストのような入力内容の目視確認でよいが、フォルダ内のWordファイルファイル全てとなると面倒になる。そのため、入力内容の確認の一貫として、ExcelVBAでフォルダ内全てのWordファイルの文字列の検索個数について出力して、個数を調べるマクロを作成したので情報共有を行う。

STEP1:プログラムの概要

プログラムの含まれているWordファイルは以下のものを前提とする。

Wordファイルに含まれている表の内容を入力してボタンを押すと、上記の図の下部分ように検索したフォルダ内に含まれていた場合には該当ファイル名と含まれている個数を出力する。

STEP2:使用関数

STEP3 ソースコード

Sub Serch_word_str_count()
'----------------------------------------------
'概要: 指定したフォルダ内のWordファイル内に指定した文字列が含まれている個数を確認する
'機能名: Serch_word_str_count
'引数: なし
'戻り値: なし
'備考1:<https://www.wordvbalab.com/code/462/をモデルに作成>
'----------------------------------------------
    Dim wdApp As Object
    Dim wdDoc As Object
    Dim rng As Object
    Dim count_str As Integer
    Dim inputword As String
    Dim myPath As String
    Dim kakutyoshi As String
    Dim myDocuments_name As String
    Dim myText As String

    'B2のセルに入力したパスを登録する
    myPath = ThisWorkbook.Worksheets(1).Cells(2, 2).Value & "\\"
    If ThisWorkbook.Worksheets(1).Cells(3, 2).Value = "" Then
    'B3のセルが空白であれば、デフォルトでdocxを対象にする
    kakutyoshi = "docx"
    Else
    'B3のセルが入力されていたら、入力した拡張子を登録する
    kakutyoshi = ThisWorkbook.Worksheets(1).Cells(3, 2).Value
    End If
    'B4のセルに入力した検索単語を登録する
    inputword = ThisWorkbook.Worksheets(1).Cells(4, 2).Value
    
    'ファイルシステムのオブジェクトにアクセスする
    Set objFso = CreateObject("Scripting.FileSystemObject")
    Dim objFolder As Object
    Set objFolder = objFso.GetFolder(myPath)
    ' Word アプリケーションを開始
    Set wdApp = CreateObject("Word.Application")
    '正規表現のオブジェクトを設定
    Set myRE = CreateObject("VBScript.RegExp")
    book_number = 1
    'Dir関数がファイル名を返さなくなるまで繰り返す
    For Each f In objFolder.Files
    If Instr (f.name, kakutyoshi)>0 Then
        ' Word 文書を開く
        Set wdDoc = wdApp.Documents.Open(ReadOnly:=True, Filename:=myPath & f.Name)
        myText = wdDoc.Range.Text
        'キーワードの数を数える
        With myRE
            .Pattern = inputword '検索する文字列
            .IgnoreCase = True '大文字と小文字を区別しない
            .Global = True '文字列全体を検索
            Set myMatch = .Execute(myText)
            count_str = myMatch.Count
        End With
        ' 検索処理        
        'Msgbox "「詳細」の個数:" & count_str
        '1列目のセルにファイル名を書き込み
        ThisWorkbook.Worksheets(1).Cells(book_number + 10, 1).Value = f.Name
        '2列目のセルにページ数を書き込み
        ThisWorkbook.Worksheets(1).Cells(book_number + 10, 2).Value = count_str
        'book番号を1増やす
        book_number = book_number + 1
        count_str = 0
        
        ' Word を閉じる
        wdDoc.Close
        End If
    Next f
End Sub