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

 ExcelのFILTER関数で複数条件(AND,OR)を指定する方法についてです。AND関数やOR関数を組み合わせたくなりますがそれではうまくいきません。「*」や「+」の演算子を使うのがポイントです。

AND条件(かつ)の場合

文字列を条件にする例

 次の画像ではFILTER関数を使い、左側の表のうち出身地(C列)の値が「東京都」で、かつクラス(D列)の値が「A」である行をすべて抽出しています。
 なお、各条件を満たすセルに着色し、抽出対象となる行のA列に「該当」と表示しています。これはわかりやすくするためで、抽出の手順には関係ありません(以降、複数列に条件を付ける場合は同様にしています)。

 F3セル

=FILTER(B3:D9,(C3:C9="東京都")*(D3:D9="A"))

 条件として指定する文字列をダブルクォーテーション(" ")で囲むことはもちろんですが、各条件をカッコで囲んで「*」でつなぐのがポイントです。
 カッコ内の式が条件を満たす場合は「1」とみなし、そうでない場合に「0」とみなしたうえで各行で掛け算を行っています。両方の条件を満たす場合に掛け算の結果は1*1=1となり、結果が1(正確には0以外)となった行が抽出されます。

数値や日付を条件にする例

 次の画像ではFILTER関数を使い、左側の表のうち身長(C列)の値170以上かつ174以下である行を抽出しています。

 F3セル

=FILTER(B3:D9,(C3:C9>=170)*(C3:C9<=174))

 「~以下」を表す比較演算子「<=」と「~以上」を表す比較演算子「>=」を使っています。「~より小さい」の場合は「<」を使い、「~より大きい」の場合は「>」を使います。対象が数値の場合は文字列の場合と異なり、ダブルクォーテーション(" ")は不要です。
 ここでも各条件をカッコで囲んで「*」でつなぐのがポイントです。



 次の画像では、生年月日(D列)の日付が2009/6/1以降で、かつ2010/5/31以前である行を抽出しています。

 F3セル

=FILTER(B3:D9,
(D3:D9>=DATEVALUE("2009/6/1"))*(D3:D9<=DATEVALUE("2010/5/31"))
)

 改行(Alt+Enter)はなくても問題ありません。
 つい「(D3:D9>=2009/6/1)」のような式で比較したくなりますが、それだと「2009÷6÷1」という数値(=334.833…)との比較になってしまいうまくいきません。
 そこでDATEVALUE関数を使って日付文字列をシリアル値(数値)に換算し、比較しています。カッコが不足しないように注意が必要です。



 ただし式が長く複雑になるので、次の画像では簡略化した式を使って同じ結果を得ています。

 F3セル

=FILTER(B3:D9,(D3:D9>="2009/6/1"*1)*(D3:D9<="2010/5/31"*1))

 「*1」で日付文字列をシリアル値に変換しています。



 次の画像は数値と日付の条件を組み合わせた例です。

 F3セル

=FILTER(B3:D9,(C3:C9>=170)*(D3:D9>=DATEVALUE("2009/6/1")))

 最初の例(文字列を条件にする場合)と同様にそれぞれの列に対する条件をカッコで囲み、「*」でつなぐだけです。
 条件の記し方がそれぞれ異なるだけで、式の基本的な作りに違いはありません。

OR条件(または)の場合

文字列を条件にする例

 次の画像ではFILTER関数を使い、左側の表のうち出身地(C列)の値が「東京都」または「千葉県」である行をすべて抽出しています。

 F3セル

=FILTER(B3:D9,(C3:C9="東京都")+(C3:C9="千葉県"))

 2つの条件式をカッコで囲み「+」でつないでいます。
 カッコ内の式が条件を満たす場合を「1」とみなし、そうでない場合を「0」とみなしたうえで各行で足し算を行っています。両方の条件を満たす場合に足し算の結果は1+1=2となり、一方の条件を満たす場合には1+0=1あるいは0+1=1となり、両方の結果を満たさない場合には0+0=0となります。
 そして足し算の結果が2または1(正確には0以外)となった行が抽出されます。



 次の画像では、出身地(C列)の値が「東京都」またはクラス(D列)の値が「A」である行を抽出しています。

 F3セル

