【脱・マクロ記録】Word VBAで表を操る:キーワード検知と行全体の自動ハイライト術
「マクロの記録」を使って、なんとか自動化の第一歩を踏み出したあなた。素晴らしい一歩です。しかし、記録されたコードを眺めて、「もし探したい文字が変わったら?」「表の行数が増えたら?」と不安になったことはありませんか?
マクロの記録は「過去の動作の録画」に過ぎません。そこには「もし〜だったら」という判断(ロジック)が存在しないからです。
今日、あなたがマスターするのは、Wordという巨大な文書構造を「オブジェクト」として捉え、プログラムに意思を持たせる技術です。特定のキーワードを見つけ出し、その行全体を鮮やかに彩る。このテクニックを習得すれば、あなたは単なる「記録係」から、業務を設計する「エンジニア」へと進化します。
準備はいいですか? それでは、Word VBAの深淵へ入りましょう。
1. 核心:Wordの「階層構造」を理解する
コードを書く前に、最も重要な概念を脳に刻んでください。Word VBAにおいて、すべての操作は「オブジェクトの階層」で行われます。
これを、大きなビルに例えてみましょう。
- Document(文書): ビル全体
- Tables(表): ビルの中にある各フロア
- Rows(行): フロアにある各部屋の列
- Cells(セル): 部屋の中にある個別の棚
- Range(範囲): 棚の中にある「中身(テキストや書式)」
私たちが今回やりたいことは、「特定の棚(Cell)に特定の文字があるか探し、見つけたらその部屋(Row)全体の色を変える」というミッションです。
この階層構造(オブジェクトモデル)を意識できていないと、コードは迷子になり、エラーを吐き出します。
2. 実践:キーワード検知・行ハイライト・マクロ
では、実際のコードを見ていきましょう。以下のコードは、文書内のすべての表をスキャンし、指定したキーワードが含まれる行を探して、その行の背景色を黄色に変更するものです。
Sub HighlightRowByKeyword()
' ==========================================================
' 変数の宣言:エンジニアの嗜みです。使う道具をあらかじめ定義します。
' ==========================================================
Dim targetDoc As Document
Dim targetTable As Table
Dim targetRow As Row
Dim targetCell As Cell
Dim keyword As String
Dim found As Boolean
' 検索したいキーワードを設定
keyword = "重要" ' ←ここを変えれば、どんな言葉でも探せます
' 操作対象を現在の文書に設定
Set targetDoc = ActiveDocument
' 画面更新を停止して処理速度を向上させる(プロのテクニック)
Application.ScreenUpdating = False
' ==========================================================
' メインロジック:階層を一段ずつ降りていく「二重ループ」
' ==========================================================
' 1. 文書内のすべての「表」に対してループ
For Each targetTable In targetDoc.Tables
' 2. 表の中のすべての「行」に対してループ
For Each targetRow In targetTable.Rows
' 行の中にキーワードがあるか判定するためのフラグをリセット
found = False
' 3. 行の中のすべての「セル」に対してループ
For Each targetCell In targetRow.Cells
' セルのテキストを取得(Wordのセルには末尾に特殊記号が含まれるため、加工が必要)
' InStr関数は、文字列の中に特定の文字が含まれているかを探す関数です
If InStr(targetCell.Range.Text, keyword) > 0 Then
found = True
Exit For ' キーワードが見つかったら、その行のセル探索は終了してOK
End If
Next targetCell
' ==========================================================
' 判定後のアクション:見つかったら行全体を装飾
' ==========================================================
If found Then
' 行全体のRange(範囲)に対して、背景色(Shading)を設定します
' wdColorYellow はWord標準の黄色定数です
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. プロの視点:なぜこのコードが動くのか?(深掘り解説)
初心者の方が躓きやすい、そしてプロが意識している「3つの急所」を解説します。
① `InStr` 関数の使いどころ
`If targetCell.Text = keyword Then` と書きたくなるかもしれませんが、それは危険です。Wordのセル内には、目に見えない「セルの終わりを示す特殊な記号」が含まれています。
`InStr` 関数を使えば、「完全に一致するか」ではなく「その文字が含まれているか」を判定できるため、こうした不可視の記号に邪魔されずに正確な検索が可能になります。
② `Row.Range` へのアクセス
ここが最も美しいポイントです。セルを見つけた後、色を塗る対象は `targetCell` ではなく `targetRow.Range` にしています。
`Cell` に対して色を塗ると、その一マスしか色がつきません。しかし、`Row`(行)が持つ `Range`(範囲)に対して命令を下せば、その行に含まれるすべてのセルを一括で支配できるのです。
③ `Application.ScreenUpdating` の重み
表の行数が多い場合、マクロが動くたびに画面がチカチカと更新されます。これは見た目が悪いだけでなく、コンピュータの処理能力を無駄に消費します。
`False` で更新を止め、最後に `True` で戻す。この一行を入れるだけで、あなたのプログラムは「プロの道具」へと昇華されます。
4. 陥りやすい罠:結合されたセルの恐怖
ここで、一つだけ警告しておかなければならないことがあります。
「表の中でセルを結合(マージ)していませんか?」
Word VBAにおいて、結合されたセルが存在する表に対して `For Each targetRow In targetTable.Rows` を実行すると、多くの場合、実行時エラーが発生します。なぜなら、結合によって「行の構造(列の数)」が崩れてしまい、VBAが「この行には何個のセルがあるんだ?」と混乱してしまうからです。
対策:
もし結合セルがある複雑な表を扱う場合は、`Rows` でループするのではなく、`Cells` を直接ループして、そのセルが属する `Row` を特定するという、一段上のテクニックが必要になります。まずは「結合のない綺麗な表」でこの基本をマスターしましょう。
結びに:次は「動的な書き換え」へ
お疲れ様でした。これであなたは、Wordの表を「ただの静止画」ではなく、「プログラムによって操作可能なデータ」として扱えるようになりました。
「探して、色を塗る」ができるようになったら、次は「探して、その値を書き換える」や「探して、Excelに書き出す」といったステップへ進んでください。
コードの向こう側には、あなたの思考がそのまま形になる、無限の自動化の世界が広がっています。一歩ずつ、着実に。応援していますよ。
