マクロ記録のその先へ。Word VBAで「表」を自在に操るためのオブジェクト思考術
こんにちは。自動化の世界へようこそ。
「マクロの記録」ボタンを押して、自分の操作がコードになるのを見て感動したことはありませんか? それは素晴らしい第一歩です。しかし、マクロの記録には決定的な弱点があります。それは「条件分岐(もし〜なら)」が書けないということです。
「特定の文字が入っている行だけを見つけたい」「見つけたら色を塗りたい」……こうした「判断」を伴う操作こそが、業務自動化の真髄であり、エンジニアとしての腕の見せ所です。
今日は、Word VBAの中でも特に扱いが難しい「表(Table)」をテーマに、「全セルを走査し、キーワードが含まれる行をハイライトする」というプログラムを題材に、オブジェクトの概念と、プロとして意識すべき作法を伝授しましょう。
ここをクリアすれば、あなたのWord VBAスキルは「記録」のレベルから「開発」のレベルへと一気に昇華しますよ。
1. 鍵となるのは「オブジェクトの階層構造」を理解すること
コードを書く前に、まず頭の中に「地図」を描いてください。Word VBAの世界は、すべてが「入れ子構造(階層構造)」になっています。
表の操作をする場合、以下のような親子関係を辿ることになります。
1. Document(文書):すべての土台
2. Tables(表の集合):文書内にあるすべての表
3. Table(個別の表):操作したい特定の表
4. Rows(行の集合):表の中にある行の集まり
5. Cells(セルの集合):行の中にある一つひとつのマス目
「セルの中身を調べて、その行の色を変える」という命令は、この階層を上から順番に降りていき、条件に合致した瞬間に、そのセルの「親」である「行」へ命令を跳ね返させる作業なのです。
この「親(Parent)は子(Child)を知っており、子は親を知っている」という関係性を理解しているかどうかが、コードの書きやすさを左右します。
2. 実践:キーワード検索・行ハイライト・マクロ
それでは、実際に動くコードを見てみましょう。まずはコピーして、Wordの標準モジュールに貼り付けてみてください。
Sub HighlightRowsByKeyword()
' --- 変数の宣言(型を明示するのはプロの鉄則です) ---
Dim doc As Document
Dim tbl As Table
Dim cl As Cell
Dim targetWord As String
Dim foundMatch As Boolean
' --- 設定エリア ---
Set doc = ActiveDocument ' 現在開いている文書を対象にする
targetWord = "重要" ' ここに探したいキーワードを入力
' 処理を高速化するため、画面更新を一時停止(大量の表がある場合に有効)
Application.ScreenUpdating = False
' --- メイン処理:文書内のすべての表をループ ---
For Each tbl In doc.Tables
' 各表の中の「セル」を一つずつ見ていく
For Each cl In tbl.Range.Cells
' セルのテキストを取得(末尾の制御文字を除去するためにLeftを使用)
' Wordのセルには目に見えない「改行記号」が含まれているため、これを除かないと不一致が起きやすいです
Dim cellText As String
cellText = Left(cl.Range.Text, Len(cl.Range.Text) - 2)
' キーワードが含まれているか判定 (InStr関数を使用)
' InStrは、見つかった場合はその位置(1以上)を、見つからない場合は0を返します
If InStr(cellText, targetWord) > 0 Then
' --- 条件に合致した場合の処理 ---
' 見つかったセルの「親(Row)」に対して、背景色(Shading)を設定する
' wdColorYellow は標準的な黄色です
cl.Row.Shading.BackgroundPatternColor = wdColorYellow
' 行全体に色を塗ったので、その行の他のセルをチェックする必要はないため、
' 次の「行」へスキップするためのフラグ管理を検討しても良いですが、
' ここではシンプルに「見つかったら塗る」というロジックにします。
End If
Next cl
Next tbl
' 画面更新を元に戻す
Application.ScreenUpdating = True
MsgBox "検索が完了しました!", vbInformation
End Sub
3. コードの解剖図:なぜこう書くのか?
初心者の方が躓きやすいポイントを、エンジニアの視点で解説します。
① セルの「見えない文字」問題
コードの中に `Len(cl.Range.Text) – 2` という記述がありましたね。これは非常に重要です。
Wordのセル内には、見た目には見えない「セル区切り記号」という特殊な文字が必ず含まれています。これを無視して `If cellText = “重要”` と比較すると、「重要[記号]」=「重要」ではないと判定され、検索に失敗します。この「お作法」を知っているだけで、デバッグの時間は劇的に減ります。
② `InStr` 関数の活用
`If cellText = targetWord` と書くと、「完全一致」しか判定できません。「重要:要確認」といった文字列からも「重要」を見つけ出したい場合は、`InStr` 関数を使って「含まれているか?」を判定するのが定石です。
③ `.Select` を使わない勇気
マクロの記録を使うと、必ずと言っていいほど `Selection.Range…` や `Selection.TypeParagraph` といったコードが出てきます。しかし、プロは `Select`(選択)を使いません。
「セルを選択してから色を塗る」のではなく、「セルに対して直接色を塗る」という書き方をします。これによって、画面がチカチカ動くのを防ぎ、処理速度を劇的に向上させることができるのです。
4. 陥りやすい罠:結合されたセル(Merged Cells)
ここで、一つだけ「警告」をさせてください。
上記のコードは、非常に美しい表であれば完璧に動作します。しかし、「セルが結合されている表」に出会うと、エラー(実行時エラー 5941 など)で止まってしまうことがあります。
結合されたセルは、オブジェクトの階層構造を「歪ませて」しまいます。
「行の中にセルが10個あるはずなのに、結合されているせいで数が合わない!」という事態が起きるのです。
初学者のための回避策:
まずは「結合のない、綺麗な表」で練習してください。もし結合セルを扱う必要が出てきたら、それは「一歩上のステップ」です。その時は、`On Error Resume Next` でエラーを回避するか、結合を解除してから処理するロジックが必要になります。焦らず、一つずつ攻略していきましょう。
最後に
「表を走査する」という操作は、一見地味に見えるかもしれません。しかし、これはデータの抽出、レポートの自動作成、検品作業の自動化など、あらゆる業務自動化の基礎となる、極めて強力なスキルです。
オブジェクトの親子関係を意識し、目に見えない文字に気を配る。
この積み重ねが、あなたを「ただマクロを記録する人」から「業務を設計するエンジニア」へと変えてくれます。
ここをクリアすれば、Word VBAの基本はバッチリですよ。
さあ、次はどんな自動化に挑戦しますか?応援しています!
