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

解決済みの質問

falseとtrue 0,1,-1 の意味が知りたいです

こんにちは。
大分前からなんとなくしっくり行かないことがあります。
excel でのワークシートの関数vlookupなどの引数に
true/false がありますよね。
絶対値の絶対のイメージがtrue・・の気分なのですが結果は逆でした。

IF関数では
真→true  偽→false だったと思います。
私はIF関数でのtrue/false のイメージはしっくりいきます。
vlookupはどーしても納得いくイメージが持てません。
どなたか教えていただけませんか?どんな風にとらえればいいのか。

しかも確かACCESSやVBAの中では
true→-1 false→0
vlookupでは
true→1 false→0
じゃなかったでしたっけ?
こちらの考えも??
こっちの方は以前知り合いに説明を受けて一度は納得したのですが、
今はよくわからなくなってしまいました。
教えてください。

投稿日時 - 2006-08-09 07:40:36

QNo.2328665

暇なときに回答ください

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

>vlookupはどーしても納得いくイメージが持てません。
>どなたか教えていただけませんか?どんな風にとらえればいいのか。
どっちをどっちにするかは、2つに1つなので、どっちがどっちでもいいのかもしれません。
個人的には、VLOOKUP 関数は、表引きする関数なので、何らかの値を返して欲しい、なので、返さない場合があるFALSE の場合が偽(規定の動作ではない)という風に思っています。

>VBAの中では
>true→-1 false→0
>vlookup(※ワークシート上)では
>true→1 false→0
既に、色々説明されている通りですが、
ワークシート上でTRUE を数値として計算に使ったらどうなるか?
については、経験上 1 だとわかっていますが、
ヘルプなどには、数値として計算できるとか論理値TRUE が1であるとかは、書いていなかったと思います。
なので、そのように使っているというのは、単に経験則によるもので、
保証された動作ではないと思います。(私自身も便利なのでよく使っていますけど)
ワークシート上で、1な理由は
例えば、
あるセルの値が100の時50プラスするというような場合、
=A1+IF(A1=100,50,0)
のように書く必要がありますが、
論理式を使って
=A1+(A1=100)*50
のように書くことができます。
もしワークシート上での論理値TRUEが-1だったとしたら
=A1-(A1=100)*50
としなければならず、結果としては目的を達成できるとしても、
意図することが+なのに、-しなければならないので違和感があります。多分そのようなことから1になっているのだろうと思います。

VBAについては、
ヘルプのブール型の説明を見て貰えるとわかりますが、
「16 ビット (2 バイト) の変数です…
他の数値型をブール型の値に変換すると、0 は偽 (False) になり、0 以外の値はすべて真 (True) になります。一方、ブール型の値を他のデータ型に変換すると、偽 (False) は 0、真 (True) は -1 になります。」
とあります。
つまり、0が偽でそれ以外の値は真になるのですが、
デフォルトの真が-1なのは、
ビット演算でNOTを16ビットの変数に取った場合、
0000000000000000→1111111111111111
で1111111111111111 になりますが、これは、16ビット符号付きの数字で言うと-1になります。
逆に-1のNOTをとったら0になるので、
このようにしていると思われます。

以上は、個人的な推測ですので、意味はありません。
一般的には、真値、偽値を数値として扱うときに何になるかはプログラム言語で違いますし、そうした計算を許さないものもあります。
意味的にはそうした論理値を数値計算に使うのはおかしいことでしょうね。

投稿日時 - 2006-08-09 13:36:17

お礼

みなさま返す返す本当にお答えいただきありがとうございました。
BLUEPIXYさんのご説明もとても分かりやすく嬉しかったです。文書で書いてもらっているので以前お友達より説明をいただいたよりもゆっくり考えられました。今度は忘れないように大事にメモしておきます(笑)
なぜこのような質問を差し上げたかと申しますとよく仕事で色々な方から質問を私が受けるので自分自身はtrue/falseについては数値は一概に同じとは思ってはいなかったのですが、周りの方に説明するのに苦労していました。
  *デフォルトの真が-1なのは、
  *ビット演算でNOTを16ビットの変数に取った場合、
  *0000000000000000→1111111111111111
  *で1111111111111111 になりますが、これは、16ビット符号付きの数字で言うと-1になります。
すみません。↑こちらの内容が私のレベルではぼんやりとした感じなのでもう少し調べて納得できるようにしたいと思います。
それでそれでもまた納得できないようなら改めてご質問させていただきます。
本当にホントウにありがとうございました。

投稿日時 - 2006-08-09 17:40:39

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

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

回答(8)

ANo.8

