【PR】 ワードマクロ集

エクセルデータでワード文書中の文字列をハイライトするマクロ【図解】

2024-02-29

こんな方におすすめ

  • 特定の文字列がワード文書中に存在するかを連続的にチェックしたい

このマクロは、エクセルファイルのA列のデータに基づいてワード文書中の文字列をハイライトするワードマクロ(Word VBA)です。

このマクロは、ワード文書中の特定の文字列の存在チェックに役立ちます。

例えば、誤字脱字をエクセルファイルに登録しておけば、ワード文書中のその存在チェックに役立ちます。

エクセルファイルには複数のシートを登録することができ、マクロ実行時にシートを選択できます。

半角全角の区別、小文字大文字の区別とハイライト色の選択も可能です。

ワイルドカードにも対応できます。

このマクロで使用できる「誤記検出用ワイルドカード詰め合わせパック」も、この記事の一番最後で紹介していますので、よろしければ見てみてください。

\Word VBAを学べる貴重な一冊 /

created by Rinker
¥3,219 (2025/02/18 10:01:28時点 楽天市場調べ-詳細)




概要

このマクロの概要を以下にイラストで示します。

ハイライトマクロの概要1
ハイライトマクロの概要2



詳細説明

マクロの準備

この記事に記載したステップ①の1~6までを実施した後、ステップ①で、この記事の最後にあるコードを標準モジュールのModule1にコピペします。

コピペすると、以下の状態になります。

vbaエディタ

この記事に記載したステップ①8から22までを行ってください

ステップ①の11では、「Project.Module1.HighlightExcelDataInWord」を選択してから、追加ボタンを押してください(以下のイラストのようにしてください)

(ステップ①の13では、お好きなアイコンを選んでください)

(ステップ①の20での保存名は何でもいいです)

クイックアクセスツールバーの設定

以上でマクロの準備が完了しました!

このマクロをどのワード文書からも呼び出せるようにしたい場合は、この記事に記載したステップ②も行ってください。

(このマクロは、ハイライトしたい文書を開いて、そこからマクロを呼び出すことが基本の使用方法になるため、ステップ②を行う方が便利です)

エクセルファイルの作成

以下のイラストのように、ハイライトしたい文字列をエクセルファイルのA列に登録します。

(A列以外の列をメモなどに使用してもかいません。マクロが使用するのはA列のみです)

用途別に複数のシートにデータを登録することができます。

シート名は自由です。

データの登録数に制限はありません。

データ登録用エクセルファイル

登録を削除する場合は、行ごと削除するようにしてください。

以上でエクセルファイルの準備は完了です!

これで、マクロを使用するためのすべての準備が整いました。

マクロの使用方法

以下の手順で簡単にマクロを実行できます(念のためデータのバックアップ後に実行してください)

1.ハイライトしたい各自のワードファイルを開きます(上記の「マクロの準備」でステップ②まで実施した人)

 ステップ①のみを実施した人はハイライトマクロのdotmファイルを開き(上部にセキュリティ警告が出た場合は、「コンテンツの有効化」をクリックしてください)、そのdotmファイルに、ハイライトしたい文書の内容をコピペしてください。

.マクロを実行します。

マクロ実行ボタン

(アイコンは、各自が選んだアイコンになります)

.ハイライトしたい文字列を登録したエクセルファイルを選択します

ファイル選択画面

.使用したいシートを選択します(番号を入力後に「OK」ボタンを押します)

 エクセルファイルに含まれているシートが自動でピックアップされて一覧表示されます。

 使用したいシートの番号を入力してください。

シートの選択画面

.ハイライト色を選択します(番号を入力後に「OK」ボタンを押します)

 好きなハイライト色を数字で選んでください。

 6を選んだ場合は、既にハイライトされている色を解除することができます。

ハイライト色の選択画面

.モードを選択します(番号を入力後に「OK」ボタンを押します)

 半角全角の区別、小文字大文字の区別、ワイルドカードの使用に関して好きなモードを数字で選んでください。

モード選択画面

注)モード5(ワイルドカード使用)を選んだ場合、必然的に小文字大文字半角全角の区別が行われます。

.内容を確認します(よければ「はい」を選択します)

 ハイライト条件が合っているかを確認してください。

ハイライト内容確認画面

 「はい」を押すと処理が始まります。

 処理状況は、ワード文書の左下に表示されます。

処理の進行状況

.エクセルのデータを基にしてワード文書内の該当文字列がハイライトされます

処理が終了すると、以下のメッセージがワード文書の左下に表示されます。

 以下のイラストは、黄色のハイライト色を選んだ場合のものです。

