いきなり答える備忘録

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

(Gスプレッドシート)VLOOKUP関数で複数条件(AND,OR)の検索をする方法

 GoogleスプレッドシートのVLOOKUP関数で、AND条件(かつ)やOR条件(または)による検索をする方法についてです。
 ただし今ではGoogleスプレッドシートでもXLOOKUP関数が使えるので実用性は薄く、実験的な内容です。

AND条件(かつ)の場合

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

 


 1つ目は方法は作業列を作るやり方です。表を直接変更する必要はありますが式は簡単に済みます。
 まず、表の左側に1列の作業列を作ります。ここではA列を作業列とし、A3セルに「=B3&C3」と入力します。これで検索対象の2つの列の値を1つにまとめた文字列が表示されます。

 


 その式をA8セルまでフィルコピーします。

 


 これで「作業列に表示されている1つの文字列を検索すればよい」という状態になりましたので、H3セルに次のように入力します。

 H3セル

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

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



 次の画像ではF3:G5の範囲に3組の検索値が入力されています。
 そこで第1引数の範囲を拡大して、1つの式で3つの検索結果を取得しています。

 H3セル

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

 第1引数を「F3:F5&G3:G5」と拡張しています。ただしそれだけではダメで、さらにARRAYFORMULA関数で囲んでいます。



 次は2つ目の方法で、関数内で作業列を生成してしまう方法です。表を直接変更する必要はありませんが式はちょっと複雑になります。
 具体的にはH3セルに次のように入力します。

 H3セル

=VLOOKUP(F3&G3,ARRAYFORMULA({B3:B8&C3:C8,D3:D8}),2,FALSE)

 VLOOKUP関数の第2引数(範囲)を「ARRAYFORMULA({B3:B8&C3:C8,D3:D8})」としています。これにより「上記の例における作業列の内容」と「D3:D8の内容」を左右に並べた2列の配列が生成されます。これはもちろん目に見えませんが、検索と抽出の対象とすることで作業列を作った時と同様に値が取得できます。第3引数が「2」となることに注意してください。



 同様に3組の検索値から値を一括取得するケースです。

 H3セル

=ARRAYFORMULA(VLOOKUP(F3:F5&G3:G5,{B3:B8&C3:C8,D3:D8},2,FALSE))

 検索値の範囲を「F3:F5&G3:G5」と拡張してARRAYFORMULAで囲んでいます。
 ちなみにARRAYFORMULAの位置で迷ったらこのように全体を囲むようにすれば問題ありません(1つ上の画像の例や、以下の例でも同様)ので好みで選んでください。



 続いて3つ目の方法です。これも関数内で作業列を生成する方法で、表を直接変更する必要がないものの考え方がちょっと異なります。
 具体的には次のような式になります。

 H3セル

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

 これまた複雑ですが、VLOOKUP関数の第2引数(範囲)を「ARRAYFORMULA({(B3:B8=F3)*(C3:C8=G3)>0,D3:D8})」としています。
 これにより「左側の表のうち両方の条件を満たす行をTRUEに、そうでない行をFALSEに変換した配列」と「D3:D8の内容」を左右に並べた2列の配列が生成されます。ここからVLOOKUP関数でTRUEを検索すれば求める値が取得できるというわけです。ここでも第3引数が「2」となるので注意してください。
 式は上記例よりさらに複雑な感じですが、1つの列に複数の条件を設定できるなどのメリットがあります。



 ただし、このやり方では検索値を拡張して結果を一括取得するのが難しいのが難点です。
 そこで次の画像では絶対参照を使った式にして式をH5セルまでフィルコピーしています。
 なお、以下で紹介するOR条件の例はこの3つ目の方法に準じたものになるので(1,2番目の方法では困難)、同様に絶対参照+コピーを用いるやり方が必要になります。

 H3セル(下方にコピー)

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

OR条件(または)の場合

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

 H3セル

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

 VLOOKUP関数の第2引数を「ARRAYFORMULA({(B3:B8=F3)+(C3:C8=G3)>0,D3:D8})」としています。これは上記のAND検索の例の3つ目の方法とは「*」が「+」に変わっただけでほぼ同じ式です。
 これにより「左側の表のうちいずれか条件を満たす行をTRUEに、そうでない行をFALSEに変換した配列」と「D3:D8の内容」を左右に並べた2列の配列が生成されます。ここからVLOOKUP関数でTRUEを検索すれば求める値が取得できます。
 いずれかの条件を満たしている行は4つ(内田,五十嵐,加納,松岡の行)ありますが、そのうち最も上の内田を取得していることがわかります。

1つの列で複数の検索値を検索する

 次の画像では、1つの列(B列)から2つの検索値「こんにゃく」「砂糖」を検索し、上にある方の価格を取得しています。
 1つ上の例よりも実践的な内容かと思います。

 H3セル

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

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

1つの検索値で複数の列を検索する

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

 H3セル

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

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