Like演算子、ワイルドカードで文字列のパターンマッチングができる
エクセルは演算子を使う事が出来ます。よってマクロもプロシージャ(プログラム)内で演算子を利用できます。
その中でもLike演算子を使う事で比較的簡単に特定のキーワードとの一致を確認する事ができます。
- セルの中に書かれた文字(数字含)
- 品番や品名など特定の文字列
- 数値
他にも大文字、小文字等色々な文字列がありますが全てLike演算子を使えばカテゴライズ可能です。
コードを組む際にはワイルドカードや変数を用いる事でより複雑な条件も設定できるようになります。
演算子と聞くと聞き慣れないかもしれませんが実はとても身近で使用頻度が高い内容です。
VBAを10年使い続けていますがずっとお世話になっている欠かせない機能です。
今回は比較演算子を解説する記事を用意してみました。俗に言う「あいまい検索」が可能になります。
読み返したりコードをコピペできる様に使い勝手が良い記事にしてあります。
「ワイルドカードが使えない」、「いまいち使い方がわからない」方にもわかる様にデータを用意しました。
コードをコピーしてVBEに貼っていただけるとそのまま試せるものばかりです。是非試してみてください。
Like演算子の使い方をすぐに見たい方はこちら(記事内の所定の場所にリンクしています)
Like演算子を含む演算子について知りたい方はこのまま記事をご覧ください。
演算子についてリストを使って分かり易く解説しています。
考えが整理出来ます。Like演算子、ワイルドカードを使いこなせるようになりますよ。
この記事を読むとわかる事
基礎的なところから紹介しています。最後の方には事例も紹介しています。
初心者から中級者までスキルの区別なくご覧いただける内容にしています。
- 演算子とは何か
- Like演算子とは何か
- ワイルドカード(?や*)の使い方
Enjoy Excel
関連記事
Like演算子とFor Each ~ Nextステートメントを使ってワークブック内のシートを周回しています。
具体例を使って解説マクロで特定文字を含むシートを選択|For Each ~ Next & Like
フォルダからタイトルに一定のキーワードを持つ画像だけエクセルに取り出すコードを紹介します。
画像のタイトルから一定のキーワードを確認する際にLike演算子を使っています。
関連記事VBAで画像を取り込む画像自体を取得する方法を紹介 作業高速化
マクロに慣れてくると別のワークブックを開いて作業をする事ができる様になります。
1つのフォルダ内にある複数の.xlsxファイルを開くという作業の中でワイルドカードを使っています。
関連記事VBA|Dir関数を使ってフォルダ内の複数ファイルを順番に処理する
演算子とは
定義の様に確立されたものほど情報のソースが大切です。ChatGPTに聞いてみます。
プログラミングで使用される演算子は、さまざまなタスクを実行するためにコード内で使用される特殊な記号または文字です。
ChatGPT:プログラミングで使われる演算子について教えてください
私はMicrosoftさんのリファレンスかもう1つの本を使って定義を調べています。
本日は本から引用させていただきます。
演算子とは、加算や減算などの算術的な計算や、値の比較などといった演算を行うための記号
パーフェクトExcelVBA 高橋宣成 著 54ページ
こちらの書籍から情報を引用しました。
私は電子書籍で購入しています。
両方の回答に共通しているのは記号だという事です。分かり易く言うとプラスとかマイナスなどの記号の事です。
ほかにもExcelVBAでは以下演算子を使う事が出来ます。
番号 | 演算子 | 説明 |
---|---|---|
1 | 算術演算子 | 数学計算を行う演算子 |
2 | 連結演算子 | 文字列を連結するための演算子 |
3 | 比較演算子 | 比較を行うための演算子 |
4 | 論理演算子 | 論理計算を行うための演算子 |
演算子の名前だけ見るとあまり馴染みが無い気がするのですが実は皆さんも良く使っているんですよ。
- 算術:四則演算など
- 連結:&など
- 比較:未満、以下など
- 論理:And、Orなど
これで「イメージ出来た」方も増えたはずです。演算子と言われると構えてしまいます。
しかしいつもやっている事を改めて定義と突き合わせて整理してみると難しくないんですよ。
Like演算子
Like演算子は比較演算子の中に属します。引用先の定義をご覧ください。
2 つの文字列を比較するために使用します。
Microsoft Lern Like 演算子
文字列が特定のパターンに当てはまるかどうかを判定する演算子です。
パーフェクトExcelVBA 高橋宣成 著 58ページ
2つの文字列を比較して一致/不一致を確認します。一致する時はTrue、不一致の時はFalseをかえします。
加えて「特定のパターン・・・」と書いてありますので条件次第ではある程度幅を持って一致を確認する事も出来ます。
構文
構文としては以下のような型をとります。
見ただけでは少し分かりにくいので説明していきますね。
番号 | 要素 | 説明 |
---|---|---|
1 | result | 任意の変数を指定 |
2 | string | 任意の文字列式を指定 |
3 | pattern | パターンマッチング規則に従った任意の文字列式を指定 |
sringには自分が検索をかけたいキーワードを置きます。(変数も使えます)
patternには以降で紹介するワイルドカードを置きます。(変数も使えます)
Stringとpatternの間にLike演算子を配置します。
Srringとpatternが一致するとresultにはTrueが返ります。
一致しない時はFalseが返ります。具体的に以下2つのコードで検証してみましょう。
事例を使って構文を確認する
2つの文字列をパターンマッチングさせます。
Sub samplecode()
Dim a As Boolean
Dim b As Boolean
a = "エクセル" Like "セル"
b = "エクセル" Like "*セル*"
End Sub
コードの解説
aとbはBoolean型の変数です。もちろんVariant型でも可です。
最初の変数aにはFalseが返ります。次の変数bにはTrueが返ります。
下のコードには*(アスタリスク)が居ますね。Trueを返したのもこの記号が原因です。
*もLike演算子を構成する機能です。ワイルドカードとも呼ばれたりします。
ワイルドカード
ワイルドカードの種類と使用例を解説していきます。
以下リストをご覧ください。実際にどうやって使うのかは後半で事例を使って説明しています。
番号 | パターン内の文字 | 説明 |
---|---|---|
1 | ? | 任意の1文字 |
2 | * | 0文字以上の文字 |
3 | # | 任意の1桁の数値 |
4 | [charlist] | charlistの任意の1文字 |
5 | [!charlist] | charlistにない任意の1文字 |
6 | – | []内の開始と終了の文字の間で使用し範囲を表現 |
まずは構文セクションの中で文字列の一致を確認した際に何が起こっていたのか見ていきます。
ワイルドカードの使われ方
ワイルドカードの*(アスタリスク)を使った事例を1つ紹介します。
画像をご覧ください。「エクセル」という文字列と「*セル*」という文字列が並んでいますね。
結論から申し上げますとこの2つの文字列は一致するのでLike演算子で照合をかけると結果はTrueがかえってきます。
理由は前後のアスタリスクが働いている為です。アスタリスクは0文字以上の文字を表現してくれます。
このアスタリスクによってエクセルという文字列と*セル*という文字列は完全に一致していますという事になります。
ワイルドカードを使った完全一致で何ができるのか?
操作としては「完全一致」ですが結果として部分一致で検索をかけることができます。
部分一致はFindメソッドも有名ですがLike演算子+ワイルドカードでも再現できるという事になります。
私は部分一致をとる時はLike演算子+ワイルドカードしか使いません。(理由はこちらの記事を確認ください)
参考:正規表現は必要なのか
こんな質問を良くいただきます。エンジニアの方にはお馴染みの正規表現です。
Like演算子やワイルドカードを使う事でほとんどの事は達成できます。
参考:Findメソッドとの比較
文字列検索はFindメソッドよりLike演算子の方が簡単です。以下記事ではFindメソッドのデメリットを紹介しています。
Findメソッドの使い方VBAのFindメソッドは変数が難しい|文字列検索はLike演算子!
事例を紹介
ここからはLike演算子を使った事例を紹介していきます。
事例1_条件分岐と一緒に使ってみる
実際には条件分岐と一緒に使う事が多いです。具体的には以下の様に使う事が出来ます。
条件分岐について興味がある方はこちらをご覧ください。
条件分岐とメッセージボックスのコラボVBA-11マクロ内でMsgBoxとIFステートメントを組み合わせる
ここでは構文でいうStringの位置に変数の文字列を用意しました。
セルに書かれている文字列を指定しても良いです。
比較される文字と比較する文字をLikeで挟んで結果により処理を分ける事が出来ればOKです。
あとは皆様の仕事に合わせた使い方を考えてください。
Sub 文字列1()
Dim kw As String
kw = "aaagaaa"
If kw Like "a??g*" Then
'Trueの処理
MsgBox "文字列は一致しました", vbInformation, "結果"
Else
'Falseの処理
MsgBox "文字列は一致しませんでした", vbInformation, "結果"
End If
End Sub
このマクロを実行すると条件分岐ではTrueを返します。
メッセージボックスには「文字列は一致しました」の文字が表示されることになります。
ワイルドカードを忘れない様に設定してください
Like演算子の後に ”a??g*” という文字列があります。誤って ”a??g” にならない様に気を付けてください。
Like演算子を使用する事に思考が向いているとアスタリスクを忘れることが多いです。
アスタリスクを忘れると4文字目のg以降に文字があるキーワードは全てエラーになってしまいます。
紹介したIfステートメントではTrueに処理を流すつもりでコードを用意していますので意図しない事が起きてしまいます。
「なんかおかしいな」と思ったらアスタリスクを見直す事をおすすめします。他にもポイントがありますので紹介します。
事例2_比較演算子のイコールとの使い方の違いを確認する
イコールもLike演算子同様に比較演算子です。
同じ要素なので直近のコードを使って「Like」を「=」に変えても意味は同じなんじゃないかと考えるかもしれません。
結論としては「Like」と「=」は意味が違います。
別の方法でマクロを実行している事になるのでマクロ実行時の条件分岐も結果が変ってきます。
「=」もワイルドカードが使えない時に確認するポイントです
「ワイルドカードが使えない」と言う問い合わせがあった際私は最初にココを疑います。
「Like」と書かないといけない所が「=」になっていてワイルドカードが機能してない事が非常に多い為です。
その次がアスタリスクなどのワイルドカードが自身が意図した場所に配置されているのかを確認しています。
「=」を使う事でワイルドカードが機能しない事例を用意しました。以下プロシージャをご覧ください。
コードを見ながら確認
実際にコードを用意してみました。条件分岐のIfステートメントでイコールを使っています。
これだとFalseが返ってくるのでコードはElse以下の処理に進んでしまいます。何故でしょうか。
Sub 文字列2()
Dim kw As String
kw = "aaagaaa"
If kw = "a??g*" Then
'Trueの処理
MsgBox "文字列は一致しました", vbInformation, "結果"
Else
'Falseの処理
MsgBox "文字列は一致しませんでした", vbInformation, "結果"
End If
End Sub
変数kwに代入されている “aaagaaa” という文字列と ”a??g*”が全く同じものか?
と聞く事になってしまいます。完全一致を確認するコードになります。
Likeが居るからこそLike以下のパターン句に用意された文字列の中でワイルドカードが活きています。
バリエーションを持って一致か不一致を確認出来ています。
Likeがイコールだと素直に「一緒の文字か?」と聞いてしまいます。
一緒ではないのでIfステートメントはFalseを返すという事になります。
事例3_Like演算子を使う際パターン句に変数を使いたい時
パターン句に変数を使って変数の前後に*や?を使いたい時が出てきます。
勉強が進むとより複雑な事を思いつく様になります。
この辺まで気付ける様になると大抵の事は出来る様になっています。
Sub パターンに変数を使う時()
Dim kw1 As String
Dim kw2 As String
kw1 = "aaagaaa"
kw2 = "*" & kw1 & "*"
If "bbaaagaaa11" Like "*" & kw1 & "*" Then
'Trueの処理
MsgBox "文字列は一致しました", vbInformation, "結果"
Else
'Falseの処理
MsgBox "文字列は一致しませんでした", vbInformation, "結果"
End If
End Sub
変数kw1の前後にアスタリスクを配置したいです。
しかし “*kw1*” と入力すると一致と認識してくれません。
連結演算子を使う
どうすれば良いのでしょうか。解決策(記述方法)はあります。
連結演算子の&(アンパサンドもしくはアンド)を使って変数とワイルドカードを繋ぎます。
コード上はアンパサンドで単純に文字列を繋いで読むだけの様に見えています。
しかし内部ではアンパサンドで繋いだコードは文字列として連結されます。
コード上にkw2という変数を用意しました。
この変数はkw1という変数の前後にアスタリスクを置いています。
アンパサンドで繋いだ時にどんな値になっているのか見る為だけの変数です。
実際にコードを実行するとローカルウインドウでは以下の様な文字列を見る事が出来ます。
連結演算子は「まとめる」のが仕事
ローカルウインドウをご覧ください。
の変数「kw2」には “*aaagaaa*” というString型の文字列が格納されています。
アンパサンドでコードを繋ぐと全ての文字列を1つの文字列に連結します。
文字列なので連結後の文字列の前後にはしっかりダブルクォーテーションが付きます。
この文字列をもってIfステートメントに入ります。
実質変数の前後に*が付いているのと同じ環境でコードが実行されるという事です。
これは非常に助かる動きです。
この様に1歩掘り下げてコードを見ると1つの処理に対して理屈が伴うので知識の定着に役立ちます。
アンパサンドを使っている関連記事
アンパサンドはファイルパスとファイル名を繋ぐときなど色々な状況で使われます。
使用頻度も高い機能です。是非マスターしてください。関連記事を用意しておきます。
事例4_アスタリスクを文字列として認識する方法
早速事例とコードを見てください。A列に10個の文字列が並んでいます。
他のキーワードはスルーして9行目の「ア*ス」だけを引っかける為のコードを紹介します。
なぜこのような事が出来るのかというとコード内で[](角括弧、ブラケット)を使っているからです。
これもワイルドカードで紹介した要素です。ブラケットの中に一文字を書くと任意の一文字として認識されます。
この機能を利用してアスタリスクを任意の一文字にしてしまいます。
では説明をふまえて以降のコードをご確認ください。
Sub アスタリスク文字列として認識させる()
Dim r As Long
For r = 1 To 10
'[ ] を使ってワイルドカードを1つの文字列として認識(エスケープ)させる
If Cells(r, 1) Like "ア[*]ス" Then
Cells(r, 2) = "ヒット"
End If
Next
End Sub
ワイルドカードを回避する方法を「エスケープ」、「エスケープシーケンス」と呼んだりします。
文字で書くと「今回はワイルドカードのアスタリスクをエスケープさせるコードを組みました」となります。
事例5_Like演算子の色々な使い方をMicrosoftのHPより引用
良いサンプル(事例)がありましたので紹介します。そのままVBEにコピペして使ってください。
ローカルウインドウでどんな値がが返ってくるか見ながら学習するとLike演算子が理解出来ます。
Microsoft Lern Like 演算子Dim MyCheck MyCheck = "aBBBa" Like "a*a" ' Returns True. MyCheck = "F" Like "[A-Z]" ' Returns True. MyCheck = "F" Like "[!A-Z]" ' Returns False. MyCheck = "a2a" Like "a#a" ' Returns True. MyCheck = "aM5b" Like "a[L-P]#[!c-e]" ' Returns True. MyCheck = "BAT123khg" Like "B?T*" ' Returns True. MyCheck = "CAT123khg" Like "B?T*" ' Returns False. MyCheck = "ab" Like "a*b" ' Returns True. MyCheck = "a*b" Like "a [*]b" ' Returns False. MyCheck = "axxxxxb" Like "a [*]b" ' Returns False. MyCheck = "a [xyz" Like "a [[]*" ' Returns True. MyCheck = "a [xyz" Like "a [*" ' Throws Error 93 (invalid pattern string).
マイナーな仕様もあります。しかし裏を返せばこれらをマスター出来れば多くの事例に対応できますよ。
あくまで使用例ですので暗記などは不要です。実際に使用する時に調べながら使う事をおすすめします。
その他
参考で手作業で文字列をソートする時にアスタリスクを使う方法と私自身の使用例を記載しておきます。
手作業のソート内でアスタリスクを利用する
今回勉強した*(アスタリスク)や?はマクロではなく手作業でも使う事が出来ます。
フィルタを使って文字列を検索する際にも有効です。
E列に画像のような文字列を用意しました。
こんな並びの文字を書く事はあまり無いのですが練習用という事で大目に見てください。
*(アスタリスク)を使った絞り込みです。C(もしくはc)を含んだ文字列が選択されています。
周りに教えてあげてください
マクロを使えない人に教えてあげると大変喜ばれます。
VBAを使えない方から質問を受けた際にはこのような機能があると教えてあげると助かるはずです。
実際マクロを書けなかった時の私は教えてもらった時に驚いたのと同時にすごく嬉しかったです。
理由は単純です。検索でかなり手数を減らすことが出来るからです。
VBAにはワークシート関数の様に手作業でも使える機能がたくさんあります。
より多くの人に「手作業でもマクロでも使える機能」を知ってもらう事が必要です。
出来ればVBAに興味をもってもらえて勉強したいなと考える人が増えるかもしれません。
私自身が経験した事例
私はLike演算子にはかなりお世話になっています。その中から一部を紹介します。
画像が入った複数のフォルダの中から各画像の名前をLike演算子を使って確認します。
その後条件に一致した画像だけエクセルに取り出すというコードを組みました。
画像を高速で取り出すVBAで画像を取り込む高速で画像自体を取得しエクセルに貼り付ける
Webスクレイピングの際に指定した要素が特定のClass(キーワード)を持っているのかをLike演算子で確認します。
特定のキーワードがあれば○○するというコードを組みました。
VBAでWebスクレイピング【selenium×VBA】XPath指定でClass属性を取得|Attribute
Like演算子を含む比較演算子を使いこなせることが出来ればどんな文字列が出て来ても処理することが出来ます。
非常に便利な機能です。
まとめ
演算子の中から比較演算子に属するLike演算子を紹介しました。ワイルドカードの使い方も分かりました。
これでセルにある一定のキーワードを拾って・・・というコードを書けます。
- 演算子とは何かが分かった
- Like演算子で文字列の一致を調べる事ができる
- *や?は検索に幅を持たせる事ができる
Enjoy Excel
条件分岐と一緒に使う際条件に論理演算子を使うとさらに深みのある検索をかける事ができます。
条件○○と条件△△に合致した際は・・・のような条件分岐をつくってみましょう。
さらに情報をカテゴライズする事が出来ます。是非トライしてみてください。
文字列関連の関連記事を用意しました。
合わせて記事を見ていただくと文字列の扱いについて出来る事が増えて世界が広がります。