エクセル関数やVBAのコードを自動で生成

GPTExcelの使い方はこちら

VBAで文字列を比較Like演算子とワイルドカードで完全/部分一致を確認【一覧で表示】

スポンサーリンク

お知らせ記事には広告が含まれておりますがExcelのスキルUPに繋がる様コンテンツ自体は手を抜かずに作成しております

Like演算子、ワイルドカードで文字列のパターンマッチングができる

エクセルでも演算子を使う事が出来ます。よってマクロでも演算子を利用できます。

その中でもLike演算子を使う事で比較的簡単に特定のキーワードとの一致を確認する事ができます。

  • セルの中に書かれた文字
  • 品番や品名など特定の文字列
  • 数値

色々な文字列がありますが全てLike演算子を使えばカテゴライズ可能です。

コードを組む際にはワイルドカード変数を用いる事でより複雑な条件も設定できるようになります。

演算子と聞くと聞き慣れないかもしれませんが実はとても身近で使用頻度が高い内容です。

VBAを10年使い続けていますがずっとお世話になっている欠かせない機能です。

今回は比較演算子を解説する記事を用意してみました。俗に言う「あいまい検索」が可能になります。

読み返したりコードをコピペできる様に使い勝手が良い記事にしてあります。

情報を整理したリストコピペしてすぐ使えるコードを用意しています

「ワイルドカードが使えない」、「いまいち使い方がわからない」方にもわかる様にデータを用意しました。

コードをコピーしてVBEに貼っていただけるとそのまま試せるものばかりです。是非試してみてください。

Like演算子の使い方をすぐに見たい方はこちら(記事内の所定の場所にリンクしています)

Like演算子を含む演算子について知りたい方はこのまま記事をご覧ください。

EnjoyExcel
EnjoyExcel

演算子についてリストを使って分かり易く解説しています。

考えが整理出来ます。Like演算子、ワイルドカードを使いこなせるようになりますよ。

この記事を読むとわかる事

基礎的なところから紹介しています。最後の方には事例も紹介しています。

初心者から中級者までご覧いただける内容にしています。

本日勉強すること
  1. 演算子とは何か
  2. Like演算子とは何か
  3. ワイルドカード(*や?)の使い方
一緒に頑張りましょう

Enjoy Excel

関連記事

フォルダからタイトルに一定のキーワードを持つ画像だけエクセルに取り出すコードを紹介します。

画像のタイトルから一定のキーワードを確認する際にLike演算子を使っています。

演算子。聞き慣れないキーワードです。以降で解説していきます。

演算子とは

定義の様に確立されたものほど情報のソースが大切です。ChatGPTに聞いてみます。

プログラミングで使用される演算子は、さまざまなタスクを実行するためにコード内で使用される特殊な記号または文字です。

ChatGPT:プログラミングで使われる演算子について教えてください

私はMicrosoftさんのリファレンスかもう1つの本を使って定義を調べています。

本日は本から引用させていただきます。

演算子とは、加算や減算などの算術的な計算や、値の比較などといった演算を行うための記号

パーフェクトExcelVBA 高橋宣成 著 54ページ

両方の回答に共通しているのは記号だという事です。分かり易く言うとプラスとかマイナスなどの記号の事です。

ほかにもExcelVBAでは以下演算子を使う事が出来ます。

番号演算子説明
1算術演算子数学計算を行う演算子
2連結演算子文字列を連結するための演算子
3比較演算子比較を行うための演算子
4論理演算子論理計算を行うための演算子
良く使うものだけリストアップしました。

演算子の名前だけ見るとあまり馴染みが無い気がするのですが実は皆さんも良く使っているんですよ

  • 算術:四則演算など
  • 連結:&など
  • 比較:未満、以下など
  • 論理:And、Orなど

これで「イメージ出来た」方も増えたはずです。演算子と言われると構えてしまいます。

しかしいつもやっている事を改めて定義と突き合わせて整理してみると難しくないんですよ。

Like演算子

Like演算子は比較演算子の中に属します。引用先の定義をご覧ください。

2 つの文字列を比較するために使用します。

Microsoft Lern Like 演算子

文字列が特定のパターンに当てはまるかどうかを判定する演算子です。

パーフェクトExcelVBA 高橋宣成 著 58ページ

