【入門編】【中級者向け】正規表現と組み合わせて、特定のパターンを持つ段落のみに書式を適用する – Word VBA解析バイブル

スポンサーリンク

こんにちは! Word VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだかよく分からないけれど動いた!」というフェーズを抜け出し、自分の手でドキュメントを意のままに操りたいと思っているあなたへ。

今回は、業務効率化の現場で確実に一目置かれる技術「正規表現を活用した段落の高度な自動装飾」について解説します。

Word標準の検索・置換機能って、少し複雑な条件を指定しようとすると途端に限界が来ますよね。「特定の数字で始まって、その後に特定の文字が続く段落だけを一括で太字にしたい……」そんなとき、Wordのワイルドカード機能と格闘して頭を抱えた経験はありませんか?

ここをクリアすれば、Word VBAの基本はバッチリですよ。
VBAから「正規表現(RegExp)」のパワーを呼び出し、文書内の段落をスマートに料理する方法を、優しく、そして本質的な部分までしっかりと伝授します。一緒にマスターしていきましょう!

なぜ「正規表現 × 段落処理」が最強の武器になるのか?

Word VBAで文書を装飾するとき、多くの人は「文書全体を上から順にループして、文字を探して……」というアプローチをとります。しかし、これでは処理が重くなりがちですし、何より複雑な条件分岐を書こうとするとコードがスパゲッティのように絡まってしまいます。

ここで登場するのが 正規表現(Regular Expression) です。
正規表現を使えば、「文頭にある1桁以上の数字」や「特定のキーワードを含む行」といった抽象的なパターンを、たった1行の数式(パターン文字列)でスパッと見つけ出すことができます。

これをWordの`Paragraph`(段落)オブジェクトと組み合わせることで、「条件に合致した段落だけをピンポイントで抽出し、一瞬でスタイルやフォントを変更する」という、極上の自動化フローが完成します。

実装の全体像:今回のサンプルコード

百聞は一見に如かず。まずは、今回のゴールとなる実用的なコードをお見せします。
このコードは、「文書内の『数字で始まる段落』をすべて探し出し、フォントをメイリオに変更して青色・太字にする」という処理を行います。

VBE(Visual Basic Editor)を開き、標準モジュールにペーストして実行してみてください。

Sub FormatParagraphsByRegex()
‘ 変数の宣言
Dim rngTarget As Range
Dim para As Paragraph
Dim regEx As Object
Dim matches As Object

‘ 1. VBScriptの正規表現オブジェクトを作成
Set regEx = CreateObject(“VBScript.RegExp”)

With regEx
‘ 【パターンの設定】行頭 (^) から始まる 1文字以上の数字 ([0-9]+) をキャッチ
.Pattern = “^[0-9]+”
.IgnoreCase = True F’ 大文字・小文字の区別(今回は数字なので影響なし)
.Global = True ‘ 文字列全体からマッチを探す
End With

‘ 2. 文書内の全段落をループ処理
‘ ※上級者向け知見:Wordのループは「末尾から先頭へ(Backward)」回すのが安全かつ高速
Dim i As Long
For i = ActiveDocument.Paragraphs.Count To 1 Step -1
Set para = ActiveDocument.Paragraphs(i)

‘ 段落のテキストを取得(※段落末尾の改行コードを除外するため .Range.Text を調整)
Dim paraText As String
paraText = para.Range.Text
‘ 末尾の段落記号(Chr(13)等)を取り除く
If Len(paraText) > 1 Then
paraText = Left(paraText, Len(paraText) – 1)
End If

‘ 3. 正規表現によるパターンのマッチング判定
If regEx.Test(paraText) Then
‘ — 条件に一致した段落への装飾処理 —
With para.Range
.Font.Name = “メイリオ”
.Font.Color = RGB(0, 102, 204) ‘ 青系
.Font.Bold = True
End With
End If
Next i

