【入門編】【中級者向け】置換対象が「表」の中にある場合、セル単位で色付けする – Word VBA解析バイブル

スポンサーリンク

こんにちは! Word VBAの自動化の世界へようこそ。
マクロの記録ボタンを押すだけのステージから一歩抜け出して、自分の手でドキュメントを自在に操りたい――そう思っているあなたなら、今日のテーマは最高にワクワクするはずです。

実務でWordを使っていると、「このキーワードが含まれている『表のセル』だけをパッと目立つように背景色を変えたい」という要件にぶinぶつかることがよくあります。Excelなら条件付き書式で一発ですが、複雑なレイアウトが入り交じるWordの「表(Table)」において、これをVBAなしでやるのは至難の業です。

今回は、「検索で見つかった文字列が含まれるセル全体を特定し、背景色を変更する」という、実務直結のテクニックを授けましょう。ここをクリアすれば、Word VBAのオブジェクト構造の基本はバッチリです。一緒に紐解いていきましょう!

—

なぜWordの「表の検索」は一筋縄ではいかないのか?

まず、プログラミング初学者が一番最初にハマる罠についてお話しします。

Word VBAで文字を探すとき、私たちはついつい `Selection.Find` や `ActiveDocument.Content.Find` を使いたくなります。しかし、これらは「文字列」としてのヒット位置を返すだけで、「その文字列がどの表の、何行目の、何列目のセルに存在しているのか」という立体的な位置情報を直接教えてくれません。

さらに、Wordのセル(Cell)オブジェクトは、セルの中にさらに段落(Paragraph)や別の表を含めることができる複雑な構造をしています。

だからこそ、チーフアーキテクトである私たちがアプローチすべき王道の設計はこうなります:

1. ドキュメント全体から目的のキーワードを検索する
2. ヒットした場所(Range)から、「親であるセル(Cell)」を逆引きする
3. そのセルの背景色(Shading.BackgroundPatternColor)を一撃で塗り替える

この「逆引き(Parent構造の利用)」の感覚を掴むことが、Word VBAをマスターする最大の近道です。

—

実践!セル背景色ハイライト・マクロ

それでは、開発の現場でそのままコピペして使える実用コードを公開します。
今回は例として、キーワードに「要確認」を指定し、それが含まれる表のセルを鮮やかな黄色に染め上げるマクロを作成しました。

Sub HighlightCellsWithKeyword()
Dim rngTarget As Range
Dim targetKeyword As String

‘ 検索するキーワードを定義
targetKeyword = “要確認”

‘ 文書の先頭から検索を開始するためのRangeオブジェクトを取得
Set rngTarget = ActiveDocument.Content

‘ 検索条件の設定(Withブロックでスマートに記述)
With rngTarget.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = targetKeyword
.Forward = True
.Wrap = wdFindStop ‘ 文書の最後まで来たら検索を終了する
.MatchCase = False
.MatchWholeWord = False
.MatchWildcard = False

‘ 該当する文字列をループ処理で順次捉える
Do While .Execute
‘ 【重要】ヒットした文字列が「表(Table)」の中にあるか判定する
If rngTarget.Information(wdWithInTable) = True Then

‘ ヒットした場所の「親セル」を取得し、背景色を黄色(wdColorYellow)に変更する
‘ ※Cells(1)を使うことで、複数セルにまたがる選択の安全性を担保
rngTarget.Cells(1).Shading.BackgroundPatternColor = wdColorYellow

End If

‘ 次の検索のために、レンジの末尾へ移動してループを継続
rngTarget.Collapse wdCollapseEnd
Loop
End With

‘ 処理完了のメッセージ
MsgBox “「” & targetKeyword & “」が含まれるセルのハイライトが完了しました!”, vbInformation, “処理完了”
End Sub

—

コードの核心を解説:ここがプロの技

上記のコードで、特に注目してほしい「3つの重要ポイント」を解説します。ここを理解すれば、あなたのコードの引き出しが一気に広がります。

1. `wdWithInTable` による安全な判定

`rngTarget.Information(wdWithInTable)` は、現在見つかった文字列が「表の内部にあるかどうか」をTrue/Falseで返してくれる神機能です。これがあるおかげで、本文中の普通の段落でヒットした文字を誤って処理してしまうエラーを防げます。

2. `rngTarget.Cells(1)` という逆引きの魔法

検索で見つかった `rngTarget` は、あくまで「文字列(文字の集まり)」です。しかし、Word VBAでは `.Cells(1)` と叩くことで、その文字列を包み込んでいる一番近いセル(Cellオブジェクト)へ一瞬でジャンプ(逆引き)できます。これがオブジェクト指向の醍醐味です。

3. `Shading.BackgroundPatternColor` で色を塗る

セルの背景色を変える際、Excelであれば `Interior.Color` ですが、Wordの場合は少し長くて `Shading.BackgroundPatternColor` を使います。今回は分かりやすく `wdColorYellow` を指定しましたが、RGB値(例: `RGB(255, 230, 230)` など)を指定して淡いピンクにすることも可能です。

—

陥りやすいエラーと回避のコツ

現場でこのマクロを走らせたときに、初学者がよく直面するトラブルシューティングを共有しておきます。

  • 無限ループにハマる
  • 原因: ループ内で `rngTarget.Collapse wdCollapseEnd` を書き忘れた場合、同じ場所を永遠に検索し続けてフリーズします。
  • 対策: `Do While .Execute` の中身の最後には必ずレンジを縮小(Collapse)させるコードを入れましょう。
  • 結合セル(Merged Cells)でエラーが出る
  • 原因: 表が複雑にセル結合されていると、`.Cells(1)` の参照で予期せぬ挙動をすることがあります。
  • 対策: 基本的な表であれば今回のコードで問題ありませんが、複雑な公文書などを扱う場合は、事前に表の構造を整理しておくのがエンジニアのたしなみです。

—

おわりに:ここをクリアすれば、Word VBAは怖くない!

お疲れ様でした! 今回は「検索」と「表のセル操作」を組み合わせた、少し歯応えのあるテーマを解説しました。

「文字を探すだけでなく、その背後にある入れ物(セル)を特定してデザインを制御する」――この感覚が身につけば、もはやあなたはマクロの記録の卒業生ではありません立派なWord VBAの書き手です。

日々のコピペ作業や、目視によるチェック地獄から自分を解放し、もっとクリエイティブな仕事に時間を使いましょう。
それでは、次回の高度な自動化の世界でお会いしましょう。あなたの開発ライフを応援しています!

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