【入門編】【初心者向け】Word表のセル内にある特定キーワードを検出し、その行全体を強調表示するマクロ – Word VBA解析バイブル

スポンサーリンク
スポンサーリンク

「マクロの記録」を卒業しよう:Word表の特定キーワードで「行全体」を瞬時に色付けする極意

「マクロの記録」ボタンを押して、一生懸命操作を記録する。
最初はそれで十分かもしれません。でも、あなたが「もし、この表の中に『重要』という文字が入っていたら、その行を全部赤くしたい」と考えたとき、マクロの記録では限界がやってきます。

なぜなら、マクロの記録は「あなたが今どこをクリックしたか」という点の記録であって、「条件によって動きを変える」という論理(ロジック)を持たないからです。

今日は、その壁を乗り越え、Word VBAの真の力を引き出す第一歩として、「表の中を探索し、条件に合う行をまるごと装飾する」という、実務で極めて汎用性の高いテクニックを伝授します。

ここをマスターすれば、Word VBAの基本構造である「オブジェクトの階層構造」が手に取るように分かるはずですよ。

1. 設計図を描こう:Wordの「階層構造」を理解する

コードを書く前に、まずはWordという巨大な迷宮の「地図」を頭に入れましょう。プロのエンジニアは、いきなりコードを打ち込みません。まずオブジェクトの親子関係を整理します。

Wordの表(Table)は、以下のような入れ子構造(ネスト構造)になっています。

1. Document(文書全体)

  • Tables(文書内のすべての表の集合)
  • Table(個別の表)
  • Rows(表の中の行の集合)
  • Cells(行の中のセルの集合)
  • Range(セル内のテキスト領域)

今回のミッションは、「すべての表」の中にある「すべての行」を一つずつ調べ、「セル」の中に特定の文字があるか確認し、見つかったらその「行」の色を変える、というものです。

この「箱の中に箱が入っている」イメージこそが、VBAのループ処理(繰り返し)の本質です。

2. 実践:キーワード検出&行ハイライト・マクロ

それでは、実際に動くコードを見てみましょう。初心者の方でも読みやすいよう、丁寧にコメントを添えています。

Sub HighlightRowsByKeyword()
    ' --- 変数の宣言(プロの基本です。メモリの管理を明確にします) ---
    Dim targetDoc As Document
    Dim targetTable As Table
    Dim targetRow As Row
    Dim targetCell As Cell
    Dim keyword As String
    Dim foundFlag As Boolean

    ' --- 設定エリア ---
    Set targetDoc = ActiveDocument    ' 今開いている文書を対象にする
    keyword = "重要"                 ' 探したいキーワードを指定
    
    ' 画面更新を停止(処理速度を上げるためのテクニックです)
    Application.ScreenUpdating = False

    ' --- メイン処理:表のループ ---
    ' 文書内のすべての表に対して処理を行う
    For Each targetTable In targetDoc.Tables
        
        ' 表の中のすべての行に対して処理を行う
        For Each targetRow In targetTable.Rows
            
            ' その行にキーワードがあるか判定するためのフラグをリセット
            foundFlag = False
            
            ' 行の中のすべてのセルに対して処理を行う
            For Each targetCell In targetRow.Cells
                
                ' 【重要!】セルのテキストをチェック
                ' セル内のテキストには、Word特有の制御文字が含まれるため、InStr関数で判定します
                If InStr(targetCell.Range.Text, keyword) > 0 Then
                    foundFlag = True
                    Exit For ' キーワードが見つかったら、その行の残りのセルを調べる必要はないのでループを抜ける
                End If
                
            Next targetCell
            
            ' --- 装飾処理 ---
            ' もし行の中にキーワードが見つかっていたら、行全体の背景色を変更する
            If foundFlag = True Then
                ' 行全体の背景色を黄色にする
                targetRow.Range.Shading.BackgroundPatternColor = wdColorYellow
                ' ついでにフォントを太字にする(お好みで)
                targetRow.Range.Font.Bold = True
            Else
                ' キーワードがない場合は、装飾をクリアする(再実行時に色が残らないようにするため)
                targetRow.Range.Shading.BackgroundPatternColor = wdColorAutomatic
                targetRow.Range.Font.Bold = False
            End If
            
        Next targetRow
        
    Next targetTable

    ' 画面更新を再開
    Application.ScreenUpdating = True

    MsgBox "処理が完了しました!", vbInformation
End Sub

3. ここが落とし穴!伝説のエンジニアが教える「回避術」

このコードをコピーして動かす前に、絶対に知っておいてほしい「プロの知見」が2つあります。ここを理解していないと、なぜか動かない!という壁にぶち当たります。

① セルの中に潜む「見えない文字」の罠

初心者の方が最も陥りやすいミスがこれです。
Wordのセル内のテキストを取得すると、見た目には見えない「セルの終わりを示す特殊な記号(制御文字)」が必ず末尾に付いてきます。

例えば、セルに「重要」とだけ書かれていても、プログラムが読み取る値は `”重要” & Chr(13) & Chr(7)` のようになっています。

そのため、
`If targetCell.Range.Text = “重要” Then`
という書き方をすると、絶対に一致しません。

【解決策】
今回のように `InStr` 関数を使いましょう。`InStr` は「指定した文字列が、対象の中に含まれているか」を判定する関数です。これなら、後ろにゴミ(制御文字)がついていても、正しく検知できます。

② 「Exit For」によるパフォーマンス最適化

コードの中に `Exit For` という記述を入れましたね。これは「見つかったから、もうこの行の残りのセルを見るのはやめよう」という命令です。

もし、1行に100個のセルがある表で、最初のセルにキーワードが見つかった場合、`Exit For` がなければ残りの99個のセルを無駄にチェックし続けてしまいます。
大きな文書を扱うとき、この「小さな配慮」の積み重ねが、処理速度の決定的な差となって現れるのです。

4. まとめ:次のステップへ

今回のコードで、あなたは以下の3つの強力な武器を手に入れました。

1. 階層構造の操作: `Document` $\to$ `Table` $\to$ `Row` $\to$ `Cell` と辿る方法。
2. 条件付きループ: `For Each` を使って、条件に合うものだけを抽出する方法。
3. 特殊文字への対処: `InStr` を使って、Word特有の挙動を回避する方法。

「マクロの記録」は便利な道具ですが、それはあくまで「点」です。
今回学んだ「ループ」と「条件分岐」を組み合わせることで、あなたは「線」や「面」を操る、真の自動化エンジニアへの道を歩み始めました。

次は、色を変える代わりに「セルの値を計算する」ことや、「特定の文字が含まれる行を削除する」ことに挑戦してみてください。

大丈夫、一歩ずつ進めば、Word VBAはあなたの最強の右腕になりますよ。応援しています!

タイトルとURLをコピーしました