エクセルデータに基づいてハイライトされたワード文書

ハイライト後に、必要に応じてワード文書を保存してください。

(マクロでは、自動保存は行われません)

マクロの使用方法は以上です。




補足説明

モード5(ワイルドカード使用)では、エクセルファイルに登録されているワイルドカードが正しくない場合、以下のメッセージがでます。

エラーのためにスキップした行番を示すメッセージ

この例のメッセージは、行番号20と26に登録されているワイルドカードが正しくないため、これらをスキップしたことを示します。

このメッセージが出た場合は、該当する行番号のワイルドカードの登録を見直してください。



運用例

ペンギン
ペンギン

このマクロってどんな感じで使うと便利なの?

例えば、誤字脱字を発見するたびにエクセルに登録していくといいですよ!

陰キャくじら
陰キャくじら
ペンギン
ペンギン

なるほど~どんどん登録していけば、自分がしやすい間違いを後でまとめてチェックできますね!

はい、普段ワード文書をつくる機会が多い人は特に便利だと思います

陰キャくじら
陰キャくじら




コード

以下は、ハイライトマクロのコードです。

上で説明したように標準モジュールにコピペしてご使用ください。

(以下のコードをすべて選択して、そのまま貼り付けてください)

詳細説明に戻る場合はここをクリックしてください。

現在の公開バージョンはV02L01です(バージョンアップしてワイルドカードに対応しました!)。

旧バージョンはこちらです。

