いきなり答える備忘録

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

(Gスプレッドシート)VLOOKUP関数で複数条件の検索を行う

 GoogleスプレッドシートのVLOOKUP関数で、複数の条件を課して検索する方法についてです。
 ただしここでの「複数の条件」とは、複数列にわたる条件のことです。1つの列に2つ以上の検索値を設定して検索する、というものではありません。

  • 検索対象となる2つの列を合成した列を表に追加するのが最も簡単な方法です。簡単ですが、元の表に手を加える必要があるのがデメリットです。
  • VLOOKUP関数の内部(第2引数)で2つの列を合成した列を生成する方法もあります。若干式が複雑になるものの、元の表を変更しなくてよいのがメリットです。
  • そもそもVLOOKUP関数の代わりに、複数条件での検索が容易なFILTER関数を使用するのも有力です。

手順

検索対象となる2つの列を合成した列を表に追加する方法

f:id:accs2014:20200803224028p:plain:right:w600

 画像のB列からD列には、建物の名前と部屋番号、そして部屋の入居者の氏名が記録されています。
 建物には複数の部屋があり、それぞれ1から3の部屋番号が割り振られています。つまり建物名だけでも部屋番号だけでも入居者を特定できず、両方が揃ってやっと入居者を特定できるようになっています。

 一方でF列からH列は検索欄になっています。F3セルには建物名が、G3セルには部屋番号が入力されています。これをもとにVLOOKUP関数を使って入居者の氏名を抽出するにはどうしたらよいでしょうか?
 

 簡単なのは元の表に手を加え、「建物名+部屋番号」という列を設ける方法です。
 画像では表をA列まで拡張し、A3セルに「=B3&C3」と入力したところです。

f:id:accs2014:20200803224032p:plain:w750
 

 式を下方にフィルコピーして、表の改造は完成です。

f:id:accs2014:20200803224036p:plain:w750
 

 あとはH3セルに「=VLOOKUP(F3&G3,A3:D8,4,FALSE)」と記せば氏名を抽出できます。

f:id:accs2014:20200803224040p:plain:w750

 わかりやすい方法ではあるものの元の表に手を加える必要があり、あまり筋の良いやり方とは言えません。
 また細かい話ですが、この方法(と次の方法)の場合、建物名「11」の部屋番号が「1」の部屋と、建物名が「1」で部屋番号が「11」の部屋を区別できません(つなげるとどちらも「111」になるため)。レアケースなのでここではそこまで気にしませんが、厳密な比較が必要な場合はさらに工夫が求められます。

VLOOKUP関数の第2引数(表の範囲)で2つの列を合成した列を生成する方法

 設定は上記の例と同じですので、結果のみ示します。
 この方法では「建物名+部屋番号」という列の生成をVLOOKUP関数の内部で行うことにより、元の表に手を加えることなくH3セルへの式の入力だけで解決しています

f:id:accs2014:20200803224044p:plain:w750

 H3セルの式は次のとおりです。

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

 ちょっと複雑ですがVLOOKUP関数の第2引数(表の範囲)を「{B3:B8&C3:C8,D3:D8}」としています。これにより「建物名+部屋番号」という列と「入居者」の列の2列だけの表が生成されます。あとは普通に第1引数(検索値)を「F3&G3」とし、第3引数(抽出列の番号)を2として入居者の氏名を抽出しています。
 ARRAYFORMULA関数が必要になるため式が長く、やや複雑になるのが難点ですが、元の表を変更しなくてよいのは大きなアドバンテージです。

FILTER関数を使用する方法

 これも結果のみ示します。
 そもそも表からの値の抽出にはFILTER関数という強力な関数がありますので、これに移行するのも有力な方法です。
 画像ではH3セルにFILTER関数のみを使ったわずかな式を入力するだけで氏名を抽出できています。

f:id:accs2014:20200803224049p:plain:w750

 H3セルの内容は次のとおりです。

=FILTER(D3:D8,B3:B8=F3,C3:C8=G3)

 FILTER関数の第1引数として抽出する列「D3:D8」を指定し、第2引数として建物名の条件「B3:B8=F3」を、第3引数として部屋番号の条件「C3:C8=G3」を指定しています。これだけで氏名が抽出できます。
 なお、この方法ではVLOOKUP関数による抽出と異なり、マッチする行が複数ある場合は複数の結果(入居者)を抽出します。用途によってはそちらの方がよいですが、最初の1人だけを抽出したい場合は次のようにするのが一つの方法です。

=INDEX(FILTER(D3:D8,B3:B8=F3,C3:C8=G3),1)