if関数でcountif+ワイルドカードは筋が悪い?

if関数で「*」とか使えませんか?

sumif、countifとかではワイルドカード(*とか?)が使える。
if関数でも使えないか?
という質問がよくあるみたいです。

例えば、

A1セルに入力されている内容が
「渋谷区」を含んでいれば「○」
含んでいなければ「×」と表示させたい。

でも、if関数だと、ワイルドカードが使えない。

これを、どうやったら実現できるか?

というような質問です。

if関数の中で、countif関数使えばできるけど・・・

これに対して、

=if( countif(A1,"*渋谷区*")>=1, "○", "×")

というふうに、
countifとの併用すればいいよ!
という解説をしているホームページは多いです。

もちろん、うまく動作しますし、

ワイルドカードを既に知っている人に対する説明ですから、

相手の知っている知識の組み合わせで
解決できる方法を伝えている、という意味では、

非常にわかりやすく、即効性のある
良い説明だと思います。

でも、
個人的には、こういう解決法は、好きではありません。

日本語に訳したときの意味がわからない

1つめの理由は、
上の計算式を日本語で表現したときの「表現」が、
非常に気持ち悪い、ということ。

条件の部分「countif(A1,"*渋谷区*")>=1」を、
直訳すると、

A1セルの中で「東京都で始まるセル」が1個以上あれば

ということになるわけですが、
日本語として何を言っているか、さっぱりわかりません。

もちろん、
じっくりと考えれば、
意味的には間違いはないのですが、後で見たときの可読性が悪いです。

なぜ、わかりにくいのかといえば、
count系の関数は「数を数える」必要性がない時に使っている
からです。

筋が良い・悪いで言えば、間違えなく「筋は悪い」です。

応用がきかない方法を教えてもらっても発展性がない

2つめの理由は「発展性がない」からです。

しょせん、
countif関数は「count関数の亜種」であり「if関数の簡易版」です。

countif関数では、
元々、難しいことはできないし、応用範囲も狭いのです
。

countif関数を駆使しても、大したことはできません。

ですから、
エクセルを使いこなしたいのであれば、
countif関数を応用する方向性はおすすめしません。

なぜ、if関数でワイルドカードが使えないのか?

if関数でワイルドカードが使えない理由は、
ワイルドカードを使わないでも、普通に考えれば解決できるから
だと思っています。
(完全に私の想像ですので、違っていたらすみません)

その場しのぎであれば、
countif関数を使う「邪道」を進むのもいいですが、

深くエクセルを使いたいのであれば、
「王道」を進むのがいいと思います。

王道を行くと、
多少面倒なのは事実ですが(苦笑)、
応用範囲は広いので、苦労をした分、より多くの成果が得られます。

「ある文字を含む」という条件の書き方

さて、ここから本題です。

if関数で「ある文字を含む」という条件は、
次のように書くことができます。

iferror( find(「探したい文字」,「セル」) ,0 )>=1

先ほどの例にあてはめてみると、次のような感じになります。

if_wildcard_1_1

関数の入れ子がわかりにくい場合には、
無理に入れ子にせず、分解してみましょう。

if_wildcard_1_2

この計算式は何をやっているのか?

先ほどの「入れ子を分解した後」のエクセルシートを使って、
どういう処理をしているのかを説明していきます。

B列のfind関数

B列のfind関数では、次のような値が得られます。

「渋谷区」が含まれている場合その単語が出てくる位置
「渋谷区」が含まれていない場合エラー

ですから、

  • B1セル:4(←「渋谷区」という単語が4文字目に出てくるので)
  • B2セル:#VALUE!(=エラー)

が表示されます。

C列のiferror関数

B列のfind関数で、
目的の単語が含まれていないと「エラー」になります。

ただ、
「エラー」が出ると処理が面倒になるので、

iferror関数を使って、
「エラー」を「0」に置き換えます。

その結果、次のようになります。

「渋谷区」が含まれている場合その単語が出てくる位置
「渋谷区」が含まれていない場合0

C1セル、C2セルには、次のような値が入ります。

  • C1セル:4(←「渋谷区」という単語が4文字目に出てくるので)
  • C2セル:0(←iferror関数でエラーが「0」に置き換えられる)
D列のif関数

ここまでの処理で、
「渋谷区」という単語が含まれていれば、
C列は「1以上」になっているはずです。

ですから、

C列が1以上〇
それ以外(=C列が0)×

と表示させれば、目的達成です。

それを関数化したものがD列のif関数です。

if_wildcard_1_2

これを、
関数の入れ子で1つのセルにまとめると、
次のようになります。

if_wildcard_1_1

「ある文字で始まる」「ある文字で終わる」という条件の書き方

最後に、
if関数で「ある文字で始まる」「ある文字で終わる」という条件を書きたい、
という場合には、

東京都で始まる → left(A1,3)="東京都"
区で終わる → right(A1,1)="区"

というように書けます。

日本語に訳すと、

left(A1,3)="東京都" → A1セルの最初から3文字が「東京都」
right(A1,1)="区" → A1セルの最後から1文字が「区」

という感じになります。

確かに、
ワイルドカードを使うよりも、
関数がいっぱい出てくるし、
(多少)頭を使う必要もあります。

でも、
find関数、left関数、right関数は、
エクセルを使いこなす上では、非常に重要な関数ですから、

こういう関数を使いこなす努力をしたほうが、
長い目で見ると、エクセルを使いこなせるようになると思います。