Word VBAでフォントサイズ14.5ptだけを検索する方法|Find.Formatで(MG)直前の3桁数字を絞り込む

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.FindSelection.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) だけがヒットします。
  • rngNumStart:=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 の中の 123234 もヒット
<[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   ' &lt;= ここで全部リセットされてしまう
End With

複数の Find を使うコード(今回のように、rngrngNum の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 = "&lt;[0-9]{3}&gt;"
    .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) になっているか 数字側の .ForwardFalse になっているか

まとめ:サイズで絞る検索の鍵は「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 文書のレイアウトルールや組版ルールに合わせて、「見た目で検索するマクロ」を自在に組めるようになると、文書チェックや差し替え作業の効率が一気に上がります。

ぜひ、今回のサンプルコードをベースに、あなたの現場のルールに合わせてアレンジしてみてください。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次