#5>ヘルプなどには、数値として計算できるとか論理値TRUE が1であるとかは、書いていなかったと思います。
明示的な変換ルールは見つけられなかったのですが、
N関数の説明のところで、TRUE は 1 、FALSE は、0 に変換されるとあります。
解説として
・Excel では数式中の値は必要に応じて自動的に変換されるため、N 関数を使用する必要はほとんどありません
とあるので、自動変換のルールとN関数の変換ルールが(ほとんど)同じであると思われます。
ただ、
=SUM(TRUE)

A1=TRUE
の時
=SUM(A1)
の結果は違いますから
いつもそのような変換が行われると思うのはやはりよろしくないと思います。

投稿日時 - 2006-08-10 02:06:19

お礼

BLUEPIXYさんへ
またまたご回答ありがとうございます!
疑問がすっきりするともうちょっとがんばってみようかなぁという気持ちになります。
苦手意識はまだまだ続きそうですが色々な面でアドバイスありがとうございました。

投稿日時 - 2006-08-10 07:59:01

ANo.7

NCU

VBAでもワークシートでもゼロは偽、それ以外の数値は真と解釈されます。
一方で真・偽に1をかけるとかゼロを足すとか整数型の変数に代入するとかして数値化すると、
VBAではTrue=-1、ワークシートではTRUE=1に変換されます。

以上、仕様です。

投稿日時 - 2006-08-10 01:23:39

お礼

ご回答ありがとうございます。
NCUさんのおっしゃる通りなんだろうなぁというのは理解できます。
色々な方からのご指導とともに納得いくところまで辿り着きました。
こだわりすぎると先へ進めなくて挫折しそうになるのはわかりつつもなぜなのかなぁと時々フッとこんなへんてこな疑問を払いきれなくなるときがあります。そういう時って何故だかそんなもんと飲み込めないんですよね~^_^;
そんな人間にたくさんの方がお付き合いしていただいていることにいつも感謝しております。

投稿日時 - 2006-08-10 07:52:03

ANo.6

こんばんは。Wend02です。
お返事ありがとうございます。

>>数値にキャストして演算してもあまり意味はありません・・のアドバイスもその通りだなぁと思いました。
>手元の本にはそのようなことは書いてないのですが、Wendy02さんのあまり意味は・・という裏づけに基づいたようなニュアンスの構文がありその部分の??

「裏づけに基づいた」に関しては、基本的なコーディングルールですね。

しかし、絶対に守るというほど、私は、それをしていないからです。やってはいけないと思いつつも、時々してしまいます。悪い癖かもしれません。それで、二~三行分ぐらいは、省略できるからなのです。

例えば、 myFlg を Boolean値にするのは、ルール違反なだと思いますが、

Sub TestBool()
Dim myFlg As Boolean
Dim ret As String
  myFlg = True
   MsgBox Mid("前後", CInt(myFlg) + 2, 1)
End Sub

として、コードを書いたことがあります。
Boolean値は、だいたい、明示的に行うので、間違いはありませんが、キャストは、精度の違う型に入れるときは、ミスが起こりやすいのです。ここらは、本に出てくる話です。

>msgbox関数を利用したときにOK/キャンセルのボタンの値が true/false で数値は「-1」「0」と書籍に書いてあります。

これについては、最近、経験したことなのですが、ある人が、MsgBox の戻り値を定数の数値のリストを作って教えていたので、私は否定こそしなかったけれども、プログラミングの場合は、その環境がよく分かっていればよいのですが、生徒さんに教えるには、組み込み定数を使ったほうが安全だと思いました。数値は、思い込みがあるから、慣れていても、ミスすることがあるからです。

なお、
>ワークシートの関数vlookupなどの引数にtrue/false がありますよね
>絶対値の絶対のイメージがtrue・・の気分なのですが結果は逆でした。

これについては、製作のスタッフが違いますから、コンセプトの考え方が違いますね。
関数は、関数自身の中で統一が取れていません。
例えば、MATCH関数は、その検索の型は、-1,0,1 と三つあります。

>IF関数では
>真→true  偽→false だったと思います。
>私はIF関数でのtrue/false のイメージはしっくりいきます。

=IF(COUNTIF(A1:A100,"V"),"あります","ありません")

というように、ある・なし、は問えても、数は、問いません。また、マイナス値でも、True になります。「False」値は、「0」の1個なのに、「True」値は、「0以外すべて」です。ワークシートでは、それを応用できますが、VBAでは、慎重にならざるをえませんね。

投稿日時 - 2006-08-09 23:18:32

お礼

Wendy02さんへ
またまた長文のご説明をありがとうございます。
質問のお礼と大分離れた話を書きますが、私は以前Wendy02さんのプロフィールを読んでいて心がはっとした者です。
 *ただ、人に教えることの難しさ、礼儀の知らない人たちとのお付き合いは、時に、心を疲れさせることがあります。