2つの文字列を比較して一致/不一致を確認します。

特定のパターンと書いてありますのである程度幅を持って一致を確認する事も出来ます。

構文

構文としては以下のような型をとります。

見ただけでは少し分かりにくいので説明していきますね。

result = string Like pattern

番号要素説明
1result任意の変数を指定
2string任意の文字列式を指定
3patternパターンマッチング規則に従った任意の文字列式を指定

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演算子を構成する機能です。ワイルドカードとも呼ばれたりします。

このワイルドカードがパターン内で多くのバリエーションを持たせながらStringとの一致(マッチング)を試みます。

ワイルドカード

ワイルドカードの種類と使用例を解説していきます。

以下リストをご覧ください。実際にどうやって使うのかは後半で事例を使って説明しています。

番号パターン内の文字説明
1?任意の1文字
2*0文字以上の文字
3#任意の1桁の数値
4[charlist]charlistの任意の1文字
5[!charlist]charlistにない任意の1文字
6[]内の開始と終了の文字の間で使用し範囲を表現
ー は分かりにくいですね。 [A-Z]とする事でAからZの中にある任意の1文字と一致するのかを見る事が出来ます。

まずは構文セクションの中で文字列の一致を確認した際に何が起こっていたのか見ていきます。

ワイルドカードの使われ方

“セル”は確かにエクセルの中に含まれてはいるのですが一致はしていません。

代わって“*セル*”だとどうでしょうか。

前後にアスタリスクが居ます。

セル」という文字の前後に何か文字が居て良い前提で「エクセル」と一致するかを聞いています。

Like演算子による文字列の比較について
*(アスタリスク)であれば「セル」の後ろに文字が居なくてもOKです。

Stringの文字列「エクセル」の中にパターンで提示する「*セル*」と一致するかを確認しています。

画像の文字列は一致するという判断がなされます。よってTrueが返ってきます。

コード上での使い方

実際には条件分岐と一緒に使う事が多いです。具体的には以下の様に使う事が出来ます。

条件分岐について興味がある方はこちらをご覧ください。

ここでは構文でいう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を=に変えても意味は同じなんじゃないかと考えるかもしれません。

結論としては 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を返すという事になります。

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

変数kwの前後にアスタリスクを配置したいです。

しかし “*kw*” と書いてしまうとkwが変数ではなく文字列という扱いになります。

連結演算子を使う

どうすれば良いのでしょうか。解決策はあります。

連結演算子の&(アンパサンドもしくはアンド)を使って変数とワイルドカードを繋ぎます。

コード上はアンパサンドで単純に文字列を繋いで読むだけの様に見えています。

しかし内部ではアンパサンドで繋いだコードは文字列として連結されます。

コード上にkw2という変数を用意しました。

この変数はkw1という変数の前後にアスタリスクを置いています。

アンパサンドで繋いだ時にどんな値になっているのか見る為だけの変数です。

実際にコードを実行するとローカルウインドウでは以下の様な文字列を見る事が出来ます。

連結演算子は「まとめる」のが仕事

ローカルウインドウをご覧ください。

の変数「kw2」には “*aaagaaa*” というString型の文字列が格納されています。

アンパサンドでコードを繋ぐと全ての文字列を1つの文字列に連結します。

変数kw1の値を一旦紐解いて文字列に起こしたうえでアンパサンドで繋がっている文字列を1つにします

文字列なので連結後の文字列の前後にはしっかりダブルクォーテーションが付きます。

この文字列をもってIfステートメントに入ります。

実質変数の前後に*が付いているのと同じ環境でコードが実行されるという事です。

これは非常に助かる動きです。

この様に1歩掘り下げてコードを見ると1つの処理に対して理屈が伴うので知識の定着に役立ちます。

関連記事

アンパサンドはファイルパスとファイル名を繋ぐときなど色々な状況で使われます。

使用頻度も高い機能です。是非マスターしてください。関連記事を用意しておきます。

VBAでアスタリスクを文字列として認識する方法

早速事例とコードを見てください。A列に10個の文字列が並んでいます。

他のキーワードはスルーして9行目の「ア*ス」だけを引っかける為のコードを紹介します。

なぜこのような事が出来るのかというとコード内で[](角括弧、ブラケット)を使っているからです。

