【VBA】ワイルドカードで覚えるべき内容はたったの5つ!

ワイルドカードの規則を覚える Excel

文字列のパターンマッチングといえば正規表現ですが、VBAの標準機能には含まれていません。

慣れてしまえば便利な正規表現も、知らない人にとっては複雑な呪文のように見えると思います。多くの人にとって敷居が高いと感じさせるものではないでしょうか。

そこで、今日はワイルドカードについて紹介します。
ワイルドカードは正規表現の入門編のような存在です。そこで今回は、以下の2点を主眼に置いて説明します。

  • VBAでワイルドカードを使うためのLike演算子
  • Like演算子で覚えるべき5つのパターン

※正規表現については以前のエントリで少し紹介しています。

そもそもパターンマッチングとは

冒頭でいきなりパターンマッチングという言葉を使ってしまいました。

その言葉どおり、パターンに合致する文字列を探すということになります。

たとえば、ある会社の製品型番が以下のようだったとしましょう。

  • NR-19HT-WH
  • NR-20BR-WH
  • NR-67UF-WH

先頭の「NR-」と末尾の「-WH」が共通で、挟まれる部分が数字2+英字2で構成されているのが分かります。

このように、完全に同じ文字列ではないものの、一定の規則(=パターン)に基づいた語句を検索するのにパターンマッチングが役に立ちます

そのパターンマッチングのなかで簡単に扱えるのがワイルドカードということになります

Like演算子

VBAでパターンマッチングを使うには、Like演算子を使用します。

Like演算子は基本的にTrueかFalseを返す演算子です。使い方は以下の通りです。
※例外として下記のmyStringまたはmyPatternがNullの場合はNullを返します。

Dim myString As String '判定する対象
Dim myPattern As String 'パターン
If myString Like myPattern then
    'パターンに一致した場合の処理
End If

ワークシートの数式に“=A1=B1”と入力したときのような挙動と似ています。
なじみやすい書き方だと“=IF(A1=B1,TRUE,FALSE)”と同じことですね。

Likeは演算子なので、=やMod等と同じくくりの存在です

見た目こそ記号でなくてLikeという文字なので分かりにくいと思います。
Modも同じ理由でとっつきにくい存在ですが、似たようなものです。
※細かく言うとModは数値を返す算術演算子でLikeは論理値を返す比較演算子

話が少し逸れてしまいましたが、とにかく使い方は“文字列 Like パターン”です

具体的な例を挙げましょう。
さきほどの型番の例なら、以下のように判定します。

Private Function myCheck()
    myString = "NR-19HT-WH"
    myPattern = "NR-##[A-Z][A-Z]-WH"
    myCheck = myString Like myPattern 'Trueを返す
End Function

では、その肝心のパターンをどう記述すればいいかを次に説明します

覚えるべきパターンはたったの5つ

結論からいきましょう。覚えるべきパターンをまとめると以下です。

パターン 一致させる文字
?任意の1文字
*0文字以上の任意の文字列
#任意の半角数字1文字
charlist ] charlist の中のいずれか1文字
!charlist ] charlist 以外のいずれか1文字

大文字と小文字は区別されることに注意して下さい
区別したくない場合はモジュールの最初にOption Compare Textと記述するようにしてください。

また、パターンを表すのに使われる文字そのものを指定したい場合は、[?][#]のように角括弧で囲ってください

さらに[a-z][A-Z]のように範囲でcharlistを指定することも可能です

最後に、具体例をみて理解しましょう。下記はすべてTrueが返ります。

Debug.Print "kN6a" Like "k[L-Q]#[!c-f]"
Debug.Print "HSY243khg" Like "H?Y*"
Debug.Print "d!123ku]i" Like "d[!]*[]]?"

まとめ

今日はVBAのワイルドカードについて書きました。記事の内容を要約します。

  • “文字列 Like パターン”でパターンマッチングが使える
  • 使用できるワイルドカードは、?, *, #, [charlist], [!charlist]の5種類
  • 大文字小文字を区別しない場合はOption Compare Textをモジュール先頭に書く
  • ワイルドカード自体を指定するには[]で囲う
  • charlist[A-Z]のように範囲指定もできる

プログラミングは自転車を運転するようなものです!
最初は時間がかかりますが、慣れるとスイスイ使えるようになります。

余談

最近はWeb関連のスキルを身に着けたくて完全オンラインで次の職を得るレベルまで対応できるスクールを探しています。

コーディングの勉強自体は独学でもなんとでもなる気がするんですが、問題はWeb開発系の仕事がどうやって回っているかという業界の常識を知らないこと。

現役エンジニアがビシバシ指導してくれそうという観点で探すと、2つくらい有力候補が見つかりました。

Macと受講料で20~30万円は少なくとも必要となります。
ただ、独学よりも効率がいいのであれば人生の時間を買っているのだと考えることもできます。

額が額なだけに何が最適か、少し悩み中です……。

コメント

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