COUNTIF関数やSUMIF関数のように検索条件を引数とする関数は多くあります。この検索条件について、マイクロソフトの公式サイトの説明を見ると、原則として文字列または数値で指定することになっていますが、ワイルドカードや比較演算子(正確には比較演算子のような記号)を使ってもよいことになっています。
しかし、ややこしいことに、検索条件の先頭に比較演算子のような記号を付けた場合、論理式の比較演算子とは挙動が異なることが分かっています。そのため、比較演算でTRUEだったとしても、検索条件ではFALSEになり抽出されないこともありますし、その逆もあります。
通常の使い方をしていれば細かい仕様を意識することは無いと思いますが、変則的な使い方をした場合に悩んでしまうこともあるかもしれません。そこで、今回は、「検索条件」を関数の引数として指定した場合の仕様について解説します。
目次
- 1.検索条件とは何か
- 2.数値を指定した場合
- 3.大文字と小文字は区別しない
- 4.ワイルドカード
- 5.比較演算子のような記号
- 6.先頭に不等号がある場合
- 7.空白を検索条件にした場合
- 8.比較演算子のような記号を検索する場合
- 9.データベース関数やフィルターオプションとの違いについて
1.検索条件とは何か
検索条件を引数とする関数は、指定した範囲に含まれるセルのうち検索条件に一致するセルを抽出して集計する「統計」の関数です。
- COUNTIF(S)
- SUMIF(S)
- AVERAGEIF(S)
- MAXIF(S) ※一部バージョンのみ
- MINIF(S) ※一部バージョンのみ
検索条件は「条件」とは書いてありますが、何らかの論理式を数式で表現するという意味ではなく、VLOOKUP関数の検索値と同じように、探したい数値または文字列のデータで指定します。数値を検索したければ数値だけを指定し、文字列を検索したければ文字列を二重引用符で囲んで指定するのが本来の正しい指定方法です。このデータは、セル参照や数式を用いて作ってもかまいません。
例えば、「32」「"りんご"」「B5」「TODAY()」といったデータを指定します。
なお、検索条件についての細かい仕様は公式の説明がないので、以下、当サイトにおいて様々な検証をした結果、ほぼ間違いないと思われることを解説します。
2.数値を指定した場合
(1)数値と「数値に変換できる文字列」は区別しない
問題
セルA1に数値の「123」、セルA2に数式の「="123"」をそれぞれ入力した。COUNTIF関数の検索条件に「123」を指定した場合と、比較演算で「123」と比較した場合の違いを述べなさい。また、「0123」をカウントしなさい。
解説
範囲をB1:B2として、COUNTIF関数で数値の123をカウントします。2個となります。数値の123と文字列の123を区別せずにカウントしていることが分かります。
- =COUNTIF(B1:B2,123)
文字列の"123"を指定しても同じです。このように、検索条件に数値または「数値に変換できる文字列」を指定した場合は、数値と文字列を区別せずに抽出します。
- =COUNTIF(B1:B2,"123")
ところが、文字列の"123"と数値の123を比較するとFALSEになります。つまり、文字列と数値は区別して判定します。このように、比較演算ではFALSEであっても、検索条件では抽出されることがありますので注意しなければなりません(参考:【Excel】IF関数が使えない原因は「比較演算」の練習不足である)。
- =B1=123
範囲をB1:B2として、文字列の0123をカウントします。2個となります。このことから、検索条件に数値または「数値に変換できる文字列」を指定した場合は、そのまま比較しているのではなく、抽出するほうも抽出されるほうもすべて数値に変換して抽出していることが分かります。
- =COUNTIF(B1:B2,"0123")
(2)日付はシリアル値でカウントする
問題
セルA1にシリアル値の「2020年1月1日」を入力し、セルA2に数式の「="2020/1/1"」を入力した。COUNTIF関数の検索条件に文字列の「r2/1/1」を指定した場合と、比較演算で「r2/1/1」と比較した場合の違いを述べなさい。
解説
文字列の「r2/1/1」と比較しても一致しません。
- =B1="r2/1/1"
範囲をB1:B2として、COUNTIF関数で文字列の「r2/1/1」をカウントします。2個となります。日付の場合も数値(シリアル値)と文字列を区別せずにカウントしていることが分かります。
- =COUNTIF(B1:B2,"r2/1/1")
3.大文字と小文字は区別しない
問題
次の図で、セル範囲A1:A2で「abc」の個数を求めなさい。
解説
範囲をB1:B2として、COUNTIF関数で文字列の「abc」をカウントします。2個となります。このように、大文字と小文字を区別せずにカウントします。
- =COUNTIF(B1:B2,"abc")
COUNTIFだけでなく、比較演算をした場合も、VLOOKUP関数で検索した場合も大文字・小文字は区別しませんので、大抵のExcel関数や計算で区別されないものと考えて差し支えありません(EXACT関数は区別する)。
- =B1="abc"
4.ワイルドカード
(1)疑問符、アスタリスク
問題
セル範囲A1:A3について、カレーから始まるセル、カレーを含むセル、カレー+3文字のセルをそれぞれカウントしなさい。
解説
前述のように検索条件には数値または文字列のデータを指定するのが大原則ですが、文字列で指定した場合に限り、ワイルドカード文字を使用することができます。このことはVLOOKUP関数の検索値と同じです。アスタリスク「*」は0文字以上の任意の文字列を表します。「カレー*」の「*」の部分は0文字以上なので「カレー」「カレーライス」の2つが該当します。
- =COUNTIF(A1:A3,"カレー*")
含む検索にする場合は前後に「*」をつけます。
- =COUNTIF(A1:A3,"*カレー*")
文字数を固定したい場合は疑問符「?」を使います。「?」は任意の1文字を表し、3文字の場合は「???」とします。
- =COUNTIF(A1:A3,"カレー???")
(2)チルダ
問題
A列に、2種類の半角記号「?」「*」をランダムに入力した。これらの個数をそれぞれ求めなさい。ただし、セルD1の数式をセルD2に複写するものとする。
解説
ワイルドカード文字は特殊な記号なのでそれ自身を検索することができません。通常の文字として疑問符やアスタリスクを検索する場合は、その文字の直前に半角のチルダ (~) を付けます。
- =COUNTIF(A:A,"~"&C1)
(3)数値は対象外
問題
セルB1を空白とし、セルB2に数値の「123」、セルB3に数式の「="123"」、セルB4に「abc」をそれぞれ入力した。セルB1:B4のなかから「1」から始まる文字列をカウントしなさい。また、COUNTIF関数を用いて文字列をカウントしなさい。
解説
「1」から始まる文字列をカウントします。1個となります。「1」から始まる文字はカウントしますが、「1」から始まる数値はカウントされません。
- =COUNTIF(B1:B4,"1*")
前述のとおり、検索条件とは数値または文字列のデータです。数値を指定した場合は数値と文字列を区別しませんが、ワイルドカード文字を使用した場合は文字だけを対象としますので、数値は対象外となります。
したがって、アスタリスク「*」だけを検索条件とした場合、文字列が入力されているセルのみとなります。また、アスタリスクは0文字以上ですが、空白セルは対象外となることに注意します。
- =COUNTIF(B1:B4,"*")
*補足*
空白ではなく、数式の「=""」にすると3個となります。つまり、アスタリスク「*」だけを検索条件とした場合、「=""」も対象となりますので注意が必要です。
5.比較演算子のような記号
(1)比較演算子ではない
検索条件には、先頭に比較演算子のような記号を付けることができます。
マイクロソフトの公式の説明によると「比較演算子のような記号」は、単なる論理または数学記号(logical or mathematical symbols)であり、比較演算子ではない文字列とされています。演算子ではないので二重引用符「"」で囲む必要があり、また、比較演算とは異なる結果になることもあります(後述)。
Any text criteria or any criteria that includes logical or mathematical symbols must be enclosed in double quotation marks (").
文字列条件や、論理記号または数学記号を含む条件は、二重引用符 (") で囲む必要があります。
(2)比較演算子のような記号が使えるのはあくまで例外
検索条件とは、探したい数値または文字列のデータであり、本来、~より大きい、~より小さいといった検索をすることはできません。
例えば、検索の画面(Ctrl+F)の検索する文字列に「>100」と入力しても100より大きい数を検索することはできません。「>100」を検索すると言えば、通常は「">100"」という文字列を検索するのであり、100より大きい数値を検索するわけではありません。COUNTIF関数の検索条件で比較演算子のような記号が使えるのはあくまで例外なのです。
(3)原則としてイコールを付けてはいけない
問題
セルB1に数値の「123」を入力し、セルB2に数式の「="123"」を入力した。COUNTIF関数の検索条件に「=123」を指定してカウントしなさい。
解説
検索条件に「=123」とするとエラーになります。
前述のとおり、先頭に比較演算子のような記号を付けることができますが、比較演算子のような記号は文字列を指定する場合のみ使用することができます(数値では使用することができない)。しかも、この記号は比較演算子ではなく単なる文字列なので、ダブルクォーテーションを付けなければなりません。
先頭にイコールを付けて「"=123"」を指定することになりますが、文字列の123だけでなく、数値の123もカウントします。つまり、数値と文字列を区別せず、単に数値の「123」を指定したのと同じになります。簡単に言えば先頭のイコールは全く意味がありません。
- =COUNTIF(B1:B2,"=123")
検索条件は、探したい数値または文字列のデータで指定するのが大原則ですから、イコールを付ける意味がありません。また、前述のとおり、比較演算子のイコールで比較した結果とは異なるので、原則として先頭にイコールを付けてはいけません。
6.先頭に不等号がある場合
(1)直後が数値であれば数値のみがカウントの対象になる
問題
セルB1に数値の「100」、セルB2に数値の「200」、セルB3に数式の「="100"」、セルB4に数式の「="200"」をそれぞれ入力した。COUNTIF関数の検索条件に「>100」を指定した場合と、比較演算で「100」と比較した場合の違いを述べなさい。
解説
100より大きい数値を検索します。1個となります。
- =COUNTIF(B1:B4,">100")
先頭に不等号があるもの(<、>、<=、>=)は、その直後が数値とみなせる場合、数値として入力されたセルのみがカウントの対象であり、文字列は対象外で、「数値に変換できる文字列」も対象外となります。つまり、数値と「数値に変換できる文字列」を区別してカウントします。
論理式としては、「"200">"100"」も「"200">100」もTRUEとなります。しかし、検索条件で「">100"」と指定すると、大小関係にかかわらず文字列の「"200"」は対象外となります。このように論理式がTRUEでも、検索条件で抽出されないことがあります。
(2)等しくない
問題
セルB1を空白とし、セルB2に数値の「100」、セルB3に数値の「200」、セルB4に数式の「="100"」、セルB5に数式の「="200"」をそれぞれ入力した。COUNTIF関数の検索条件に「<>100」を指定した場合と、比較演算で「100」と比較した場合の違いを述べなさい。
解説
先頭に不等号があるものは、その直後が数値とみなせる場合、数値として入力されたセルのみが比較の対象となります(数値と文字列を区別する)。検索条件を「"<>100"」とすると、数値の100以外のものがすべてカウントされます。文字列の「"100"」もカウントされます。また、「<>」を使用した時は、空白セルもカウントされます。
- =COUNTIF(B1:B5,"<>100")
*補足*
「=COUNTIF(B1:B5,100)」と入力すると、数値と文字列を区別せずにカウントします。「<>100」の場合と結果が異なるので注意が必要です。
(3)直後が文字列であれば文字列のみがカウントの対象になる
問題
セル範囲A1:A4について、COUNTIF関数の検索条件に「<b」を指定した場合と、比較演算で「b」と比較した場合の違いを述べなさい。
解説
COUNTIF関数の検索条件に「<b」を指定してカウントします。1個になります。
- =COUNTIF(A1:A4,"<b")
しかし、比較演算の場合は3つがTRUEとなります。
- =A1<"b"
先頭に不等号があるもの(<、>、<=、>=)は、その直後が文字列の場合、文字列として入力されたセルのみが比較の対象であり、数値はカウントの対象外となります。
(4)ワイルドカードとの関係
問題
セル範囲A1:A4について、COUNTIF関数の検索条件に「<1*」を指定してカウントしなさい。
解説
COUNTIF関数の検索条件に「<1*」を指定してカウントします。0個になります。先頭に不等号がある場合、ワイルドカードは使えず、アスタリスクは単なる文字として扱われます。
- =COUNTIF(A1:A4,"<1*")
*補足*
ちなみに、前述のとおり、先頭にイコールをつけた場合はイコールが無いのと同じなので、ワイルドカードとして扱われます。ただし、ワイルドカードを使ったときの対象は文字列だけなので、数値はカウントされません。
- =COUNTIF(A1:A4,"=1*")
(5)比較演算子のような記号を単独で用いた場合
問題
セルA1を空白とし、セルA2に数式の「=""」、セルA3に数値の「100」、セルA4に数式の「="100"」、セルA5に「a」をそれぞれ入力した。COUNTIF関数の検索条件に比較演算子だけ指定した場合、どのような結果になるか。
解説
イコールは完全な空白セルA1だけをカウントます。また、「<>」はその反対で空白セルA1以外のセルをカウントします(COUNTA関数と同じ)。それ以外は全くカウントされません。
- =COUNTIF($A$1:$A$5,C1)
7.空白を検索条件にした場合
問題
さきほどの問題で、検索条件を「""」とした場合はどうか。また、検索条件を省略した場合はどうか。
解説
検索条件を空白文字列「""」とすると空白のセル2つがカウントされます(COUNTBLANK関数と同じ)。
- =COUNTIF($A$1:$A$5,"")
また、検索条件を省略すると何もカウントされません。
- =COUNTIF($A$1:$A$5,)
*補足*
空白セルを除くセルをカウントする場合は、COUNTAからCOUNTIFSを引きます。
- =COUNTA(A1:A5)-COUNTIFS(A1:A5,"<>",A1:A5,"")
8.比較演算子のような記号を検索する場合
問題
A列に、3種類の半角の記号「=」「<」「>」をランダムに入力した。これらの個数をそれぞれ求めなさい。ただし、セルD1の数式をD2:D3に複写するものとする。
解説
比較演算子を検索するには先頭にイコールを付けます。先頭でなければ比較演算子ではなく単なる文字列とみなされます。つまり、イコールを2つにすればいいということです。
- =COUNTIF(A:A,"="&C1)
等号や不等号から始まる文字列を検索するときはその前にイコールをつけます。
- =COUNTIF(A:A,"==")
- =COUNTIF(A:A,"=<")
- =COUNTIF(A:A,"=>")
9.データベース関数やフィルターオプションとの違いについて
データベース関数でも検索条件範囲(criteria)を入力します。検索条件が数値または数値に変換できる文字列の場合はすべて数値に変換したうえで、完全に一致するデータが抽出されます。
- =DCOUNTA(A1:A3,A1,C1:C2)
しかし、数値に変換できない文字列の場合は、検索条件から始まる文字列が全て抽出されます(前方一致)。
完全に一致する検索をする場合はイコールが必要です。
フィルターオプションの場合も同じです。
COUNTIFなどの検索条件はイコールの有無にかかわらず完全一致ですが、それ以外の場合はイコールが無ければ前方一致となります。
解説は以上です。