‘ 4. 後片付け
Set regEx = Nothing

MsgBox “条件に合致する段落の装飾が完了しました!”, vbInformation, “処理終了”
End Sub

コードの核心を分解解説!ここがポイント

初心者から一歩進むために、上記のコードで使われている「重要なエンジニアリングの視点」を3つに絞って解説します。

1. VBScriptの正規表現エンジンを呼び出す

Word VBAには標準で強力な正規表現機能が備わっていません。そのため、Windowsに標準搭載されているVBScriptの機能(`VBScript.RegExp`)を外部から呼び出して使います。

Set regEx = CreateObject(“VBScript.RegExp”)

この1行で、Windowsの奥深くにある強力なパターンマッチングエンジンをVBAの手元に召喚できます。使い終わったら `Set regEx = Nothing` でメモリを解放する(オブジェクトのライフサイクルを管理する)のが、美しいコードを書くプロの作法です。

2. 正規表現パターンの読み解き方

今回のキモであるパターン文字列を見てみましょう。

.Pattern = “^[0-9]+”

  • `^` : 「行の先頭」を意味します(段落の始まりを捉えるのに必須!)。
  • `[0-9]` : 「0から9までの数字のいずれか1文字」を意味します。
  • `+` : 「直前の文字が1回以上連続する」を意味します。

つまり、「行頭から始まる、1文字以上の数字」という条件になります。「1. はじめに」「10. 概要」といった見出し行を綺麗にヒットさせることができます。

3. 【重要】Word VBA特有の「罠」を避けるループ処理

ここが一番の「知見」です。
コードの中で、なぜわざわざ `For i = ActiveDocument.Paragraphs.Count To 1 Step -1` と後ろから数えてループさせている分かりますか?

もし上から順に(`1 To Count`)ループさせ、処理の途中で段落を分割・結合したり、あるいは複雑なスタイル変更を行ったりすると、Word内部のストーリー領域のインデックスが狂い、思わぬバグや無限ループ、最悪の場合は強制終了(フリーズ)を引き起こす原因になります。
「Wordの段落やセクションを操作するループは、逆順(後ろから前へ)で回すのが安全の鉄則」。これは現場で何回も助けられた知見ですので、ぜひ覚えておいてください。

また、Wordの `Paragraph.Range.Text` は、末尾に必ず「段落記号(改行マーク)」を含んでいます。正規表現で `^` や `$` (行末)を使う際、この見えない改行文字が邪魔をすることがあるため、`Left` 関数で末尾の1文字を削ってから判定しているのも実戦的なテクニックです。

発展:こんな風に応用できます

今回のベースコードの `.Pattern` を書き換えるだけで、あなたの業務に合わせた様々な自動化に応用できます。

  • 「Q.」で始まるQ&Aの質問文だけを太字にする

`.Pattern = “^Q\.”`

  • 「【重要】」というキーワードを含む段落の文字色を赤にする

`.Pattern = “【重要】”`

  • メールアドレスが含まれる段落を探して下線を引く

`.Pattern = “[A-Za-z0-9_\.-]+@[A-Za-z0-9_\.-]+\.[A-Za-z0-9]+” `

まとめ

今回は、Word VBAと正規表現を組み合わせて、特定の条件を持つ段落だけを美しく自動装飾する方法を解説しました。

  • VBScript.RegExp を使って複雑な条件を柔軟に捉える。
  • 逆順ループ(Step -1) でWord VBAの安定性とパフォーマンスを担保する。
  • 段落テキストの末尾の扱いに注意する。

一見難しそうに見える処理も、パーツに分解して本質を理解すれば、あなたの心強い味方になってくれます。このテクニックをあなたの業務文書のテンプレートやレポート自動生成マクロに組み込んでみてください。

「ここをクリアすれば、Word VBAの基本はバッチリですよ!」
ぜひ自信を持って、日々の業務自動化に挑戦していってくださいね。応援しています!

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