【入門編】【中級者向け】段落の「枠線」を特定のキーワードが含まれる場合にのみ自動描画する – Word VBA解析バイブル

スポンサーリンク

こんにちは!Word VBAの世界へようこそ。いつも業務自動化の設計や開発をリードしている先輩エンジニアです。

「マクロの記録」を卒業し、自分の手でコードを書き始めると、Wordがまるで自分の手足のように動き始める快感に出会えます。今回は、実務で特にニーズの高い「特定のキーワード(『【警告】』や『※注意』など)が含まれる段落を、自動で美しい枠線で囲んで強調するマクロ」の構築に挑戦しましょう。

WordはExcelと異なり、「セル」という明確なグリッドがありません。すべては「文字の連なり(Range)」「段落(Paragraph)」という、目に見えない論理構造で成り立っています。

ここをクリアすれば、Word VBAの基本はバッチリです。裏側の仕組みを紐解きながら、プロが実務で使うエレガントで高速なコードを学んでいきましょう!

1. なぜ「マクロの記録」のコードは実務で使えないのか?

まずは少しだけ、技術の本質に触れておきます。
「段落に枠線を引く」という操作をマクロの記録で作成すると、画面をスクロールして文字を選択するコード(`Selection`)や、設定する必要のない余計なプロパティ(線の太さ、色、余白、影など)が何十行にもわたって書き出されます。

これには2つの大きな問題があります。

1. 動作が極端に遅くなる:画面の選択状態(`Selection`)をいちいち動かすため、ページ数が多い文書ではフリーズの原因になります。
2. コードのメンテナンスが不可能になる:どれが本当に必要な設定なのか、後から見返したときに分からなくなります。

私たちが目指すのは、画面を動かさず、Wordのメモリ上でスマートに対象の段落を特定し、必要なプロパティだけをピンポイントで書き換える「Range(範囲)制御」のアプローチです。

2. Wordにおける「段落枠線」の構造を知る

Wordの段落に枠線を引く場合、プログラム的には `Paragraph.Borders` というコレクションを操作します。

段落の枠線は、上下左右(+斜めなど)のパーツに分かれています。

  • `wdBorderTop`(上)
  • `wdBorderBottom`(下)
  • `wdBorderLeft`(左)
  • `wdBorderRight`(右)

これらを1つずつ設定することもできますが、実は「外周をぐるっときれいに囲む」ためのスマートなショートカットが用意されています。それが `Borders.OutsideLineStyle` や `Borders.Enable` プロパティです。

今回は、このプロパティを駆使して、シンプルかつ劇的に動作するコードを書いてみましょう。

3. 実践:特定キーワードを検知して枠線を引く完璧なコード

以下に、実務でそのまま使える堅牢なVBAコードを示します。
このコードは、文書全体から「【警告】」というキーワードを高速に検索し、見つかった段落に対して自動的に「太さ1.5ポイントの赤い一重線」の枠線を描画し、さらに背景をうっすらとしたグレーに染めて視認性を高めます。

標準モジュールにコピペして、動作を確認してみてください。

Sub AutoDecorateWarningParagraphs()
‘ =================================================================
‘ 機能: 特定のキーワードが含まれる段落を自動で枠線囲み&背景色設定する
‘ 開発者向けTips: Selectionを使わず、Rangeオブジェクトで高速・安全に処理します
‘ =================================================================

Dim doc As Document
Set doc = ActiveDocument

‘ 検索するキーワードを定義
Const KEYWORD As String = “【警告】”

‘ 画面更新を停止して処理を高速化(チラつき防止)
Application.ScreenUpdating = False

‘ 検索用のRange(範囲)オブジェクトを生成
Dim searchRange As Range
Set searchRange = doc.Content

‘ Findオブジェクトの設定
With searchRange.Find
.ClearFormatting ‘ 以前の検索条件(書式)をクリア
.Text = KEYWORD ‘ 検索する文字列を指定
.Forward = True ‘ 文頭から文末方向へ検索
.Wrap = wdFindStop ‘ 文末に達したら検索を停止する
.Format = False ‘ 書式検索は行わない
.MatchCase = True ‘ 大文字・小文字を区別
.MatchByte = True ‘ 全角・半角を区別

‘ 条件に合致するキーワードが見つかる間、ループ処理を実行
Do While .Execute

‘ 見つかったキーワード(searchRange)が含まれる「最初の段落」を特定
Dim targetParagraph As Paragraph
Set targetParagraph = searchRange.Paragraphs(1)

‘ — 段落の装飾処理(ここが心臓部です) —
With targetParagraph

