【入門編】【初心者向け】Word表内の特定文字列を検索して該当セルを太字にする自動化 – Word VBA解析バイブル

スポンサーリンク

こんにちは! Word VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだか動いたけれど、中身はよくわからない……」というところから一歩進み、自分の手でドキュメントを意のままに操りたいあなたへ。

今回は、実務で死ぬほど遭遇する「表(テーブル)の中をくまなく探し、特定のキーワードが入っているセルだけをピカッと太字にする自動化」をテーマに解説します。

Excel VBAなら「Cells(i, j)」で一発ですが、Wordの表構造はExcelとは少し違った「独特の生態系」を持っています。ここをクリアすれば、あなたも立派なWord VBA使い。さあ、一緒に扉を開けましょう!

—

1. なぜ「表の自動化」で挫折するのか?

Word文書のレイアウトを整えるとき、こんな苦行をしたことはありませんか?

  • 「見積書やチェックリストの表から、特定の項目(例:『要確認』)を探して太字にする」
  • 「ページ数が増えるたびに、目視で探してポチポチ太字にする……気が狂いそう!」

これを手作業でやると、見落としが発生するし、何より時間の無駄です。
「じゃあマクロの記録を使えばいいか」とやってみると、生成されるのは `Selection.Find` だの `MoveDown` だの、ドキュメントのカーソル位置に依存した不安定なコードの山……。

プロのエンジニアは、選択(Selection)に頼りません。
裏側でスマートにオブジェクトを操作し、一瞬で仕事を終わらせる。そのための「本質的なアプローチ」を今から授けます。

—

2. Word表の構造を解剖する(ここが一番大事!)

Excelは「シート」という方眼紙の上に行と列が綺麗に並んでいますが、Wordの表は「ネスト(入れ子)構造」の塊です。

Wordの表(Table)の中は、次のような親子関係になっています。

  • Table(表そのもの)
  • ┗ Rows(行の集まり) > Row(1行)
  • ┗ Cells(セルの集まり) > Cell(1個のセル)
  • ┗ Range(セルの中にあるテキストや段落)

ここで大きなポイント!
Wordのセル(Cell)の中に直接「文字」が入っているわけではありません。セルの中には必ず「Range(範囲)」というエリアがあり、その中にテキストが存在しています。

つまり、「セル内の文字を太字にする」というのは、正確には「セルの中にあるRangeのフォントをBold(太字)にする」という手順を踏むのです。ここさえ分かれば、もうWord VBAの表操作で迷うことはありません。

—

3. 実装コード:特定文字列を検索して太字にするマクロ

それでは、実際に動くモダンで堅牢なコードを公開します。
WordのVBAエディタ(Alt + F11)を開き、標準モジュールにペーストしてください。

Sub HighlightSpecificKeywordInTables()
Dim doc As Document
Dim tbl As Table
Dim cel As Cell
Dim targetWord As String

‘ 1. 対象ドキュメントの定義
Set doc = ActiveDocument

‘ 2. 検索したいキーワードを設定(ここに探したい文字を入れる)
targetWord = “要確認”

‘ 3. 文書内に表が1つもなければ終了する安全装置
If doc.Tables.Count = 0 Then
MsgBox “この文書には表が存在しません。”, vbExclamation, “処理中断”
Exit Sub
End If

‘ 4. 画面描画を停止してマクロの実行速度を爆発的に上げる(お作法)
Application.ScreenUpdating = False

‘ 5. 文書内にある「すべての表」を順番にループする
For Each tbl In doc.Tables

‘ 6. 表の中にある「すべてのセル」を順番にループする
For Each cel tbl.Range.Cells

‘ セルの末尾には必ず制御文字(Cellマーカー)が含まれるため、
‘ TrimやInStrで安全にテキスト比較を行う
‘ ※セル内のテキストにキーワードが含まれているかチェック
If InStr(cel.Range.Text, targetWord) > 0 Then

‘ 該当セルのフォントを太字にする
‘ (※セル全体の文字を太字にする場合)
cel.Range.Bold = True

‘ 【発展】もしセルの一部分だけを赤字にしたい場合は
‘ cel.Range.Font.Color = wdColorRed などの装飾も可能です!

End If

Next cel
Next tbl

‘ 7. 画面描画を再開
Application.ScreenUpdating = True

‘ 8. 完了メッセージ
MsgBox “処理が完了しました!”, vbInformation, “成功”

End Sub

—

4. コードの注目ポイント(先輩からの解説)

このコードには、実務で使えるプロのテクニックがサラッと盛り込まれています。いくつか重要なポイントを解説しますね。

① `For Each` によるコレクション走査

`For Each tbl In doc.Tables` や `For Each cel In tbl.Range.Cells` という書き方を使っています。これは「数え上げ(インデックス指定)」ではなく、「そこにあるものを順番に手で触っていく」ようなイメージです。表の行数やセル数がいくつであってもエラーを出さずに自動対応できる、非常に安全なループ構文です。

② `Application.ScreenUpdating = False`

これがプロの技です。VBAが実行されるたびにWordの画面がパタパタと書き換わると、処理がものすごく遅くなります。最初に画面描画をオフにし、最後にオンに戻すことで、数秒かかっていた処理が一瞬で終わる(爆速化)ようになります。

③ セルの特殊なテキスト判定:`InStr`

Wordのセルの中身(`cel.Range.Text`)は、普通の文字列とはちょっと違い、最後に特殊な制御コード(セル末尾のマーク)が含まれています。そのため、完全一致(`= targetWord`)で比べるよりも、「その中にキーワードが含まれているか?」を判定できる `InStr` 関数を使うのが、実務では圧倒的にエラーが少なく確実です。

—

5. 初心者がハマりやすい「罠」と対策

最後に、このコードをいじっているときにつまづきやすいポイントを先回りして共有しておきます。

  • 罠1:表がないドキュメントで実行してエラーになる
  • 対策: 今回のコードには `If doc.Tables.Count = 0 Then` という安全装置を入れています。これがないと、表がない文書で実行した瞬間に「インデックスが有効範囲にありません」と怒られてしまいます。実務コードには必須の配慮です。
  • 罠2:セルの中の「特定の文字だけ」を太字にしたいのに、セル全体が太字になった
  • 対策: 今回の `cel.Range.Bold = True` は「セルに含まれるテキスト全体」を太字にします。もし「要確認」という文字の部分だけをピンポイントで太字にしたい場合は、`Range.Find` オブジェクトを組み合わせる少し高度な処理が必要になります。まずは「該当するセルごとハイライトする」というアプリケーションから始めるのが、実務では最も実用的でスピーディーです。

—

まとめ

いかがでしたでしょうか?
「Wordの表を自動で巡回し、条件に合うセルを装飾する」という一連の流れが、すっきりと見通せるようになったのではないでしょうか。

ここをクリアできれば、次は「特定の行に背景色を塗る」「行のの高さを自動調整する」といった応用へスムーズに進むことができます。

面倒な文書整形はマクロに片付けさせて、あなたはクリエイティブで本当に価値のある仕事に集中してください。ここをクリアしたあなたなら、もうWord VBAの基本はバッチリですよ!次のステップも、この調子で楽しくマスターしていきましょう。

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