FILTER関数「○○を含む」


FILTER関数の絞り込みで「○○を含む」という条件を指定してみましょう。その前に、話を簡単にするため「○○で始まる」で絞り込んでみます。なお、A列の元データはテーブル「Data」です。

「○○で始まる」を、たとえば「"田"で始まる」とします。「"田"で始まる」ということは「先頭の1文字が"田"であり、2文字目から後ろは何でもいい」と考えられます。この"何でもいい"ような文字列を指定するとき、よくワイルドカードが使われます。今回でしたら「田*」ですね。それを条件に指定してみましょう。

結果はエラーです。ちなみに、このエラーは「条件に一致するデータが存在しない」というエラーです。FILTER関数の引数[空の場合]を指定しておけば、それが表示されます。

ここで重要なことは「なぜエラーになったのか」の理由です。単純に「ああ、そうか、FILTER関数の条件にワイルドカードは使えないのか」と、現象だけを捉えないようにしてください。そもそもFILTER関数の条件は「条件が正しい=TRUE」または「条件が正しくない=FALSE」の、いずれかを指定しなければなりません。

FILTER関数に指定した条件が「TRUEまたはFALSE」になるかどうかは、その条件を実際に、セルへ入力してみれば分かります。

じゃ、どーしたらいいか?これは、VBAのセミナーでもお教えしているコツですが、こんなときは「(文字列が)"田"で始まる」というのを、別の言い方で表してみます。「(文字列が)"田"で始まる」ということは、要するに「(文字列の)左端1文字が"田"である」と等しいですよね。余談ですが、このように「それって、要するにどういうこと?」みたく、別の表現に言い換える発想が、プログラミングに必須です。また、こうした発想は"抽象化"のトレーニングにもなりますので、日頃から意識するといいです。では、「(文字列の)左端1文字が"田"である」の判定をするには、どうしたらいいでしょう。文字列の左1文字を抜き出すにはLEFT関数が使えます。そのLEFT関数の結果が"田"と等しいかどうかを判定すればいいのですから、次のように考えられます。

したがって、この条件をFILTER関数に指定してやればいいです。

同じ発想で「"田"で終わる」は「右端1文字が"田"である」ですから、次のようになります。

さて、本稿のテーマである「(文字列の中に)"田"を含む」は、どうしたらいいでしょう。言うまでもありませんが「FILTER(Data,Data="*田*")」みたいなワイルドカードは使えません。こんなときは、その文字列の中に"田"が存在するかどうかを調べます。そんなときに使われるのがFIND関数SEARCH関数です。両者は、ワイルドカードが使えるかや、大文字と小文字を区別するかなどの、細かい違いはありますけど、まぁ、実務ではほとんど区別しません。多くの場合は、どちらでも同じ結果を得られるので、私はスペルの短いFIND関数を多用しています。FIND関数は、検索文字(ここでは"田")が存在すると、その文字が左から何文字目にあるかを数値で返します。また、検索文字が見つからなかったときはエラーになります。

FIND関数が返す結果は「数値」または「エラー値」です。しかし、FILTER関数の条件には「TRUE」または「FALSE」を指定しなければなりません。数値だったら「TRUE」、エラーだったら「FALSE」に変換する必要があります。とはいえ、両者を2回判定する必要はありません。FIND関数の結果は「数値」か「エラー値」しかないのですから「数値かどうか」を判定してやればいいです。そんなときに使うのがISNUMBER関数です。ISNUMBER関数は、判定するモノが数値だったら「TRUE」を、数値ではなかったら「FALSE」を返します。


今回は、先日のセミナーで質問された、FILTER関数の条件に「○○を含む」を指定する方法を詳しく解説しました。FILTER関数は、実務でメッチャ使えます。ぜひ活用していただきたいです。しかし、FILTER関数を活用するには「どんな条件を指定するか」が問題になります。そこを解決し柔軟に使うためには、いかに多くの関数を知っているかがポイントになります。たとえば、日付の曜日はTEXT関数で調べられる、というのを知っていれば、次のような処理も可能です。

ぜひ、いろいろな関数を学習してください。思わぬ関数が、意外なケースで役立ちます。