というコメントを読み自分自身はどんな風に周りの人間に接していたのだろうと不安になりました。
あれ以来なるべく自分自身で調べて納得しようそれでも難しいならせめて誠心誠意を持って相手に御礼を述べなくてはと思っております。
その意味でもWendy02さんのご回答やみなさんのご回答一つ一つが大事に思えます。
いつもありがとうございます。もうちょっと勉強がんばってみたいと思います。

投稿日時 - 2006-08-10 08:09:37

ANo.4

#3の補足:

>数値にキャストして演算してもあまり意味はありません。

原則的に、数値型とブール型では、ブール型のほうが精度が低いので、精度の低いものを上位の精度に上げて演算するのは、不可ということです。

逆は、可能です。つまり、数値型からブーリアン値にキャストする場合は、良いわけです。

Sub CastTest()
Dim a As Variant
 a = CBool(-2) 'True
End Sub

「0」以外は、すべて、True になります。

投稿日時 - 2006-08-09 10:50:59

お礼

こんにちは。とてもよく分かりました。
私もご質問をさせていただいた後0以外で試したところすべてみなさんがおっしゃっているように「0」以外は、すべて、True になるということは気づいておりました。
おかげで少し自分自身が考えていたとおりでしたので嬉しかったです。
>数値にキャストして演算してもあまり意味はありません・・のアドバイスもその通りだなぁと思いました。
手元の本にはそのようなことは書いてないのですが、Wendy02さんのあまり意味は・・という裏づけに基づいたようなニュアンスの構文がありその部分の??という気持ちもすっきりしました。
ありがとうございました。

投稿日時 - 2006-08-09 17:33:17

ANo.3

こんにちは。

これは、VBAでは、中級の教科書に出てくる話です。

ワークシートと VBAは、基本的なBoolean値の扱い方が違います。

どこでも、「False」 は、間違いなく、「0」です。
ワークシートは、「0」以外は、すべて、Trueです。

つまり、「True」 は、「Not False 」のことです。
基本的に、VBAも、「Not False」のことで、それを数値キャストすれば違ってきます。

これをきちんと把握していないと、VBAでは、とんでもないミスをおかしてしまいます。VBAでは、「False」は、「0」ですが、「True」が、「-1」ではない時があります。VBAでは、数値型の変換は特別な理由がない限りは、考えないほうがよいです。

Win32 API関数では、同じBoolean値と見えても、その値が違いますから、VBA/VB上では、Falseは有効でもTrue は使えません。

>二つのセルを足し算してみましたところ
以下のようになります。数値にキャストして演算してもあまり意味はありません。

Sub BooleanTest()
Dim a As Boolean
Dim b As Boolean
Dim c As Boolean
Dim d As Boolean
Dim e As Boolean
 a = True * True  'True
 b = True + True  'True
 c = True * False 'False
 d = True + False 'True
 e = False + True 'True
End Sub

投稿日時 - 2006-08-09 10:40:35

ANo.2

#01です。VBAで確認したところTrue + True の値は確かに -2 でした。

でもワークシートでは 2 になります。少し調べてみます

投稿日時 - 2006-08-09 10:28:20

お礼

すみません。私事にもかかわらず2度もご回答いただきうれしいです。
ありがとうございます。

投稿日時 - 2006-08-09 17:41:56

ANo.1

>しかも確かACCESSやVBAの中では
>true→-1 false→0
いいえTrueの論理値は1、Falseは0です
試しにEXCELで二つのセルにTrueを入れて、二つのセルを足し算してみて下さい。結果は2になります。

EXCELやVBAではこれは一貫していますよ

投稿日時 - 2006-08-09 07:50:59

補足

さっそくのご回答ありがとうございました。
すみません私がまだVBAの勉強を始めたばかりですので説明が足りなかったです。
msgbox関数を利用したときにOK/キャンセルのボタンの値が true/false で数値は「-1」「0」と書籍に書いてあります。まだvbaで自分で動作確認はしておりませんが大村あつし著なので間違いないと思いそのまま全ての値がそうなんだと思い込んでいました。
"zap35さん"のおっしゃっていた事はboolean型以外での『値がTrueの論理値は1、Falseは0』  ということですか?
なぞがたくさんあり不思議だらけです。教えてください。

投稿日時 - 2006-08-09 08:23:24

お礼

すみません補足を記入後に試しにEXCELで二つのセルにTrueを入れて、二つのセルを足し算してみましたところ
結果は-2にやはりなりました(>_<)
うーん。ますますわかりません。教えてください。
お礼の欄にて補足してしましました。すみません。それからすぐにご連絡をしていただきましたこと本当にありがとうございます。

投稿日時 - 2006-08-09 08:30:03

あなたにオススメの質問