Sub HighlightExcelDataInWord()
'V02L01 (20241221)
    Dim fd As FileDialog
    Dim excelFilePath As String
    Dim xlApp As Object, xlBook As Object
    Dim sheetNames() As String
    Dim i As Integer
    Dim sheetNameList As String
    Dim selectedSheetNumber As Variant
    Dim highlightColors As Variant
    Dim colorList As String
    Dim selectedColorNumber As Variant
    Dim highlightColor As Long
    Dim rng As Range
    Dim xlSheet As Object
    Dim cell As Object
    Dim mode As Variant
    Dim distinguishFullHalfWidth As Boolean
    Dim useWildCard As Boolean
    Dim distinguishCase As Boolean
    Dim lastRow As Long
    Dim EmptyFlag As Boolean
    Dim RowCount As Long
    Dim ErroFlg As Boolean
    Dim RowCountArray() As Long
    Dim RowCountArrayIndex As Long
    Dim ErrorMessage As String

    ' Show Excel file selection dialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    fd.Title = "エクセルファイルを選択してください"
    fd.Filters.Clear
    fd.Filters.Add "Excel Files", "*.xls; *.xlsx; *.xlsm"
    If fd.Show = False Then Exit Sub
    excelFilePath = fd.SelectedItems(1)
    
    ' Check if the file is already open
    If isFileOpen(excelFilePath) Then
        MsgBox "選択したファイルは既に開かれています。閉じてから再度試してください。"
        Exit Sub
    End If
    
    ' Store all sheet names in an array
    Set xlApp = CreateObject("Excel.Application")
    Set xlBook = xlApp.Workbooks.Open(excelFilePath)
    ReDim sheetNames(1 To xlBook.Sheets.Count)
    For i = 1 To xlBook.Sheets.Count
        sheetNames(i) = xlBook.Sheets(i).Name
    Next i
    
    ' Show all sheet names in an input box
    For i = 1 To UBound(sheetNames)
        sheetNameList = sheetNameList & i & ": " & sheetNames(i) & vbCrLf
    Next i
    
    Do
        selectedSheetNumber = InputBox("シートの番号(全角でも半角でも可)を入力してください" & vbCrLf & vbCrLf & vbCrLf & sheetNameList, "シートの選択")
        
        ' Check if the input box was cancelled or nothing was entered
        If selectedSheetNumber = "" Then
            If StrPtr(selectedSheetNumber) = 0 Then
                xlBook.Close SaveChanges:=False
                xlApp.Quit
                Exit Sub
            Else
                MsgBox "番号を入力してください。"
            End If
        Else
            ' Check if the input is a valid number
            If IsNumeric(selectedSheetNumber) Then
                If selectedSheetNumber < 1 Or selectedSheetNumber > UBound(sheetNames) Then
                    MsgBox "無効な番号が入力されました。"
                Else
                    Exit Do
                End If
            Else
                MsgBox "無効な番号が入力されました。"
            End If
        End If
    Loop

    ' Show input box to select highlight color
    highlightColors = Array("黄色", "グレー", "水色", "緑色", "青緑", "ハイライト解除")
    For i = 0 To UBound(highlightColors)
        colorList = colorList & i + 1 & ": " & highlightColors(i) & vbCrLf
    Next i
    
    Do
        selectedColorNumber = InputBox("ハイライト色の番号(全角でも半角でも可)を入力してください:" & vbCrLf & vbCrLf & vbCrLf & colorList, "ハイライト色の選択")
        
        ' Check if the input box was cancelled
        If StrPtr(selectedColorNumber) = 0 Then
            xlBook.Close SaveChanges:=False
            xlApp.Quit
            Exit Sub
        End If
        
        ' Map the selected color to the corresponding Word WdColor constant
        Select Case selectedColorNumber
            Case 1
                highlightColor = wdYellow
            Case 2
                highlightColor = wdGray25
            Case 3
                highlightColor = wdTurquoise
            Case 4
                highlightColor = wdBrightGreen
            Case 5
                highlightColor = wdTeal
            Case 6
                highlightColor = wdNoHighlight
            Case Else
                MsgBox "有効な色番号を入力してください"
                selectedColorNumber = ""
        End Select
    Loop Until selectedColorNumber <> ""

    Do
        ' Show input box to select mode
        mode = InputBox(Prompt:="モードの番号(全角でも半角でも可)を入力してください:" & vbCrLf & vbCrLf & vbCrLf & _
                        " 1: 半角全角の区別なし、小文字大文字の区別なし" & vbCrLf & vbCrLf & _
                        " 2: 半角全角の区別あり、小文字大文字の区別なし" & vbCrLf & vbCrLf & _
                        " 3: 半角全角の区別なし、小文字大文字の区別あり" & vbCrLf & vbCrLf & _
                        " 4: 半角全角の区別あり、小文字大文字の区別あり" & vbCrLf & vbCrLf & _
                        " 5: ワイルドカード使用(半角全角と小文字大文字が区別されます)" & vbCrLf & vbCrLf, _
                        Title:="モードの選択")
    
        ' Exit if cancelled
        If mode = "" Then
            If StrPtr(mode) = 0 Then
                xlBook.Close SaveChanges:=False
                xlApp.Quit
                Exit Sub
            End If
        End If
        
        Select Case mode
            Case 1
                distinguishFullHalfWidth = False
                distinguishCase = False
                useWildCard = False
                modeMessage = "検索モード:半角全角の区別なし、小文字大文字の区別なし"
                Exit Do
            Case 2
                distinguishFullHalfWidth = True
                distinguishCase = False
                useWildCard = False
                modeMessage = "検索モード:半角全角の区別あり、小文字大文字の区別なし"
                Exit Do
            Case 3
                distinguishFullHalfWidth = False
                distinguishCase = True
                useWildCard = False
                modeMessage = "検索モード: 半角全角の区別なし、小文字大文字の区別あり"
                Exit Do
            Case 4
                distinguishFullHalfWidth = True
                distinguishCase = True
                useWildCard = False
                modeMessage = "検索モード:半角全角の区別あり、小文字大文字の区別あり"
                Exit Do
            Case 5
                distinguishFullHalfWidth = False
                distinguishCase = False
                useWildCard = True
                modeMessage = "ワイルドカード使用(半角全角と小文字大文字が区別されます)"
                Exit Do
            Case Else
                MsgBox "有効なモードを入力してください"
        End Select
    Loop

    ' Display confirmation message to the user
    msgBoxResult = MsgBox("以下の条件で検索します。よろしいですか" & vbCr & vbCr & _
                "選択シート:" & sheetNames(selectedSheetNumber) & vbCr & "ハイライト色:" & highlightColors(selectedColorNumber - 1) & vbCr & modeMessage, vbYesNo + vbDefaultButton2, "確認")
    If msgBoxResult = vbNo Then
        xlBook.Close SaveChanges:=False
        xlApp.Quit
        Exit Sub ' If the user selects "No", the process will terminate
    End If
        
    ' Search A column values in Word and highlight
    Set rng = ActiveDocument.Content
    Set xlSheet = xlBook.Sheets(sheetNames(selectedSheetNumber))
    
    ' Get the last non-blank cell in column A
    lastRow = xlSheet.UsedRange.Row + xlSheet.UsedRange.Rows.Count - 1
    
    ' Check if column A is empty
    If lastRow = 1 And IsEmpty(xlSheet.Cells(1, 1).Value) Then
        MsgBox "A列にデータが存在しません"
        xlBook.Close SaveChanges:=False
        xlApp.Quit
        Exit Sub
    End If

    ReDim RowCountArray(0)
    RowCountArrayIndex = 0
    EmptyFlag = True
    ErroFlg = False
    RowCount = 0
    For Each cell In xlSheet.Range(xlSheet.Cells(1, 1), xlSheet.Cells(lastRow, 1))
        RowCount = RowCount + 1
        Call UpdateStatusBar(RowCount, lastRow)
        ' Skip if the cell is empty
        If IsEmpty(cell.Value) Then GoTo NextCell
        EmptyFlag = False
        ' Search in the main document
        Set rng = ActiveDocument.Content ' Reset the range before each search
        With rng.Find
            .Text = cell.Value
            .MatchCase = distinguishCase ' Match case
            .MatchByte = distinguishFullHalfWidth ' Match full/half width
            .MatchFuzzy = False ' Turn off fuzzy matching
            .MatchWildcards = useWildCard
            On Error GoTo ErrorHandler
            Do While .Execute
                If .Found = True Then
                    rng.HighlightColorIndex = highlightColor
                    rng.Collapse wdCollapseEnd ' Move the range after the found text
                End If
            Loop
        End With
        ' Search in all text boxes
        For Each shp In ActiveDocument.Shapes
            If shp.Type = msoTextBox Then
                Set rng = shp.TextFrame.TextRange
                With rng.Find
                    .Text = cell.Value
                    .MatchCase = distinguishCase ' Match case
                    .MatchByte = distinguishFullHalfWidth ' Match full/half width
                    .MatchFuzzy = False ' Turn off fuzzy matching
                    .MatchWildcards = useWildCard
                    On Error GoTo ErrorHandler
                    Do While .Execute
                        If .Found = True Then
                            rng.HighlightColorIndex = highlightColor
                            rng.Collapse wdCollapseEnd ' Move the range after the found text
                        End If
                    Loop
                End With
            End If
        Next shp
