if関数でcountif+ワイルドカードは筋が悪い?
if関数で「*」とか使えませんか?
sumif、countifとかではワイルドカード(*とか?)が使える。
if関数でも使えないか?
という質問がよくあるみたいです。
例えば、
A1セルに入力されている内容が
「渋谷区」を含んでいれば「○」
含んでいなければ「×」と表示させたい。
でも、if関数だと、ワイルドカードが使えない。
これを、どうやったら実現できるか?
というような質問です。
if関数の中で、countif関数使えばできるけど・・・
これに対して、
というふうに、
countifとの併用すればいいよ!
という解説をしているホームページは多いです。
もちろん、うまく動作しますし、
ワイルドカードを既に知っている人に対する説明ですから、
相手の知っている知識の組み合わせで
解決できる方法を伝えている、という意味では、
非常にわかりやすく、即効性のある
良い説明だと思います。
でも、
個人的には、こういう解決法は、好きではありません。
日本語に訳したときの意味がわからない
1つめの理由は、
上の計算式を日本語で表現したときの「表現」が、
非常に気持ち悪い、ということ。
条件の部分「countif(A1,"*渋谷区*")>=1」を、
直訳すると、
A1セルの中で「東京都で始まるセル」が1個以上あれば
ということになるわけですが、
日本語として何を言っているか、さっぱりわかりません。
もちろん、
じっくりと考えれば、
意味的には間違いはないのですが、後で見たときの可読性が悪いです。
なぜ、わかりにくいのかといえば、
count系の関数は「数を数える」必要性がない時に使っている
からです。
筋が良い・悪いで言えば、間違えなく「筋は悪い」です。
応用がきかない方法を教えてもらっても発展性がない
2つめの理由は「発展性がない」からです。
しょせん、
countif関数は「count関数の亜種」であり「if関数の簡易版」です。
countif関数では、
元々、難しいことはできないし、応用範囲も狭いのです。
countif関数を駆使しても、大したことはできません。
ですから、
エクセルを使いこなしたいのであれば、
countif関数を応用する方向性はおすすめしません。
なぜ、if関数でワイルドカードが使えないのか?
if関数でワイルドカードが使えない理由は、
ワイルドカードを使わないでも、普通に考えれば解決できるから
だと思っています。
(完全に私の想像ですので、違っていたらすみません)
その場しのぎであれば、
countif関数を使う「邪道」を進むのもいいですが、
深くエクセルを使いたいのであれば、
「王道」を進むのがいいと思います。
王道を行くと、
多少面倒なのは事実ですが(苦笑)、
応用範囲は広いので、苦労をした分、より多くの成果が得られます。
「ある文字を含む」という条件の書き方
さて、ここから本題です。
if関数で「ある文字を含む」という条件は、
次のように書くことができます。
先ほどの例にあてはめてみると、次のような感じになります。
関数の入れ子がわかりにくい場合には、
無理に入れ子にせず、分解してみましょう。
この計算式は何をやっているのか?
先ほどの「入れ子を分解した後」のエクセルシートを使って、
どういう処理をしているのかを説明していきます。
- 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関数です。
これを、
関数の入れ子で1つのセルにまとめると、
次のようになります。
「ある文字で始まる」「ある文字で終わる」という条件の書き方
最後に、
if関数で「ある文字で始まる」「ある文字で終わる」という条件を書きたい、
という場合には、
区で終わる → right(A1,1)="区"
というように書けます。
日本語に訳すと、
left(A1,3)="東京都" → A1セルの最初から3文字が「東京都」
right(A1,1)="区" → A1セルの最後から1文字が「区」
という感じになります。
確かに、
ワイルドカードを使うよりも、
関数がいっぱい出てくるし、
(多少)頭を使う必要もあります。
でも、
find関数、left関数、right関数は、
エクセルを使いこなす上では、非常に重要な関数ですから、
こういう関数を使いこなす努力をしたほうが、
長い目で見ると、エクセルを使いこなせるようになると思います。