‘ 1. 外枠の設定(一括で上下左右に枠線を描画)
With .Borders
‘ 外枠の線種を指定(実線)
.OutsideLineStyle = wdLineStyleSingle
‘ 線の太さを指定(1.5ポイント = wdLineWidth150pt)
.OutsideLineWidth = wdLineWidth150pt
‘ 線の色を指定(鮮やかな赤)
.OutsideColor = wdColorRed
End With

‘ 2. 背景色の設定(薄いグレーで読みやすく)
.Shading.BackgroundPatternColor = wdColorGray05

‘ 3. 左側の余白(インデント)を少し広げて、枠線と文字の衝突を防ぐ
‘ 1文字分のインデント幅(お好みで調整してください)
.LeftIndent = CentimetersToPoints(0.5)
.RightIndent = CentimetersToPoints(0.5)

End With
‘ ——————————————

‘ 【超重要】次の検索へ進むために、検索範囲の「開始位置」を見つかった場所の直後に移動させる
‘ これを忘れると、同じ場所を無限にループ検索してフリーズします
searchRange.Collapse wdCollapseEnd

‘ 検索範囲の終端を、再び文書の最後まで拡張する
searchRange.End = doc.Content.End
Loop
End With

‘ 画面更新を再開
Application.ScreenUpdating = True

‘ 完了通知
MsgBox “キーワード「” & KEYWORD & “」が含まれる段落の自動装飾が完了しました!”, vbInformation, “処理完了”

End Sub

4. プロの知見:コードの解説と「なぜこう書くのか」

このコードには、初級者から中級者へステップアップするための「極限の知見」がいくつか詰め込まれています。

① `searchRange.Paragraphs(1)` の魔術

`searchRange.Find.Execute` が成功した瞬間、`searchRange` は文書全体ではなく、「見つかったキーワード(例:『【警告』の文字)そのもの」の範囲にギュッと縮小しています。

「文字」ではなく「段落全体」に枠線を引きたいので、`searchRange.Paragraphs(1)` と書くことで、「その文字が含まれている1番目の段落(=所属している段落)」をピンポイントで引っ張り出しているのです。

② 無限ループを防ぐ `Collapse` と `End` の再設定

Word VBAの `Find` ループで最も多くの人が陥る罠が「無限ループによるWordの強制終了」です。

searchRange.Collapse wdCollapseEnd
searchRange.End = doc.Content.End

この2行は、魔法の呪文だと思って覚えてください。
キーワードが見つかった後、検索範囲(`searchRange`)の開始点を「見つかった文字の後ろ(`wdCollapseEnd`)」にギュッと潰し、終点(`End`)を「文書の最後まで」再度引き伸ばしています。これにより、「すでに処理したキーワード」を飛ばして、次の新しいエリアだけを検索対象にできるのです。

5. 陥りやすい罠と解決策(トラブルシューティング)

実務でこのマクロを走らせたとき、誰もが一度は遭遇する「Word特有のクセ」とその解決策をお伝えします。

罠:隣り合う段落の両方にキーワードがあると、枠線が合体してしまう!

Wordの仕様上、「全く同じ枠線・背景色設定を持つ段落が連続すると、1つの大きな枠線で合体して囲まれる」という挙動になります。

  • 解決策:

もし段落ごとに独立した枠線で囲みたい場合は、段落と段落の間に、枠線を持たない空行(通常の段落記号のみの行)を挟むか、段落の「段落後の間隔(`SpaceAfter`)」を設定して物理的な距離を取るように文書を設計してください。

罠:枠線と文字が近すぎて、窮屈に見える

デフォルトの設定だと、枠線と中のテキストがピタッとくっついてしまい、デザイン的に美しくありません。

  • 解決策:

コード内で指定したように、`.LeftIndent`(左インデント)や `.RightIndent`(右インデント)をほんの少し(0.5cmなど)設定するだけで、プロが作ったマニュアルのような美しい余白(ホワイトスペース)が生まれます。

まとめ:ここをクリアすれば、Word VBAの基本はバッチリです!

お疲れ様でした!
今回学んだ内容は、単に「枠線を引く」という結果以上に、以下のWord VBAの真髄が詰まっています。

  • `Selection`(選択)を使わず、`Range`(範囲)で処理する高速性
  • `Find`オブジェクトのライフサイクルと、ループ時の範囲縮退の制御
  • 段落(`Paragraph`)と文字(`Range`)の関係性の理解

これらが理解できれば、Word内のあらゆるテキストを自在に検索し、自動で太字にしたり、スタイルを適用したり、表に変換したりする高度なマクロが自由自在に書けるようになります。

一歩ずつコードを書いていけば、Word VBAは決して難しくありません。あなたの業務自動化ライフが、より創造的で楽しいものになることを応援しています!

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