こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

エクセルの数式で、COUNTIF(A1:A100,">""") 

http://oshiete1.goo.ne.jp/kotaeru.php3?q=2224824

の関連質問です。

表A1:A100にある、各セル内の数式で求められた計算結果が文字列の場合、その数を調べるには、

=COUNTIF(A1:A100,">""")

で、各セルの計算式の答えが "" 以外の文字列の数を返してくれるようです。(数値や空白セルはカウントされません。)

非常に便利なのですが、ちょっと腑に落ちないのは、  >""  って、""より大きいということですよね?
しかし文字列は数字とちがい大小はないのではないでしょうか?

もう一点疑問です。
ためしに、=COUNTIF(A1:A100,">=""")  としてみました。
今度は、  >=""  ですから、""も含むということになるはずですよね?
ところが答えが  ""  となるものをカウントしません。

不思議でたまりません。
よろしくお願いします。

投稿日時 - 2006-06-20 09:27:07

QNo.2226706

暇なときに回答ください

質問者が選んだベストアンサー

#1 の回答前半部は、

  ”文字列と文字列”の比較に">"や"<"が使えるか?

についてのコメントです。結論として #1 で説明したとおり”使えます。”

  ・論理式("A" > "B")  --> False
  ・論理式("A" < "B")  --> True
  ・論理式("A" > "")  --> True
  ・論理式("1" > "A")  --> False (文字列の数字と文字列)

ところで、Excel のワークシート上ではユーザーの利便性のため、本来
型不一致でエラーとなるはずの論理式(1 > "A") で False が返ります。(数値と文字列)

このおかげで、ユーザーはデータ型について普段意識せずに済むわけ
ですが、これはイレギュラーで、True にならないなら False 、、と単純
に評価しているに過ぎません。本来プログラムの世界では、

  ・論理式(1 > "A")   --> 型不一致でエラー

で比較不能です。比較する以前にエラーになってしまいます。ここで、
COUNTIF 関数も当然プログラムが提供している機能だということに注目
して下さい。

> ... =COUNTIF(A1:A100,">""") でなぜ数値は除外されるのでしょうか?

数値がカウント除外されているのは、COUNTIF 関数が "" を長さ 0 の
文字列と解釈しているのであれば、文字列と数値の比較のように比較不能
でエラーとなる場合には、カウントしないように実装されているから
だと思います。

=COUNTIF(A1:A100,">""")
=COUNTIF(A1:A100,">=""")

この両者がなぜ同じ結果を返すかについては、=COUNTIF(A1:A100,"ABC")
で ABC と入力されたセル数を返すところを見る限り、文字列の場合は、
イコールを書かなくても補完されるようです。

そのため、イコールは書いても書かなくても結果が同一になるのでしょう。


COUNTIF 関数の第 2 引数である条件部は、文字列で指定します。

内部的にどのように処理されているか正確なところは、COUNTIF 関数の
作成者にしか分からないのですが、比較を行うためには、この文字列で
渡された条件部を論理式に展開する必要があります。

その過程で、数値化できないものは文字列として扱う、としているよう
ですね。

したがって、

> =COUNTA(A1:A100)-COUNT(A1:A100)

は、次のように書いても OK みたいです。

=COUNTIF(A1:A100,"=*") ... イコールはあってもなくてもOK

以下は文字列以外のセルです。ブランクセル+文字列以外のデータがあるセル

=COUNTIF(A1:A10,"<>*")


> =SUMPRODUCT((A1:A100>="")*1)ですと、式が入っていない空白セルも
> カウントするようです。

すみません。これだとブランクセルを含めてしまいますね。その通りです。

投稿日時 - 2006-06-22 03:12:00

お礼

くわしいご説明、ありがとうございました。

投稿日時 - 2006-06-22 23:19:50

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

【ご質問 前半】

> 文字列は数字とちがい大小はないのではないでしょうか?

確かにそうですね。数値的な大小はありません。ただし、コンピューターは
その仕組上、数値であれ文字列であれビットデータ(1と0の集合)として
扱います。したがって、ビット単位で比較できます。

"" は長さ 0 の文字列ですね。完全に無ではなく、”文字がない”という
ビットデータが存在します。Unicode は横に置いておくと、

  1文字=1バイト=8ビット

です。

・A (文字コード 65)・・・ ビット(2進数)で表すと 01000001
・"" ・・・ ビット(2進数)で表すと 00000000

なので、 01000001 > 00000000 、従って、論理式の結果としては True です。

このように、コンピューター(プログラム)はビットで計算(比較)しています。


【ご質問 後半】

> ためしに、=COUNTIF(A1:A100,">=""")  としてみました。....

それは COUNTIF 関数が内部でどのような判定を行っているかに係る問題だと
思います。比較のための不等号を文字列で渡しているわけですから、内部で
それをどのように論理式に展開するか? の方法次第ということです。

この辺はブラックボックスですから、内部の仕組みを知る術がありませんが、
たまたま”うまくいった”と考えるべきでしょう。

この用途なら、より単純な仕組み(演算の過程が明確な)である次の数式の方
が良いと思いますよ。

= SUMPRODUCT((A1:A100<>"")*1)

ここで、= SUMPRODUCT((A1:A100>="")*1) とすれば、OASIS33 さんが想像したとおり
の結果になります。

投稿日時 - 2006-06-20 10:58:22

お礼

さっそくありがとうございました。

コンピューターはビットで比較しているのなら、=COUNTIF(A1:A100,">""")  でなぜ数値は除外されるのでしょうか?不思議です。

あと、=SUMPRODUCT((A1:A100>="")*1)ですと、式が入っていない空白セルもカウントするようです。

=COUNTA(A1:A100)-COUNT(A1:A100)で、""を含めた文字列をカウントできました。

投稿日時 - 2006-06-20 11:39:50

あなたにオススメの質問