いきなり答える備忘録

G Suite・Microsoft 365・LibreOfficeなどに関するメモと日々の実験

(Excel)部分一致検索の逆引きをする

 Excelで、部分一致検索の逆の検索(検索値が検索範囲の文字列を含んでいるケースを検索)をして表引きする方法についてです。「VLOOKUP関数で検索範囲の側にワイルドカードを付けて検索する方法」といった方がわかりやすいかもしれません。ただしVLOOKUP関数で解決するのは面倒なので、別の方法を示します。

  • FILTER関数とFIND関数を組み合わせて、部分一致検索の逆の検索(表引き)をすることができます。

手順

 次のような注文票と価格表があります(B,C列は値を直接入力しています。また、E列には「=C3*D3」といった掛け算の式が入力されています)。
 注文票の商品名から価格表の商品名を検索して、その価格をD列に転記したいのですが、注文票の商品名の方が(価格表の商品名を含んでいる)長い表記になっているため、VLOOKUP関数によるワイルドカード検索を行ってもうまくいきません。

f:id:accs2014:20201011230444p:plain:w700

 
  そこでD3セルに次のように入力します。

f:id:accs2014:20201011230450p:plain:w700

 D3セル

=FILTER(H3:H6,IFERROR(FIND(G3:G6,B3),0))

 FILTER関数を使い、価格表の商品名(4種)が注文票の表品名に含まれるかをそれぞれ判定し、含まれるものに対応する価格を返します。
 判定条件にFIND関数を使っていて、価格表の商品名が注文票の表品名に含まれる場合は1以上の数値(FILTER関数の判定条件としてみた場合、TRUEとみなされます)が返り、含まれない場合はエラーが返るのでIFERROR関数で0(FALSEとみなされます)に置き換えています。マッチする(含まれる)ケースは通常1つだけですので「IFERROR(FIND(G3:G6,B3),0)」の部分は1以上の数値を1つと0を3つ返します。結果的に1以上の数値(TRUE)に対応する価格が返るというわけです。
 

 確定すると「女峰」の価格である「680」が表示されました。

f:id:accs2014:20201011230455p:plain:w700

 
 下方のセルへのコピーについてですが、FIND関数の第2引数を配列に(B3:B8)してもうまくいかないので絶対参照を用います。画像ではD3セルの式を次のようにして下方にコピーしています。

f:id:accs2014:20201011230500p:plain:w700

 D3セル

=FILTER(H$3:H$6,IFERROR(FIND(G$3:G$6,B3),0))

 ちなみにマッチするものが複数ある場合に最初のものだけ返すようにしたい場合は、この式は次のようになります(ただし、この例ではそもそも複数にマッチすることを防ぐべきですが)。

=INDEX(FILTER(H$3:H$6,IFERROR(FIND(G$3:G$6,B3),0)),1)