「マクロの記録」を卒業しよう。Word VBAで表のセルを自在に操るための第一歩
こんにちは。業務自動化の世界へようこそ。
あなたが今、「マクロの記録」機能を使って、一生懸命に操作をコードに変換しているとしたら……それは素晴らしい第一歩です。しかし、同時に一つだけ伝えておかなければならないことがあります。
「マクロの記録」は、あくまで「点」の記録です。
特定のセルを操作した記録は残せますが、「表全体の中から、特定の言葉が入っている場所を探して、色を塗る」といった「線」や「面」の動きを記録することはできません。これこそが、プログラミング(VBA)の真髄であり、あなたがこれから手に入れようとしている「魔法」の正体です。
今日は、その魔法の最初の呪文として、「表の全セルを巡回し、特定のキーワードを見つけたら色を塗る」というテクニックを伝授します。これがマスターできれば、Word VBAの基本構造である「オブジェクトの階層構造」を理解したことになります。
さあ、一緒にコードの裏側にある「設計図」を覗いてみましょう。
1. Word VBAの「設計図」を理解する
コードを書く前に、まずWordがどのようにデータを管理しているか、その「親子関係(オブジェクトモデル)」をイメージしてください。
プログラミングの世界では、すべての要素を「オブジェクト」という箱として捉えます。表の操作をする場合、以下のような階層構造になっています。
[Document] (文書全体)
└── [Table] (表)
└── [Cell] (セル) ← ここを一つずつ触っていく!
「表のセルを全部調べる」というのは、「表という箱を開け、その中にあるセルという箱を、端から順番に一つずつ取り出して確認していく」という作業なのです。
2. 実装コード:キーワード・ハイライター
それでは、実際に動くコードを見てみましょう。以下のコードは、文書内にある最初の表を対象に、指定したキーワードが含まれるセルを黄色く塗りつぶすものです。
Sub HighlightKeywordInTable()
' === 変数の宣言(設計図の準備) ===
Dim targetWord As String ' 探したいキーワード
Dim tbl As Table ' 操作対象の表
Dim cel As Cell ' 巡回中のセル
' === 設定エリア ===
targetWord = "重要" ' ★ここを好きな言葉に変えてみてください
' エラーハンドリング:文書内に表がない場合に備える
If ActiveDocument.Tables.Count = 0 Then
MsgBox "文書内に表が見つかりません。", vbExclamation
Exit Sub
End If
' 文書内の最初の表を変数にセット
Set tbl = ActiveDocument.Tables(1)
' === メイン処理:セルの全走査(ループ) ===
' For Each文を使うことで、表の中のセルを一つずつ順番に処理できます
For Each cel In tbl.Range.Cells
' セル内のテキストを取得(末尾の制御文字を除去するためにTrimを使用)
' InStr関数を使って、キーワードが含まれているか判定します
' InStr(対象文字列, 探したい文字列) > 0 なら「含まれている」という意味
If InStr(cel.Range.Text, targetWord) > 0 Then
' --- 条件に一致した場合の処理 ---
' セルの背景色(Shading)を黄色に設定
cel.Shading.BackgroundPatternColor = wdColorYellow
Else
' --- 条件に一致しない場合(色をリセットしたい場合) ---
' もし以前に塗った色を消したいなら、ここを有効にします
cel.Shading.BackgroundPatternColor = wdColorAutomatic
End If
Next cel ' 次のセルへ移動
MsgBox "処理が完了しました!", vbInformation
End Sub
3. プロの視点:コードの「中身」を解剖する
このコードには、初学者が脱却するために知っておくべき「3つの鍵」が隠されています。
① `For Each` 文:巡回(イテレーション)の王道
「1行目から○行目まで……」と数字で指定する方法もありますが、Word VBAにおいて表のセルを扱うなら `For Each cel In tbl.Range.Cells` が最もスマートです。これは「セルという集合体の中から、要素を一つずつ取り出す」という命令で、結合セルが含まれていても、VBAが賢く処理してくれるため、エラーに強い書き方です。
② `InStr` 関数:部分一致の判定
「セルの中身が完全に一致するか」ではなく、「キーワードが含まれているか」を判定するのが `InStr` です。
- `InStr(“重要事項”, “重要”)` → 結果は `1` (1文字目に見つかった)
- `InStr(“普通”, “重要”)` → 結果は `0` (見つからなかった)
この「0より大きいかどうか」という判定が、自動化のロジックの核心です。
③ `Shading` プロパティ:見た目の操作
Wordにおける「色塗り」は `Shading`(シェーディング)というオブジェクトが担当しています。`BackgroundPatternColor` に対して、`wdColorYellow`(黄色)のような「定数」を渡すことで、見た目を制御します。
4. 陥りやすい「落とし穴」と回避策
現場でよく遭遇するトラブルを、先回りして教えておきましょう。
罠1:結合されたセルによるエラー
表の中に「結合されたセル」があると、行や列の番号(`Cells(i, j)`)で指定しようとした際に、「そんな番号のセルはありません」というエラー(実行時エラー 5941)が出ることがあります。
対策: 今回のように `For Each` を使って「セルそのもの」を直接操作するスタイルを貫けば、このエラーを回避しやすくなります。
罠2:セルの「見えない文字」
Wordのセル内には、テキストの末尾に「セル区切り文字」という目に見えない特殊なコードが含まれています。
`cel.Range.Text` で取得した文字列には、この見えない文字がくっついています。単純な比較(`If cel.Range.Text = “重要” Then`)を行うと、この見えない文字のせいで「一致しない」と判定されてしまうことがあります。
対策: `InStr` を使うか、`Replace` 関数で制御文字を取り除く習慣をつけましょう。
最後に:ここをクリアすれば、次が見えてくる
お疲れ様でした!
「特定の条件に合うものを探して、見た目を変える」というロジックは、自動化のあらゆる場面で使い回せる「最強のテンプレート」です。
これが理解できれば、次は「色を塗る」のではなく、「色を塗ったセルの値を別のExcelシートに書き出す」といった、より高度な連携へとステップアップできます。
一歩ずつ、着実に。
コードの向こう側にある「自由な時間」を目指して、楽しんで書き続けてくださいね。応援しています!