=FILTER(B3:D9,(C3:C9="東京都")+(D3:D9="A"))

 2つの式で異なる列に条件を課しているだけで、基本的な内容は1つ上の例と変わりません。

数値や日付を条件にする例

 次の画像では、左側の表のうち身長(C列)の値が169以下または174以上である行を抽出しています。

 F3セル

=FILTER(B3:D9,(C3:C9<=169)+(C3:C9>=175))

 ここでも2つの条件式をカッコで囲んで「+」でつないでいます。



 次の画像では生年月日(D列)の値が2009/5/31以前または2010/6/1以降である行を抽出しています。

 F3セル

=FILTER(B3:D9,
(D3:D9<=DATEVALUE("2009/5/31"))+(D3:D9>=DATEVALUE("2010/6/1"))
)

 ここでも「<=2009/5/31」などとせずDATEVALUE関数を使うのがポイントです。カッコが足りないと誤った結果となりますので注意してください。
 ただしAND条件の例で示したのと同様に、DATEVALUE関数を「*1」で代用して式を短縮することもできます。



 次の画像では、身長(C列)の値が170以上または生年月日(D列)の値が2009/6/1以降である行を抽出しています。

 F3セル

=FILTER(B3:D9,(C3:C9>=170)+(D3:D9>=DATEVALUE("2009/6/1")))

 異なる列に条件を課しているだけで、基本的にこれまでの例と変わりません。

条件が3つ以上の場合

 3つ以上の条件を指定することも可能です。ここではOR条件の例を紹介します。
 次の画像では、出身地(C列)の値が「千葉県」または「埼玉県」または「東京都」である行を抽出しています。

 F3セル

=FILTER(B3:D9,
(C3:C9="千葉県")+(C3:C9="埼玉県")+(C3:C9="東京都")
)

 非常に単純で、3つの各条件をカッコで囲んで「+」でつないでいるだけです。もちろん条件が4つ以上の場合も同様です。
 AND条件の場合も同じように3つ以上の式をカッコで囲んで「*」でつなげばOKです。

条件をリストで指定する場合

 条件値のリストを用意し、いずれかに当てはまったら抽出するという例(OR条件の一種)です。
 次の画像では、出身地(C列)の値がリスト(F3:F5)のいずれかにあてはまる行を抽出しています。

 H3セル

=FILTER(B3:D9,COUNTIF(F3:F5,C3:C9))

 やっていることは難しそうですが式は非常に簡単です。
 C列のそれぞれの値がリスト(F3:F5)中にいくつあるかをカウントしています。結果が1(正確には0以外)だったらその行は抽出され、0だったら抽出されません。



 次の画像では逆に、出身地(C列)の値がリスト(F3:F5)にない行を抽出しています。

 H3セル

=FILTER(B3:D9,COUNTIF(F3:F5,C3:C9)=0)

 「=0」がポイントです。
 C列のそれぞれの値がリスト(F3:F5)中にいくつあるかをカウントし、結果が0だったらその行は抽出され、0以外だったら抽出されません。

ANDとORの組み合わせの場合

 次の画像では、「『身長(C列)の値170以上かつ174以下』または生年月日(D列)の値が2009/6/1以降」である行を抽出しています。

 F3セル

=FILTER(B3:D9,
(C3:C9>=170)*(C3:C9<=174)+(D3:D9>=DATEVALUE("2009/6/1"))
)

 これまでの例と同様に、条件を満たす場合を「1」とみなし、そうでない場合を「0」とみなす掛け算/足し算が各行で実行されます。そして結果が0以外となった行が抽出されます。
 「*」による掛け算が優先されるので「身長(C列)の値170以上かつ『身長が174以下または生年月日(D列)の値が2009/6/1以降』」とはならないことに注意してください。この優先順位を変更する場合はカッコを使えばOKです。