Wordでマクロを組んでいると、「(MG) の直前にある3桁の数字だけを装飾したい」「でもフォントサイズ14.5ptのときだけに絞りたい」といった、少しニッチな要件に出会うことがあります。この記事では、Word VBAの Find メソッドを使って、フォントサイズ14.5ptだけを正しく絞り込む方法と、ありがちなハマりポイント(特に .Format = True の罠)を、実務目線で丁寧に解説します。
前提となるシナリオとゴール
今回の前提シナリオは次のようなものです。
- 文書の中に
(MG)という文字列がたくさん登場する。 (MG)の直前には「ちょうど3桁の数字」が書かれているケースがある。- その3桁の数字だけを、太字・赤文字・黄色の蛍光ペンなどで装飾したい。
- ただし、フォントサイズが 14.5pt のときだけ を対象にしたい。
- 10.5pt や 12pt など、他のサイズの数字や
(MG)はヒットしてほしくない。
しかし素直に .Font.Size = 14.5 と書いても、思ったとおりに絞り込めないことがあります。その主な原因は、.Format = True を指定していないことにあります。
なぜフォントサイズで絞り込めないのか? Find.Format の仕組み
Word VBA の Range.Find や Selection.Find には、テキスト条件だけでなく、フォントや段落などの書式条件を指定する機能があります。その代表が .Font.Size です。
ところが、次のように書いても、実はサイズ条件は無視されます。
.Text = "(MG)"
.Font.Size = 14.5
' ここで .Format が False のままだと .Font.Size は効かない
これは、次の表のとおり .Format プロパティが「書式条件を使うかどうか」を司っているからです。
| 設定内容 | .Format の値 | 挙動 |
|---|---|---|
.Font.Size = 14.5 を設定 | False(既定値) | サイズ条件は完全に無視される。テキストだけで検索。 |
.Font.Size = 14.5 を設定 | True | テキスト & フォントサイズ両方の条件が有効になる。 |
つまり、フォントサイズや太字・フォント名など、書式で絞り込みたい場合は、必ず次の2点セットが必要になります。
.Font.Size = 14.5(書式条件の中身).Format = True(書式条件を使うスイッチ)
この「スイッチを入れ忘れていた」ために、「10.5pt でも 12pt でも関係なくヒットしてしまう」という現象が起きます。
どこを14.5ptに限定したいかで書く場所が変わる
もう一つ重要なポイントがあります。それは、「どちらを 14.5pt に限定したいのか?」によって、.Font.Size と .Format を設定する場所が変わる、ということです。
| パターン | サイズ条件をかけたい対象 | 設定する Find |
|---|---|---|
| Aパターン | (MG) が 14.5pt のときだけ起点にしたい | (MG) を探す側の Find |
| Bパターン | (MG) のサイズは問わない。直前の3桁数字が 14.5pt のときだけ装飾したい | 3桁数字を探す側の Find |
| Cパターン | (MG) も 3桁数字も両方 14.5pt のときだけ | 両方の Find にサイズ条件を指定 |
以下では、それぞれのパターンについて具体的なコード例と解説を示します。
例A:14.5ptの (MG) だけを起点に3桁数字を探す
まずは、「(MG) 自体が14.5ptのときだけを起点にしたい」場合のコードです。3桁数字のサイズは問わないケースです。
Sub Three_Digits_A()
Dim rng As Range ' (MG) を探す範囲
Dim rngNum As Range ' 起点の前方で3桁を探す範囲
Application.ScreenUpdating = False
Set rng = ActiveDocument.Content
With rng.Find
.ClearFormatting
.Text = "(MG)"
.Font.Size = 14.5 ' 14.5pt の (MG) のみ対象
.Format = True ' 書式条件を有効化(必須)
.Forward = True
.Wrap = wdFindStop
.MatchCase = True
.MatchWholeWord = False
.MatchWildcards = False
End With
Do While rng.Find.Execute
' (MG) の手前だけを後方検索の対象にする
Set rngNum = ActiveDocument.Range(Start:=0, End:=rng.Start)
With rngNum.Find
.ClearFormatting
.Text = "<[0-9]{3}>" ' ちょうど3桁の数字(語単位)
.MatchWildcards = True
.Forward = False ' 後方検索
.Wrap = wdFindStop
' 数字のフォントサイズは問わないので .Format は不要
End With
If rngNum.Find.Execute Then
With rngNum.Font
.Bold = True
.Color = wdColorRed
End With
rngNum.HighlightColorIndex = wdYellow
End If
rng.Collapse Direction:=wdCollapseEnd
Loop
Application.ScreenUpdating = True
End Sub
コードのポイント解説(例A)
rng.Findに対して.Font.Size = 14.5と.Format = Trueを指定しているので、14.5pt の(MG)だけがヒットします。rngNumはStart:=0, End:=rng.Startとして、文書の先頭から(MG)の直前までの範囲だけを対象にしています。.Forward = Falseにすることで、後ろから前に向かって検索します。結果として、(MG)の直前側にある3桁数字のうち、最も近いものがヒットします。- 3桁数字についてはサイズを問わないので、あえて
.Format = False(既定)を使い、書式条件を無効にしています。
例B:(MG)のサイズは不問、3桁数字が14.5ptのときだけ装飾する
次は、「(MG) のフォントサイズは何でもよいが、直前の3桁数字が14.5ptのときだけ装飾したい」場合です。
Sub Three_Digits_B()
Dim rng As Range
Dim rngNum As Range
Application.ScreenUpdating = False
Set rng = ActiveDocument.Content
With rng.Find
.ClearFormatting
.Text = "(MG)"
.Format = False ' (MG) のサイズ条件は付けない
.Forward = True
.Wrap = wdFindStop
.MatchCase = True
.MatchWholeWord = False
.MatchWildcards = False
End With
Do While rng.Find.Execute
Set rngNum = ActiveDocument.Range(Start:=0, End:=rng.Start)
With rngNum.Find
.ClearFormatting
.Text = "<[0-9]{3}>"
.MatchWildcards = True
.Forward = False
.Wrap = wdFindStop
.Font.Size = 14.5 ' 3桁数字を 14.5pt に限定
.Format = True ' 書式条件を有効化(必須)
End With
If rngNum.Find.Execute Then
With rngNum.Font
.Bold = True
.Color = wdColorRed
End With
rngNum.HighlightColorIndex = wdYellow
End If
rng.Collapse Direction:=wdCollapseEnd
Loop
Application.ScreenUpdating = True
End Sub
コードのポイント解説(例B)
rng.Findでは(MG)だけを探しており、.Format = Falseなのでサイズは一切気にしません。- 代わりに、
rngNum.Findの方で.Font.Size = 14.5と.Format = Trueを指定し、3桁数字が14.5ptのときだけヒットするようにしています。 - 後方検索と
End:=rng.Startによって、(MG)の直前にある最も近い3桁数字が見つかります。
例C:(MG)も3桁数字も両方14.5ptのときだけ対象にする
実務によっては、「(MG) も直前の数字も全部 14.5pt に揃っているケースだけ処理したい」ということもあります。その場合は、AとBの組み合わせで、両方にサイズ条件を付けます。
Sub Three_Digits_C()
Dim rng As Range
Dim rngNum As Range
Application.ScreenUpdating = False
Set rng = ActiveDocument.Content
With rng.Find
.ClearFormatting
.Text = "(MG)"
.Font.Size = 14.5 ' (MG) も 14.5pt に限定
.Format = True
.Forward = True
.Wrap = wdFindStop
.MatchCase = True
.MatchWholeWord = False
.MatchWildcards = False
End With
Do While rng.Find.Execute
Set rngNum = ActiveDocument.Range(Start:=0, End:=rng.Start)
With rngNum.Find
.ClearFormatting
.Text = "<[0-9]{3}>"
.MatchWildcards = True
.Forward = False
.Wrap = wdFindStop
.Font.Size = 14.5 ' 3桁数字も 14.5pt に限定
.Format = True
End With
If rngNum.Find.Execute Then
With rngNum.Font
.Bold = True
.Color = wdColorRed
End With
rngNum.HighlightColorIndex = wdYellow
End If
rng.Collapse Direction:=wdCollapseEnd
Loop
Application.ScreenUpdating = True
End Sub
このように、どのテキストのフォント条件で絞り込みたいかを意識し、対象となる Find ブロックにだけサイズ条件を設定するのがポイントです。
ワイルドカードで「ちょうど3桁の数字」に絞り込む
フォントサイズ以外にも、「3桁ちょうど」の数字に絞り込むワイルドカード設定も重要です。今回の例では、次のパターンを使っています。
.Text = "<[0-9]{3}>"
.MatchWildcards = True
この意味は次の通りです。
| パターン | 意味 | 例 |
|---|---|---|
[0-9]{3} | 数字が3つ連続する場所を探す。 前後に文字があってもヒットする。 | 1234 の中の 123 や 234 もヒット |
<[0-9]{3}> | 「語の先頭」から「語の末尾」までの3桁数字。 ちょうど3桁の数字のみ。 | 123 はヒット、1234 はヒットしない |
" <[0-9]{3}>" | 先頭に半角スペースが1つある3桁数字。 行頭や句読点直後の数字を取り逃す。 | 123 はヒットするが、123(行頭)はヒットしない |
実務では、行頭や句読点直後にも3桁数字があることが多いので、先頭にスペースを付けない "<[0-9]{3}>" の方が汎用的です。
なぜ (MG) 直前の数字だけに収束するのか(Range & 後方検索)
今回のコードのキモは、次の2点です。
ActiveDocument.Range(Start:=0, End:=rng.Start)で、文書の先頭~(MG)直前までだけを対象にしていること。.Forward = Falseによって、後ろから前に向かって検索していること。
たとえば、文書が次のような構造だったとします。
123 (MG) テキスト
456 (MG) テキスト
789 (MG) テキスト
2つ目の (MG) を見つけたとき、rng.Start はその (MG) の先頭を指します。その直前までの範囲には、次のようなテキストが含まれます。
123 (MG) テキスト
456
ここで後方検索(.Forward = False)を行うと、最後に登場する3桁数字は 456 になり、「2つ目の (MG) の直前にある最も近い3桁数字」だけがヒットします。これを Do While ループで繰り返すことで、各 (MG) に対応する直前の3桁数字を1つずつ処理できます。
.ClearFormatting の位置と注意点
書式条件を使うときに、意外と見落としがちなのが .ClearFormatting の位置です。
- 書式を設定する前に呼ぶ:余計な書式条件をリセットする目的。
- 書式を設定した後に呼ぶのはNG:せっかく指定した
.Font.Size = 14.5などもリセットされてしまう。
OK例:
With .Find
.ClearFormatting
.Text = "(MG)"
.Font.Size = 14.5
.Format = True
End With
NG例:
With .Find
.Text = "(MG)"
.Font.Size = 14.5
.Format = True
.ClearFormatting ' <= ここで全部リセットされてしまう
End With
複数の Find を使うコード(今回のように、rng と rngNum の2段構え)では、それぞれの Find ブロックで必ず最初に .ClearFormatting を呼ぶ、というクセをつけておくとトラブルが減ります。
Find の主なプロパティ整理(チェックリスト)
今回のコードに出てきた Find の主要プロパティを、ざっと整理しておきます。マクロが期待通りに動かないとき、まずはこのあたりをチェックすると原因が見つかりやすくなります。
| プロパティ | 役割 | 今回の典型的な設定 |
|---|---|---|
.Text | 検索する文字列またはワイルドカードパターン。 | "(MG)"、"<[0-9]{3}>" |
.MatchWildcards | ワイルドカード(正規表現に似た機能)を使うかどうか。 | 3桁数字側のみ True、(MG) 側は False |
.Forward | 前方検索(True)か後方検索(False)か。 | (MG) 側は True、数字側は False |
.Wrap | 検索が末尾(または先頭)に到達したときの挙動。 | wdFindStop(一度だけの検索で止める) |
.Format | フォント・段落などの書式条件を使うかどうか。 | サイズで絞る側だけ True にする |
.Font.Size | フォントサイズ条件の指定。 | 14.5 を指定(小数も可) |
.MatchCase | 大文字小文字を区別するか。 | (MG) が固定表記なら True、ゆれがあるなら False |
応用:他のフォント条件での絞り込みも同じ考え方
.Format = True の仕組みさえ押さえておけば、フォントサイズ以外の条件にも簡単に応用できます。
- フォント名で絞る:
.Font.Name = "MS 明朝" - 太字だけ:
.Font.Bold = True - 斜体だけ:
.Font.Italic = True - 色付きだけ:
.Font.Color = wdColorRedなど
いずれも、.Format = True を忘れると条件が効かない点は同じです。
例えば、「14.5ptかつ赤文字の3桁数字」だけを対象にしたい場合は、次のように書けます。
With rngNum.Find
.ClearFormatting
.Text = "<[0-9]{3}>"
.MatchWildcards = True
.Forward = False
.Wrap = wdFindStop
.Font.Size = 14.5
.Font.Color = wdColorRed
.Format = True
End With
このように、検索対象を「視覚的な条件」でサクッと絞り込めるのが、Word VBA の Find の強みです。
パフォーマンスと安定性のための実務的な工夫
長文書に対して Find を何度も回すマクロでは、パフォーマンスや安定性も重要です。今回のサンプルに関連するポイントをまとめておきます。
Application.ScreenUpdating = False
画面の再描画を止めることで、体感速度が大幅に向上します。処理が終わったら必ず True に戻します。- イベント抑止(必要に応じて)
文書を変更するとイベントが発火するようなアドイン・マクロがある環境では、Application.EnableEvents = Falseも検討します。 - Range ベースで処理する
Selectionを動かすより、Rangeで処理した方が高速で安全です。今回のコードもRangeだけで完結しています。 - テスト時は小さい範囲で試す
いきなり全ページに対して実行せず、まずは1章分だけをRangeにして試すと、デバッグが楽になります。
ありがちなトラブルと対処法
最後に、実務でよく遭遇するトラブルと、そのチェックポイントをまとめます。
| 症状 | 原因候補 | チェックポイント |
|---|---|---|
| 10.5pt や 12pt など、他サイズもヒットする | .Format = True を指定していない | 対象の Find ブロックで.Font.Size = 14.5 と .Format = True の両方が設定されているか |
| まったくヒットしない | .MatchWildcards の設定ミス ワイルドカードパターンの書き間違い フォントサイズやフォント名が実際とズレている | .MatchWildcards = True の有無 "<[0-9]{3}>" の前に余計なスペースを入れていないか 対象テキストの実際のサイズが本当に 14.5pt か |
| 行頭の数字だけヒットしない | " <[0-9]{3}>" など、先頭にスペースを付けている | .Text を "<[0-9]{3}>" に修正する |
| (MG) と数字がズレた組み合わせで装飾される | 検索範囲の設定ミス 前方検索のまま使っている | ActiveDocument.Range(Start:=0, End:=rng.Start) になっているか 数字側の .Forward が False になっているか |
まとめ:サイズで絞る検索の鍵は「Format = True」
Word VBA で「フォントサイズ 14.5pt のときだけヒットさせたい」といった条件検索を行う際のポイントを整理すると、次のようになります。
- 書式条件を使うには
.Format = Trueが必須.Font.Size = 14.5だけではサイズ指定は効かず、テキスト条件だけで検索されてしまう。 - どのテキストにサイズ条件を付けたいかを明確にする
(MG)側なのか、3桁数字側なのか、それとも両方なのかによって、.Format = Trueと.Font.Sizeを書く場所が変わる。 - 3桁数字は
"<[0-9]{3}>"のワイルドカードで厳密に絞る
先頭にスペースを入れないことで、行頭や句読点直後の数字も取りこぼさない。 - 後方検索+範囲指定で「(MG)直前の数字」に収束させる
ActiveDocument.Range(Start:=0, End:=rng.Start)と.Forward = Falseの組み合わせで、各(MG)に対応する直前の3桁数字だけを確実に拾える。
この考え方を押さえておけば、「フォントサイズ 10.5pt のときだけ」「太字かつ青文字のときだけ」といった条件にも簡単に応用できます。Word 文書のレイアウトルールや組版ルールに合わせて、「見た目で検索するマクロ」を自在に組めるようになると、文書チェックや差し替え作業の効率が一気に上がります。
ぜひ、今回のサンプルコードをベースに、あなたの現場のルールに合わせてアレンジしてみてください。

コメント