いきなり答える備忘録

Google Workspace・Microsoft 365・LibreOfficeなどに関するメモ

(Excel)VLOOKUP関数で複数該当をすべて抽出する方法

 VLOOKUP関数で検索値が複数のデータ(行)に該当するとき、その2番目以降を含めてすべてを抽出する方法についてです。
 基本的にはFILTER関数で実行すべき内容ですが、ここではそうした新しい関数を使わずVLOOKUP関数と基礎的な関数のみで実行します。

VLOOKUP関数で複数該当のすべてを抽出する方法

 次の画像ではVLOOKUP関数を使い、左側のデータ中の産地「岡山県」に対応する品目名を抽出しています。
 データ中に「岡山県」は3つあるものの、VLOOKUP関数では最初に該当する行(この場合「岡山県 もも」の行)からしか値を抽出できないので、2つ目以降(ぶどう、メロン)を抽出することができません。

 


 そこでまずA列に作業列を設けます。これはVLOOKUP関数の検索対象となる列なので右側のD列などではダメで、左側のA列にする必要があります。
 そしてA3セルに次の数式を入力します。

 A3セル

=B3&COUNTIF(B$3:B3,B3)

 「COUNTIF(B$3:B3,B3)」の部分がポイントです。これは、その関数が入っている行の産地(県名)が、何回目に出現しているかをカウントするためのものです。
 これはA3セルでは当然「1」になりますが……



 さらに数式をA9セルまでフィルコピー(A3セルの右下の四角形をダブルクリックまたはA9までドラッグ)することで作業列が完成します。
 上記の数式のCOUNTIF部分の効果で「岡山県」が再度出現するごとに「岡山県2」「岡山県3」と値が変化しているのがわかります。もちろん他の県についても同様になります。
 これで同じ産地が複数あっても、数値の部分により何回目の出現かを区別することができます。

 


 続いてF3セルに次のように入力します。

 F3セル

=VLOOKUP("岡山県"&ROW(F1),A$3:C$9,3,FALSE)

 検索値を「"岡山県"&ROW(F1)」としているのがポイントです。「ROW(F1)」は「F1セルの行番号」という意味なのでつまり「1」です。よって「岡山県1」を検索値として検索することとなり、結果的に「もも」が抽出されます。
 最初の画像と異なりA列からC列までの表がVLOOKUP関数の対象となるので、第2引数(表)及び第3引数(列番号)が変わっている点にも注意してください。



 この数式をA9セルまでフィルコピーすれば3つの値がすべて抽出されます。

 数式をフィルコピーしたことにより上記の式中の検索値「"岡山県"&ROW(F1)」がF4セルでは「"岡山県"&ROW(F2)」となります。つまり左側の表から「岡山県2」を検索するので「ぶどう」が抽出されます。同様にF5セルでは「"岡山県"&ROW(F3)」となり、つまり「岡山県3」を検索するので「メロン」が抽出されます。



 「#N/A」のエラーを表示させない場合は数式を次のようにします。

 F3セル(F9セルまでフィルコピー)

=IFNA(VLOOKUP("岡山県"&ROW(F1),A$3:C$9,3,FALSE),"")

 IFNA関数でエラーを「""」に置き換えています。



 また、上記の式では表の外であるF1セルを参照していることがちょっとした注意点です。このF1セルが参照されているのに気づかずF1セルや1行目を削除する操作を行ってしまうと「#REF!」エラーが発生します。
 これを防ぎたい場合は数式を次のようにします。

 F3セル(F9セルまでフィルコピー)

=IFNA(VLOOKUP("岡山県"&ROWS(F$3:F3),A$3:C$9,3,FALSE),"")

 「ROWS(F$3:F3)」は「F$3:F3の範囲の行数」という意味なので「1」となります。フィルコピーするとF4セルでは「ROWS(F$3:F4)」となるので「2」を、F5セルでは「ROWS(F$3:F5)」となり「3」を返すので上記の式と同じ結果が得られます。
 ちょっと長くなりますが参照先が表の内部で完結しているのがポイントで、本来抽出に無関係なセル(F1)を削除してしまうことによる意図しないエラーの発生を防ぐことができます。