NextCell:
    Next cell
    
    ReDim Preserve RowCountArray(RowCountArrayIndex)
    ' メッセージボックスに表示する文字列

    ErrorMessage = "以下の行番号ではエラーが発生したためハイライト処理をスキップしました。登録文字列を見直してください:" & vbNewLine & vbNewLine
    
    ' 配列の内容をErrorMessageに追加
    For i = 0 To UBound(RowCountArray) - 1
        ErrorMessage = ErrorMessage & RowCountArray(i) & vbNewLine
    Next i

    ' Close Excel and release all objects
    xlBook.Close SaveChanges:=False
    xlApp.Quit
    Set rng = Nothing
    Set xlSheet = Nothing
    Set xlBook = Nothing
    Set xlApp = Nothing
    
    Application.StatusBar = "処理が終了しました"
    
    If EmptyFlag = True Then
        MsgBox "A列にデータが存在しません"
        Exit Sub
    End If

    If ErroFlg = True Then
        MsgBox ErrorMessage, vbExclamation
    End If

    Exit Sub
    
ErrorHandler:

    ErroFlg = True
    RowCountArray(UBound(RowCountArray)) = RowCount
    RowCountArrayIndex = RowCountArrayIndex + 1
    ReDim Preserve RowCountArray(UBound(RowCountArray) + 1)
    Resume NextCell

End Sub

Function isFileOpen(filePath) As Boolean
    Dim ff As Long
    On Error Resume Next
    ff = FreeFile()
    Open filePath For Input Lock Read As #ff
    isFileOpen = IIf(Err.Number <> 0, True, False)
    Close #ff
End Function

Sub UpdateStatusBar(num As Long, denom As Long)
    If denom <> 0 Then
        Dim percent As Double
        percent = num / denom * 100
        Application.StatusBar = "処理中: " & Format(percent, "0.0") & "% 完了"
    Else
        Application.StatusBar = "分母が0です。パーセントを計算できません。"
    End If
End Sub

詳細説明に戻る場合はここをクリックしてください。



このマクロで使える誤記検出用ワイルドカード詰め合わせパック

以下の有料部分では、このマクロで使える誤記検出用ワイルドカードを詰め合わせたエクセルファイルを格安で販売しています(以下では、「詰め合わせパック」と称します)。

この詰め合わせパックは、当ブログに掲載しているワイルドカードから、誤記発見に役立つものを集めて、さらにアレンジしたものです。

以下は、この詰め合わせパックで検出できる誤記の一例です。

ご購入にあたっては、以下をご一読ください。

【スポンサーリンク】



-ワードマクロ集
-, ,