【入門編】【初心者向け】Word表の全セルを走査し、特定のキーワードが含まれるセルのみ背景色を塗る – Word VBA解析バイブル

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

「マクロの記録」を卒業しよう。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シートに書き出す」といった、より高度な連携へとステップアップできます。

一歩ずつ、着実に。
コードの向こう側にある「自由な時間」を目指して、楽しんで書き続けてくださいね。応援しています!

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