これもワイルドカードで紹介した要素です。ブラケットの中に一文字を書くと任意の一文字として認識されます。

この機能を利用してアスタリスクを任意の一文字にしてしまいます。

では説明をふまえて以降のコードをご確認ください。

Sub vbaアスタリスク文字列として認識させる()

Dim r As Long

For r = 1 To 10

    '[ ] を使ってワイルドカードを1つの文字列として認識(エスケープ)させる
    If Cells(r, 1) Like "ア[*]ス" Then
    
        Cells(r, 2) = "ヒット"
    
    End If

Next

End Sub

ワイルドカードを回避する方法を「エスケープ」、「エスケープシーケンス」と呼んだりします。

文字で書くと「今回はワイルドカードのアスタリスクをエスケープさせるコードを組みました」となります。

事例を紹介

ここからはLike演算子を使った事例を紹介していきます。

MicrosoftさんのHPより引用

良い事例がありましたので紹介します。そのままVBEにコピペして使ってください。

ローカルウインドウでどんな値がが返ってくるか見ながら学習すると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).
Microsoft Lern Like 演算子

こんなの使うのかと思えてしまいます。裏を返せばほとんどの事例はこれで対応できますよ。

あくまで使用例ですので暗記などは不要です。実際に使用する時に調べながら使う事をおすすめします。

正規表現は必要なのか

こんな質問を良くいただきます。

Q
複雑なキーワードとの比較、照合は正規表現を使わないといけないのか?
A

VBAでは正規表現は不要です。あえて不要と言いました。

VBAで出来る事を勉強して運用した方がコスパが良い為です。

Like演算子やワイルドカードを使う事でほとんどの事は達成できます。

私自身が経験した事例

あくまで私的な情報となりますが私はLike演算子にはかなりお世話になっています。

色々な事例で使わせていただいておりますので一部を紹介します。

事例紹介
  1. 画像が入った複数のフォルダの中から各画像の名前をLike演算子を使って確認し条件に一致した画像だけエクセルに取り出すというコードを組みました。関連記事
  2. フォルダ内の複数のワークブックの中にあるすべてのシートを確認し一定の型を持った13桁の品番を10桁にしてセルに色を付けるというコードを組みました。関連記事

Like演算子を含む比較演算子を使いこなせることが出来ればどんな文字列が来ても大概対応出来ます。

非常に便利な機能です。

マクロ以外でもアスタリスクは利用できます

今回勉強した*(アスタリスク)や?はマクロではなく手作業でも使う事が出来ます

フィルタを使って文字列を検索する際にも有効です。

E列に画像のような文字列を用意しました。

こんな並びの文字を書く事はあまり無いのですが練習用という事で大目に見てください。

*(アスタリスク)を使った絞り込みです。C(もしくはc)を含んだ文字列が選択されています。

周りに教えてあげてください

マクロを使えない人に教えてあげると大変喜ばれます。

VBAを使えない方から質問を受けた際にはこのような機能があると教えてあげると助かるはずです。

実際マクロを書けなかった時の私は教えてもらった時に驚いたのと同時にすごく嬉しかったです。

理由は単純です。検索でかなり手数を減らすことが出来るからです。

VBAにはワークシート関数の様に手作業でも使える機能がたくさんあります。

より多くの人に「手作業でもマクロでも使える機能」を知ってもらう事が必要です。

出来ればVBAに興味をもってもらえて勉強したいなと考える人が増えるかもしれません。

まとめ

演算子の中から比較演算子に属するLike演算子を紹介しました。ワイルドカードの使い方も分かりました。

これでセルにある一定のキーワードを拾って・・・というコードを書けます。

本日勉強したこと
  1. 演算子とは何かが分かった
  2. Like演算子で文字列の一致を調べる事ができる
  3. *や?は検索に幅を持たせる事ができる
Like演算子を使いこなそう

Enjoy Excel

条件分岐と一緒に使う際条件に論理演算子を使うとさらに深みのある検索をかける事ができます。

条件○○と条件△△に合致した際は・・・のような条件分岐をつくってみましょう。

さらに情報をカテゴライズする事が出来ます。是非トライしてみてください。

文字列関連の関連記事を用意しました。

合わせて記事を見ていただくと文字列の扱いについて出来る事が増えて世界が広がります。

EnjoyExcel

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