【WordVBA】正規表現を使うには

Yahoo!知恵袋から、WordのVBAで正規表現を使う方法を紹介します。

質問

Yahoo!知恵袋で下記のような質問がありました。

ワードのマクロについて質問です。

.Text = “[00-99]号”

Do While .Execute

MsgBox Selection.Range & vbNewLine & “hoge”

Loop End With

上のマクロを使うと1号から9号までは取得できますが、10号以上が取得できません。どのようにワイルドカードを指定すればよいでしょうか。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q13271060728

質問してからだいぶ時間が経つのに、誰からも回答がついていなかったので、私が回答することにしました(1人でも回答がついていれば、私が助けなくても大丈夫だろうと思って、回答しないことにしています)。

回答

実際に作ったコードはこちらです↓

Option Explicit

Public Sub RegExeTest()
    With Selection.Find
        .MatchByte = False
        .MatchCase = False
        .MatchFuzzy = False
        .MatchPhrase = False
        .MatchWholeWord = False
        .MatchWildcards = True
        .Text = "[0-9]*号"
        Do While .Execute
    '        MsgBox Selection.Range & vbNewLine & "hoge"
            Debug.Print Selection.Range & vbNewLine & "hoge"
        Loop
    End With

End Sub

MsgBoxはループの中でいちいち表示されるのがうざかったのでコメント化してあります。

その代わりDebug.Printでイミディエイトペインに吐き出すようにしました。

解説

検索対象のドキュメントにどんな数字が含まれているか分からなかったのですけど、質問文にあるコードをみると、全角で「00」「99」となっているから、基本的に全角文字だけで、半角数字は使っていないものと解釈しました。

元のコードにあった、[00-99]の意味ですが、多分これを書いた人は、「00という全角数字から99という全角数字までの間にある数字」を意図したものと思われますが、実際には、0という全角数字と、0から9までの全角数字と、9という全角数字のいずれかという意味になってしまっています。

つまり、0、1、2、3、4、5、6、7、8、9のいずれか1文字です。だから、「1号から9号までは取得」できていたけど、10号以上は取得できなかったのです。

なので、本来やりたかったであろう正規表現にしてあげればよいだけなので、[0-9]*としました。

「*」(アスタリスク)というのは、0個以上の文字列の意味です。全角の0から9までの数字が0個以上という意味ですから、次のようなドキュメントがあったら、

法律の条文かな?

第1号(全角)

これってどういう文脈なんでしょう?2号

3号と4号

いっきにとばして

10号(半角!)

99号とか(これも半角)

100号は抽出されなくてOK?

01号かな?

よく分からない03号

そして09号

どうだ!?

ここは10号でーーーす

ここは21号

49号とか

マクロを実行すると、次のように抽出されます。

半角数字である「10号」「99号」「100号」は抽出されません。

もし半角数字も抽出したかったら、[0-90-9]*とすればよいです。

まとめ

以上、WordVBAで正規表現を使う方法でした。

私はVBAについては多少分かるので、ブログの記事ネタを提供してくれるなら、今なら無料でOffice系ソフトの相談を受け付けています。

匿名でできますので、ご利用ください(ただし、すぐに回答があるとは限らないし、全部の質問に答えられるとも限りません。あと個人情報や機密情報が含まれるモノは送らないでください)。

Excel相談(ExcelだけでなくWordやパワポもOK)

https://kn-sharoushi.com/excel_consultation/