(Excel)FILTER関数で「~を含む・含まない」を条件にする方法

 ExcelのFILTER関数で、ある文字(文字列)を含む・含まないという条件を設定する方法についてです。
 「文字列中に~を含む(含まない)」というケースでは前方一致(~で始まる)や後方一致(~で終わる)の例も紹介します。

「文字列中に~を含む(含まない)」の例

REGEXTEST関数を使う方法

 REGEXTEST関数はMicrosoft 365バージョンでのみ使える関数です(2025年1月現在)ので、他のバージョンの場合は次以降の方法を試してください。


 次の画像では、B3:D8の範囲のうち、B列の文字列中に「島」の字を含む行を抽出しています。

 F3セル

=FILTER(B3:D8,REGEXTEST(B3:B8,"島"))

 条件式「REGEXTEST(B3:B8,"島")」により、B3:B8のそれぞれの値が「島」を含むかどうかを一括判定した結果(TRUE/FALSE)を得ることができ、TRUE(含む)に対応する行が抽出されます。
 これまでの関数では、複数のセルが特定の文字(列)を含むかどうかを一括して判定するのが困難でしたが、REGEXTEST関数で簡単に実現できるようになりました。まるでFILTER関数のために作られたかのような便利さですのでぜひ試していただきたいと思います。



 次の画像では、B列の文字が「島」で始まる行を抽出しています。

 F3セル

=FILTER(B3:D8,REGEXTEST(B3:B8,"^島"))

 「^」という記号は正規表現(ワイルドカードの拡大版のようなもの)で「文字列の先頭」を表します。
 よって「^島」は「文字列の先頭の『島』」という意味になります。これにより「島」で始まるセルがTRUEと判定され、それに対応する行が抽出されます。



 次の画像では、B列の文字が「県」で終わる行を抽出しています。

 F3セル

=FILTER(B3:D8,REGEXTEST(B3:B8,"県$"))

 「$」という記号は正規表現で「文字列の末尾」を表します。
 よって「県$」は「文字列の末尾の『県』」という意味になります。これにより「県」で終わるセルがTRUEと判定され、それに対応する行が抽出されます。



 次の画像では、B列の文字列中に「島」の字を含まない行を抽出しています。

 F3セル

=FILTER(B3:D8,NOT(REGEXTEST(B3:B8,"島")))

 REGEXTEST関数の外にNOT関数を加えることでTRUE/FALSEの判定結果を反転させ、結果的に「含まない」に対応する行を抽出しています。2つ上と1つ上の画像の例についても同じようにすれば「~以外で始まる」「~以外で終わる」という条件になります。
 また、NOT関数の代わりに「REGEXTEST(~)=FALSE」としても同じ結果になります。

FIND関数等を使う方法

 次の画像では、B3:D8の範囲のうち、B列の文字列中に「島」の字を含む行を抽出しています。

 F3セル

=FILTER(B3:D8,ISNUMBER(FIND("島",B3:B8)))

 「FIND("島",B3:B8)」により、B列の各セルの文字列の何文字目に「島」があるかを一括して検索しています。「島」が含まれれば1以上の数値となりますし含まれない場合はエラーとなります。
 さらにISNUMBER関数を使うことで「島」を含むセルをTRUE、含まれないセルをFALSEに変換し、結果的にTRUE(含む)に対応する行が抽出されます。



 次の画像では、B列の文字が「島」で始まる行を抽出しています。

 F3セル

=FILTER(B3:D8,LEFT(B3:B8)="島")

 条件式「LEFT(B3:B8)="島"」により、B列の各セルの文字列の1文字目が「島」かどうかが判定され、TRUE(1文字目が「島」)に対応する行が抽出されます。
 ここではLEFT関数の第2引数を省略しているので最初の1文字だけ抽出・判定されますが、2文字以上で判定する場合は「LEFT(B3:B8,2)="島根"」のようにします。



 次の画像では、B列の文字が「県」で終わる行を抽出しています。

 F3セル

=FILTER(B3:D8,RIGHT(B3:B8)="県")

 条件式「RIGHT(B3:B8)="県"」により、B列の各セルの文字列の最後の1文字が「県」かどうかが判定され、TRUE(最後が「県」)に対応する行が抽出されます。
 RIGHT関数の第2引数を省略しているので最後の1文字だけ抽出・判定されますが、2文字以上で判定する場合は「LEFT(B3:B8,2)="島県"」のようにします。



 次の画像では、B列の文字列が「島」の字を含まない行を抽出しています。

 F3セル

