- XLOOKUP関数で検索値にワイルドカードを用いる場合、第5引数(一致モード)に「2」を指定する必要があります。もちろん第1引数(検索値)にもワイルドカード(アスタリスクなど)を含める必要があります。
XLOOKUP関数でワイルドカードを使った検索をする方法
次の画像では、B~D列の表ががメニューのリストになっています。
そしてF~H列は検索欄です。F3セルに入力された文字列を含む(部分一致)メニューをB列から検索し、対応する値段とカロリーの値をC,D列から抽出するものとします。
G3セルに次のように入力します。
=XLOOKUP("*"&F3&"*",B3:B7,C3:D7,,2)
第1引数(検索値)の最初と最後にアスタリスク(*)をつなげることで部分一致検索(~を含む)のための文字列を生成しています。また、第5引数(検索モード)で「2」(ワイルドカード文字との一致)を指定しています。VLOOKUP関数の場合は特に引数を設定しなくてもワイルドカードが使えますが、XLOOKUP関数の場合はこれが欠かせません。
結果はこうなります。
XLOOKUP関数はVLOOKUP関数より便利で扱いやすくなった部分が多いですが、この点はちょっと面倒になったかもしれません。
複数条件(ワイルドカードを複数指定)で検索する場合
ワイルドカードを複数指定するというケースです。XLOOKUP単体だとワイルドカードは1つしか指定できないのでちょっと工夫する必要があります。
まずはAND条件(かつ)の例です。
次の画像ではB列の市町村のうち「『山』で始まり、かつ、『市』で終わらない」ものを検索し、その隣のセルの値(人口)を抽出しています。
E3セル
=XLOOKUP(TRUE,COUNTIFS(B3:B8,B3:B8,B3:B8,"山*",B3:B8,"<>*市")>0,C3:C8)
ちょっと長いですが第2引数内の「COUNTIFS(B3:B8,B3:B8,B3:B8,"山*",B3:B8,"<>*市")」の部分がポイントで、両方のワイルドカードに該当するかどうかを各セルごとにカウントしています。「COUNTIFS(B3:B8,"山*",B3:B8,"<>*市")」だとB3:B8の範囲でいくつ該当するかという1つの数値しか返ってきませんが、「B3:B8,B3:B8」という1つ目の条件(これ自体はすべて真となる)を追加することでスピルが働き、各セルごとのカウントとなります。これを「>0」でTRUE/FALSEに変換して第1引数(検索値)をTRUEにすれば、両方のワイルドカードに該当する値が検索できるというわけです。
なおワイルドカードはCOUNTIFS関数内で使っているので、XLOOKUPの第5引数の指定は必要ありません。
COUNTIFS関数の部分だけ実行すると次の画像のようになります。両方のワイルドカードに該当する行が「1」に、そうでない行が「0」に変換されています。
ワイルドカードに該当する同一の市町村名が複数ある場合は2とか3になりますがさらに「>0」によりTRUEに変換されるので、検索結果には影響しません。
次はOR検索(または)の例です。
B列の市町村のうち「『田』を含むか、または『町』で終わる」ものを検索し、その隣のセルの値(人口)を抽出しています。
E3セル
=XLOOKUP(TRUE,COUNTIFS(B3:B8,B3:B8,B3:B8,"*田*")+COUNTIFS(B3:B8,B3:B8,B3:B8,"*町")>0,C3:C8)
ANDの例よりさらに長くなりますが、2つのCOUNTIFS関数を足し算し、2つのワイルドカードのうちいくつに該当するかどうかを各セルごとにカウントしています。それを「>0」でTRUE/FALSEに変換して第1引数(検索値)をTRUEにすることで、いずれかのワイルドカードに該当する値が検索できるというわけです。
COUNTIFSの部分だけ実行すると次のようになります。両方のワイルドカードに該当する行が「2」に、一方に該当する行が「1」に、いずれにも該当しない行が「0」に変換されています。
同じ市町村名が複数ある場合はさらに4とか6になりますが「>0」によりTRUEに変換されるので、検索結果には影響しません。
備考
数値や日付を対象にする場合
基本的に数値や日付の値を文字列とみなしてワイルドカードで検索することはできません。
ただ、これについては次の記事で対応を紹介しています。