いきなり答える備忘録

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

(Excel)VLOOKUP関数で複数条件(AND,OR)を指定する方法

 ExcelのVLOOKUP関数で、AND条件(かつ)やOR条件(または)による検索・抽出をする方法についてです。
 ただしXLOOKUP関数やINDEX/MATCH関数でより簡単に同じことができるため実用性は薄いです。

AND条件(かつ)の場合

 まずは抽出の内容についてです。
 次の画像内の左側に表がありますが、B列の建物名だけでも、C列の部屋番号だけでも入居者を特定できません。しかし両方の値が揃えば特定できるようになっています。
 また、右側のF列からH列は検索欄で、F3セルには建物名が、G3セルには部屋番号が入力されています。ここでH3セルにVLOOKUP関数を使った式を入力して、建物名と部屋番号から特定される入居者の名前を表示させるものとします。
 以下では2つのやり方を紹介します。

 

 1つ目の方法は作業列を設ける方法です。
 表の左側に1列の作業列を用意します。ここではA列を作業列とし、A3セルに「=B3&C3」と入力します。

 


 そしてその式をA8セルまでフィルコピーします。
 こうすることで、検索対象の2つの列の値を1つにまとめた文字列が得られます。

 


 あとはこの値を検索対象にしてしまえばいいだけなので、H3セルに次のように入力します。

 H3セル

=VLOOKUP(F3&G3,A3:D8,4,FALSE)

 第1引数(検索値)を「F3&G3」とすることで、2つの値をつないだ文字列を検索しています。第2引数と第3引数を「A3:D8」「4」とすることでA列を対象として検索し、対応するD列の値を返します。



 次の画像ではF3:G5の範囲に3組の検索値が入力されています。
 そこで第1引数の範囲を拡大することにより1つの式で3つの検索結果を一括して取得しています(スピル)。

 H3セル

=VLOOKUP(F3:F5&G3:G5,A3:D8,4,FALSE)

 


 続いて2番目の方法です。
 作業列を使わず、直接H3セルに次のように入力します。

 H3セル

=VLOOKUP(TRUE,HSTACK((B3:B8=F3)*(C3:C8=G3)>0,D3:D8),2,FALSE)

 ちょっと複雑な式ですが「(B3:B8=F3)*(C3:C8=G3)>0」の部分により、左側の表のうち両方の条件を満たす行をTRUE、そうでない行をFALSEに変換した配列を生成しています。そしてHSTACK関数によりこの配列とD列とつないだ2列の表を生成しています。
 あとはVLOOKUP関数によりこの表からTRUEを検索し、対応する2列目の値(D列の値)を返すという仕組みです。
 ただ残念ながらHSTACK関数が使えるバージョンが限られますし、これが使えるならXLOOKUP関数も使えるはずなので実用的にはあまり意味がありません。



 なお、作業列を使う例と異なり、検索値を拡張して値を一括取得するということができません。
 そこで次の画像では絶対参照を使った式を用いてG5セルまでフィルコピーしています。これは以下のOR条件の例でも必要になります。

 H3セル(下方にコピー)

=VLOOKUP(TRUE,HSTACK((B$3:B$8=F3)*(C$3:C$8=G3)>0,D$3:D$8),2,FALSE)

OR条件(または)の場合

 条件のうちいずれかを満たすものを抽出するという例です。
 上記と同じ表を使い、2つの条件のどちらかを満たす行(のうち最も上にあるもの)にある入居者名を取得します。
 作業列を使う方法も考えられなくはないですが、ここでは関数のみを使う方法で解決しています。

 H3セル

=VLOOKUP(TRUE,HSTACK((B3:B8=F3)+(C3:C8=G3)>0,D3:D8),2,FALSE)

 「(B3:B8=F3)+(C3:C8=G3)>0」の部分により、左側の表のうちいずれかの条件を満たす行をTRUE、そうでない行をFALSEに変換した配列を生成しています。そしてHSTACK関数によりこの配列とD列とつないだ2列の表を生成しています。
 最後にVLOOKUP関数によりこの表からTRUEを検索し、対応する2列目の値(D列の値)を返しています。

1つの列に複数の検索値を設定する

 次の画像では、1つの列(B列)から2つの検索値「いちご」「りんご」を検索し、いずれか上にある方の価格を取得しています。

 G3セル

=VLOOKUP(TRUE,HSTACK((B3:B9=E3)+(B3:B9=F3)>0,C3:C9),2,FALSE)

 考え方としては上の例と全く同様で、1つの列(B列)に2つの条件を課している点だけが異なります。

検索範囲を複数列にする

 複数の列を検索し、いずれかの列に該当する値があったらその行の値を取得するというケースです。実用的にもっともありそうなパターンと思われます。
 次の画像ではF3セルに入力されている1つの担当者の値を2つの列(B,C列)から検索して、対応する担当地区を取得しています。

 G3セル

=VLOOKUP(TRUE,HSTACK((B3:B6=F3)+(C3:C6=F3)>0,D3:D6),2,FALSE)

 これも考え方は上記の例と同様で、2つの列(B列)に同一の条件を課している点だけが異なります。

備考

 各種の例を紹介しましたがいずれも実験的なもので、実用的にはXLOOKUP関数かINDEX/MATCH関数を使う方が簡単ですし、最新のHSTACK関数がなくても利用できます。
 次の記事でXLOOKUP関数やINDEX/MATCH関数を使って上記と同じ内容の検索を行う例を紹介しています。

www.officeisyours.com

www.officeisyours.com