商品名の一部から価格を引く(VLOOKUP ワイルドカード)
問題
問題文
POS の出力は商品名が長く、Arabica Coffee Beans 1kg のようになっています。検索ボックスに入るのはキーワードだけです。キーワードは D2、価格表は A2:B5 にあります。Price のセル F2 に数式を入れて、Coffee と入力しても名前の一部に一致する最初の商品が見つかるようにしてください。
部分一致にはキーワードの前後にワイルドカードが必要で、しかも完全一致で検索します。近似一致(TRUE)にするとアスタリスクは無視され、別の行を拾います。
問題のデータ
表でデータ全体を見る(選択・コピーできます)
| A | B | D | F | |
|---|---|---|---|---|
| 1 | Product | Price | Keyword | Price |
| 2 | Arabica Coffee Beans 1kg | 18 | Coffee | |
| 3 | Decaf Coffee 500g | 15 | ||
| 4 | Green Tea 250g | 12 | ||
| 5 | Cold Brew Coffee 1L | 21 |
ポイント解説
パターンは入力するのではなく組み立てます。"*" & D2 & "*" で Coffee が *Coffee* になり、名前のどこに含まれていても一致します。ワイルドカードが効くのは完全一致(FALSE)のときだけです。複数行が一致する場合、返るのは上から最初の1行です。
解き方のヒント
回答は F2 に入力します。送信時は 3 通りの入力で数式を再実行するので、数値を直接書くと必ず失敗します。数式はセルを参照してください。
- 回答セルは F2 です
- キーワードは D2、名前は A2:A5、価格は B2:B5 にあります
- キーワードの前後にアスタリスクを付けると、名前の途中でも一致します
- 形は =VLOOKUP(?, ?, ?, FALSE) です。パターンが最初の引数です
模範解答
模範解答を表示(2 通り・まずは自分で試してみましょう)
解法1:ワイルドカードのパターンで VLOOKUP
=VLOOKUP("*"&$D$2&"*",$A$2:$B$5,2,FALSE)
アスタリスクは「前後には何が入っていてもよい」という意味なので、*Coffee* は Arabica Coffee Beans、Decaf Coffee、Cold Brew Coffee に一致します。VLOOKUP は上から最初の一致を返し、2列目を読みます。
解法2:同じパターンで INDEX + MATCH
=INDEX($B$2:$B$5,MATCH("*"&$D$2&"*",$A$2:$A$5,0))
MATCH もワイルドカードを扱え、列番号に縛られず位置を返します。取り出したい値が名前の列より左にあるときに便利です。
関数ガイド
よくある質問
VLOOKUP はセルの一部だけに一致させられますか?
ワイルドカードを使えば可能です。パターンを "*"&キーワード&"*" と組み立て、最後の引数は FALSE(完全一致)にします。アスタリスクが任意の文字列を表すので、名前のどこに含まれていても一致します。
なぜ "*Coffee*" と直接書かず & で組み立てるのですか?
キーワードを固定すると、その式は1つの問いにしか答えられません。"*"&D2&"*" なら D2 の内容を読むので、同じ式で今日は Coffee、明日は Tea を検索できます(ケース2)。
複数行が一致したとき、どの行が返りますか?
上から最初の行です。ケース1 では3商品が Coffee を含み、答えは Arabica の行です。一致するすべての行が必要なら VLOOKUP の出番ではなく、FILTER を使います。