みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Word VBAでいろいろな検索と置換をする方法についてシリーズでお伝えしています。
前回の記事はコチラ。
検索の方向や文書の最後まで検索したときの挙動をコントロールする方法をお伝えしました。
さて、Wordではワイルドカードを使った多種多様な検索をかけることができますが、VBAでももちろん実現をすることができます。
今回はWord VBAでワイルドカードを使った検索をする方法についてお伝えします。
Wordでワイルドカードを使った検索をする
WordではExcelよりもはるかに高度なワイルドカードを使えるの、ご存知でした?
定番は任意の1文字を表す「?」や、任意の文字列を表す「*」なのですが、Wordではほかにも多数のワイルドカードが用意されています。
それぞれの組み合わせで、様々な文字列のパターンで検索をすることができます。
記号 | 意味 | 使用例 |
---|---|---|
? | 任意の1文字 | 第?回 s?t |
* | 任意の文字列 | 第*回 s*t |
< | 単語の先頭 | <第 <pre |
> | 単語の末尾 | 回> fix> |
[ ] | 候補中のいずれか1文字 | [abcde] [東西南北] |
[-] | 範囲内のいずれか1文字 | [0-9] [a-zA-Z] [ぁ-ん] |
[! ] | 候補以外のいずれか1文字 | [!abcde] [!東西南北] |
( ) | グループ化して式を生成 | (ピヨ) ([0-9]{1,3}) |
{n} | 直前の文字または式をn回繰り返し | go{2}gle |
{n,} | 直前の文字または式をn回以上繰り返し | [0-9]{1,}円 |
{n,m} | 直前の文字または式をn~m回の間で繰り返し | [0-9]{1,3}ページ |
@ | 直前の文字または式を1回以上繰り返し | lo@p |
たくさんありますね~。
Wordの検索オプションで「ワイルドカードを使用する」をオンにすれば、これらのワイルドカードを使用することができるようになります。
MatchWildcardsプロパティでワイルドカードを使用する
Word VBAでの検索時にワイルドカードを使用する設定をする場合は、FindオブジェクトのMatchWildcardsプロパティをTrueにする必要があります。
その上で、FindオブジェクトのTextプロパティに検索パターンを設定して検索を実行すればよいのですが…
MatchWildcardsプロパティ設定時に実行時エラーが発生する理由
しかし、例えば以下のようなプロシージャを実行しても
Sub findPattern()
With Selection.Find
.Text = "第?位"
.MatchWildcards = True
Do While .Execute
Stop
Loop
End With
End Sub
「MatchPhrase、MatchWildcards、MatchSoundsLike、MatchAllWordForms、MatchFuzzyパラメーターは、同時にTureに設定することはできません。」という実行時エラーが発生します。
…なんという複雑な条件なんでしょう。
Wordの検索オプションはデフォルト時には以下のような設定になっています。
プロパティ | 既定値 | 検索オプションの設定 |
---|---|---|
MatchWildcards | False | ワイルドカードを使用する |
MatchSoundsLike | False | あいまい検索(英) |
MatchAllWordForms | False | 英単語の異なる活用形も検索する |
IgnoreSpace | False | 空白文字を無視する |
IgnorePunct | False | 句読点を無視する |
MatchFuzzy | True | あいまい検索(日) |
※MatchPhraseは空白文字を無視する、句読点を無視する、両方の設定を同時に対応したプロパティです。
以下の記事で詳細をお伝えしています。
つまり、MatchFuzzyがTrueになっているので、ダメだよと怒られちゃっているわけですね。
MatchFuzzyプロパティをFalseに設定する
ですから、以下のようにMatchWildcardsプロパティをTrueにする前に、MatchFuzzyプロパティをFalseにしてあげます。
Sub findPattern()
With Selection.Find
.Text = "第?位"
.MatchFuzzy = False
.MatchWildcards = True
Do While .Execute
Stop
Loop
End With
End Sub
これを実行すると、無事に以下のように「第~位」というワードを検索できるようになるわけです。
ワイルドカードを使ってパターンで検索をする例
他の検索パターンも見てみましょう。
ページ数を表すパターン
例えば、任意の1桁から3桁までの半角数字に「ページ」という文字列を組み合わせたパターンは
とすればよいですね。
カンマ入りの金額を表すパターン
また、カンマ区切りが入っている任意の半角数字の数値にプラスして「円」の文字列をマッチさせたいときは
とします。
まとめ
Word VBAでワイルドカードを使った検索をする方法についてお伝えしました。
パターンの作り方は少しややこしいですが、他にも郵便番号や電話番号など様々なパターンを生成できますので、頑張ってトライしてみてください。
また、MatchFuzzyプロパティのオフについては忘れずに!
次回はワイルドカードを使った置換の方法についてお伝えしていきます。
どうぞお楽しみに!