=FILTER(B3:D8,ISERROR(FIND("島",B3:B8)))

 3つ上の画像の例と同じく「FIND("島",B3:B8)」により、B列の各セルの文字列の何文字目に「島」があるかを一括して検索しています。「島」が含まれれば1以上の数値となりますし含まれない場合はエラーとなります。
 さらにISERROR関数を使うことで「島」を含まないセルをTRUE、含むセルをFALSEに変換し、結果的にTRUE(含まない)に対応する行が抽出されます。
 なお、2つ上の画像や1つ上の画像のケースについては、それぞれ「=」を「<>」に代えれば「~以外で始まる」、「~以外で終わる」という条件になります。

COUNTIFS関数を使う方法

 次の画像では、B3:D8の範囲のうち、B列の文字列中に「島」の字を含む行を抽出しています。

 F3セル

=FILTER(B3:D8,COUNTIFS(B3:B8,B3:B8,B3:B8,"*島*"))

 COUNTIFS関数を使い「COUNTIFS(B3:B8,B3,B3:B8,"*島*"」から「COUNTIFS(B3:B8,B8,B3:B8,"*島*"」までを一括して実行した結果を得ています。これによりB列中の「島」を含むセルは1(正確には1以上)に、含まないセルは0に変換されます。結果的に1以上の値(含む)に対応する行が抽出されます。
 単に「COUNTIF(B3:B8,"*島*")」だと「3」という数値が1つ返ってくるだけで、各セルについて別個に判定(カウント)した結果が得られずエラーになります。そこで一見無駄な「B3:B8,B3:B8」という範囲・条件を加えることで個々のセルを別個にカウントしているところがポイントです。意味が分かりにくいのが難点ですがワイルドカードを使えるのはメリットです。 
 なお参考までにCOUNTIFS関数の部分だけ実行した結果を次に示します。

 


 次の画像では、B列の文字が「島」で始まる行を抽出しています。

 F3セル

=FILTER(B3:D8,COUNTIFS(B3:B8,B3:B8,B3:B8,"島*"))

 COUNTIFS関数の第4引数(条件)を「島*」、つまり「『島』で始まる」としています。



 次の画像では、B列の文字が「県」で終わる行を抽出しています。

 F3セル

=FILTER(B3:D8,COUNTIFS(B3:B8,B3:B8,B3:B8,"*県"))

 COUNTIFS関数の第4引数(条件)を「*県」、つまり「『県』で終わる」としています。



 次の画像では、B列の文字列が「島」の字を含まない行を抽出しています。

 F3セル

=FILTER(B3:D8,COUNTIFS(B3:B8,B3:B8,B3:B8,"*島*")=0)

 基本的に3つ上の画像の例と同様で、条件に「=0」を加えただけの違いです。
 2つ上、1つ上の画像の例についても同様に「=0」を加えれば「~以外で始まる」「~以外で終わる」となります。

「複数列(セル)のいずれかに~を含む(含まない)」の例

+演算子を使う方法

 次の画像では、C列とD列のいずれかが「ラーメン」である行を抽出しています。

 F3セル

=FILTER(B3:D7,(C3:C7="ラーメン")+(D3:D7="ラーメン"))

 条件式に「+」演算子を使い、OR条件(または)を設定しています。
 この条件式は両方の条件を満たすに1+1=2となり、一方の条件を満たす場合には1+0=1あるいは0+1=1となり、両方の結果を満たさない場合には0+0=0となります。その足し算の結果が0以外となった行が抽出されます。比較的わかりやすいですが、対象となる列が増えると式が長くなるのが欠点です。
 なお、このようなOR条件の例については次の記事でいくつか紹介しています。

(Excel)FILTER関数で複数条件(AND,OR)を指定する方法 - いきなり答える備忘録



 次の画像ではC列とD列のいずれも「ラーメン」ではない行を抽出しています。

 F3セル

=FILTER(B3:D7,(C3:C7="ラーメン")+(D3:D7="ラーメン")=0)

 考え方は上記例と同じで、条件式に「=0」を加えています。

BYROW/COUNTIF関数を使う方法

 次の画像では、C列とD列のいずれかが「ラーメン」である行を抽出しています。

 F3セル

=FILTER(B3:D7,BYROW(C3:D7,LAMBDA(x,COUNTIF(x,"ラーメン"))))

 条件式にBYROW/COUNTIF関数を使うことで、C3:D7の範囲(これをxと名付けています)の各行ごとに「ラーメン」の数をカウントした結果を得ています。そしてその結果が0でない行が抽出されます。
 式が難しいのが難点ですが、対象となる列が増えても指定する範囲を変えるだけで済むのがメリットです。



 次の画像ではC列とD列のいずれも「ラーメン」ではない行を抽出しています。

 F3セル

=FILTER(B3:D7,BYROW(C3:D7,LAMBDA(x,COUNTIF(x,"ラーメン")))=0)

 これも上記例と同様で、条件式に「=0」が加わっているだけの違いです。