いきなり答える備忘録

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

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

 ExcelのINDEX関数とMATCH関数を使って、AND条件(かつ)やOR条件(または)に該当する値を検索・抽出する方法です。AND条件の一種であるクロス抽出についても紹介します。

  • MATCH関数の第1,2引数(検索値,検索範囲)で複数列の値を&でつないで指定することで、複数の列に対するAND条件にできます。
  • 「*」や「+」の演算子を利用してAND/OR条件を指定できます。
  • INDEX/MATCH関数関数を使ってクロス抽出ができます。

AND条件(かつ)の場合

 次の画像の左側に表がありますが、B列の建物名だけでも、C列の部屋番号だけでも入居者を特定できません。両方の値がわかれば入居者を特定できるようになっています。
 一方で右側の部分は検索欄になっており、F3セルには建物名が、G3セルには部屋番号が入力されています。
 INDEX/MATCH関数による抽出では検索値を1つしか指定できないので難しそうですが、次のような式で抽出をしています。

 H3セル

=INDEX(D3:D8,MATCH(F3&G3,B3:B8&C3:C8,0))

 第1引数(検索値)「F3&G3」とし、建物名と部屋番号の2つの値を連結した値を指定します。第2引数(検索範囲)でも「B3:B8&C3:C8」と、2つの列を連結したものを指定します。これで建物名と部屋番号が両方とも一致する入居者を抽出できます。
 なおMATCH関数の第3引数は0、つまり完全一致検索としています(以下同様)。



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

 H3セル

=INDEX(D3:D8,MATCH(F3:F5&G3:G5,B3:B8&C3:C8,0))

 


 次の画像はAND条件のもう1つのやり方です。
 H3セルに最初の画像とは異なる式を入力して、同じ結果を得ています。

 H3セル

=INDEX(D3:D8,MATCH(TRUE,(B3:B8=F3)*(C3:C8=G3)>0,0))

 MATCH関数の第2引数で「*」演算子を使い、各条件が真(TRUE)なら1、偽(FALSE)なら0とみなす掛け算を行っています。これにより両方の条件が真となる行を「TRUE」、そうでない行を「FALSE」に変換した6つの値からなる配列が生成されます。
 あとはMATCH関数でTRUEが何番目にあるかを取得し、INDEX関数の第2引数(行番号)とすることで対応する位置にある入居者の名前を抽出しています。
 


 ただしこの方法の場合、最初の例のように検索値を拡張することができません(これは下記のOR条件の場合も同様)。
 そこで次の画像では、絶対参照を使った式をフィルコピーすることで3つの検索結果を得ています。

 H3セル(H5セルまでフィルコピー)

=INDEX(D$3:D$8,MATCH(TRUE,(B$3:B$8=F3)*(C$3:C$8=G3)>0,0))

OR条件(または)の場合

 こちらは指定した条件のいずれかを満たすもの(のうち最も上にあるもの)を抽出する例です。
 次の画像の左側の表は上記の例と全く同じものですが、こちらでは指定した建物名と部屋番号のうちどちらかを満たすもの(のうち最も上にあるもの)を抽出しています。

 H3セル

=INDEX(D3:D8,MATCH(TRUE,(B3:B8=F3)+(C3:C8=G3)>0,0))

 AND条件のように「&」でつなぐ、といった方法では解決できません。
 そこで「+」演算子を使い、各条件が真(TRUE)なら1、偽(FALSE)なら0とみなす足し算を行っています。両方の条件が真なら1+1=2、一方だけ真なら1に、どちらも偽なら0となります。これを利用していずれかの条件が真となる行を「TRUE」、そうでない行を「FALSE」に変換した配列を生成しています。
 あとはMATCH関数でTRUEが何番目かを取得し、INDEX関数の第2引数(行番号)とすることで対応する位置にある入居者の名前を抽出しています。
 いずれかの条件に該当する行は4つありますが、MATCH関数の機能により最も上にある値が抽出されています。


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

 次の画像では、1つの列に2つの検索値を設定して検索し、いずれか上にある方の価格を取得しています。

 G3セル

=INDEX(C3:C9,MATCH(TRUE,(B3:B9=E3)+(B3:B9=F3)>0,0))

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

検索範囲を複数列にする

 複数の列を検索し、いずれかの列に該当する値があれば対応する行の値を取得するというケースです。OR条件としては最も実用的な内容と思われます。
 次の画像ではF3セルに入力された担当者名をB列とC列の2つの列から検索し、対応する担当地区を取得しています。

 G3セル

=INDEX(D3:D6,MATCH(TRUE,(B3:B6=F3)+(C3:C6=F3)>0,0))

 これも基本的には上記例と同じで、1つの条件を2つの列に課しているだけの違いです。

 なお、次の記事では列が多数である場合の対応例などについて取り上げていますので参考まで。

www.officeisyours.com

クロス抽出の場合

 表の縦横の見出しから値を抽出する、クロス抽出についてです。
 次の画像の左側の表には縦横の見出しがあり、店舗名と月の組み合わせで売上高を特定できるようになっています。
 そこでJ3セルにINDEX/MATCH関数を使った式を入力し、H3セルの店舗名とI3セルの月に対応する売上高を抽出しています。

 J3セル

=INDEX(C3:F7,MATCH(H3,B3:B7,0),MATCH(I3,C2:F2,0))

 「MATCH(H3,B3:B7,0)」の部分で、H3セルの値が店舗名の見出しの何行目にあるかを取得しています。
 「MATCH(I3,C2:F2,0)」の部分で、I3セルの値が月の見出しの何列目にあるかを取得しています。
 これらをINDEX関数の第2,3引数(行番号,列番号)として指定することで、求める値を抽出しています。

備考

 XLOOKUP関数を使って全く同じ抽出を行っている例を次の記事で紹介しています。
 基本的には式がより簡潔になるXLOOKUP関数の方をおすすめしたいですが、クロス抽出についてはINDEX関数の機能に沿って考えた方がわかりやすそうなので、どちらを使うか好みが分かれるかもしれません。

www.officeisyours.com