microsoft excel – AND関数は、空の空白のセルに真の結果を与えます – なぜですか?

microsoft-excel microsoft-excel-2013 worksheet-function

B2セルが空白になってしまいました

=ISBLANK(B2) gives TRUE

単純な論理テストではFALSEを返します

=IF(B2,TRUE,FALSE) gives FALSE

しかし、AND 文で直接使用すると TRUE を返します

=AND(B2,TRUE) gives TRUE

もちろん、間接的に AND ステートメントで使用された場合でも、これは FALSE を返します

=AND(IF(B2,TRUE,FALSE),TRUE) gives FALSE

なぜ私のExcelがそのように振る舞うのか説明していただけますか?

  30  pulsar3424  2016-08-31


ベストアンサー

こちらから抜粋して、Excelの論理関数 – 事実と数字というタイトルのセクションを探してください

Excelで論理関数(AND, XOR, NOT, OR)を使用している場合、引数にテキスト値や空のセルが含まれていると、そのような値は無視されます

41  jcbermu  2016-08-31


TL;DR – これは、Excelが内部でセルの内容をどのように保存し、交換しているかに起因しています。空のセルは値のない VARIANT であり、プログラミング言語がゼロや非ゼロの値の真実性をどのように扱うかによって FALSE に変換されます

AND() (および他のすべての論理関数) の動作は、両方の引数をブール値に変換し、その上で論理的な and 演算を実行するというものです。表紙を剥がして、Visual Basic EditorのObject Browserを使って、Excelのオブジェクトモデルでどのように定義されているかを見てみましょう

AND in Object Browser

この関数はVariantではなくBooleanを返すことに注意してください。これは、関数を評価する過程のある時点で、すべての引数をBooleansに変換しなければならないことを意味します。実際に観測された動作は、これが処理の初期段階で行われていることを示しています – Excelは、すべての引数を変換しようとすることで、ユーザーフレンドリーになろうとしています。これは、Stringの値 “True “と “False “を関数に渡すことで示すことができます

=AND("true","true") <---Results in TRUE
=AND("false","true") <---Results in FALSE
Etc.

また、数値引数を使用して実証することもできます – ゼロ以外の値を真、ゼロを偽として扱います

=AND(42,-42) <---Results in TRUE
=AND(0,0) <---Results in FALSE
=AND(42,0) <---Results in FALSE
Etc.

組み合わせても同じ挙動をしています

=AND("false",0) <---Results in FALSE
Etc.

もうお分かりでしょう。では、これが空のセルのテストとどのように関係しているのでしょうか?その答えは、Excelがセルの内容を内部的にどのように保存しているかにあります。繰り返しになりますが、Excelのオブジェクトモデルは非常に参考になります

Cell value in Object Browser

これは、COM VARIANT 構造体であることに注意してください。この構造体は基本的に2つの部分を含んでいます – 型、それを使用するコードにそれをどのように解釈するかを伝える型と、データ領域です。Excelでは内容のないセルは、サブタイプVT_EMPTYを持つVariantで表される「値」を持つことになります。繰り返しになりますが、これはマクロで確認することができます

Sub DemoMacro()
'Displays "True" if cell A1 on the active sheet has no contents.
MsgBox Range("A1").Value2 = vbEmpty
End Sub

では、AND関数がそれをBooleanに変換するとどうなるのでしょうか?いい質問ですね!プログラミング言語が一般的にゼロをどのように扱うかに似ています

Sub DemoMacro2()
MsgBox CBool(vbEmpty)
End Sub

完全に引数を省略しても同じ挙動を見ることができます

=AND(,)

…と同じことを

=AND({vbEmpty},{vbEmpty})

…それは

=AND(0,0)

…which is:

=AND(FALSE,FALSE)

6  Comintern  2016-09-01


@jcbermuさんの回答に対する私のコメント通り、少し訂正しておきます

引数のいずれかがセル値や空のセルにテキストを含む場合、そのような値は無視されます。しかし、すべての引数がセルの値や空のセルにテキストを含む場合、この関数は#VALUE!を返します

訂正が暗示しています

引数の1つ以上がセル参照のテキストではなく、文字列リテラルのテキストである場合、結果は#VALUE!となります

つまり、セル A1 が値 “abc” を持つ場合、=AND(A1,TRUE)TRUE を返しますが、=AND("abc",TRUE)#VALUE! を返します。下の画像の9行目から13行目を見てください

enter image description here

しかし、それは奇妙なことになる

引数のいずれかがエラーの場合、ANDは最初のエラーを返します。ただし、引数のいずれかが文字列リテラルであれば、戻り値は#VALUE!となります

=AND(TRUE,TRUE,"abc") = #VALUE!

=AND(1/0,foo(),TRUE) = #DIV/0!

=AND(foo(),1/0,TRUE) = #NAME?

=AND(1/0,foo(),"abc",TRUE) = #VALUE!

=AND(foo(),1/0,"abc",TRUE) = #VALUE!

2  ThunderFrame  2016-09-03


=ISBLANK(B2)は、B2が空白ではなく空の場合に真を与えます

=AND(B2,TRUE)=AND(B2="",TRUE)でなければなりませんあなたは値(B2空のリターンTrue)を記述する必要があり、2番目の論理はTrueであり、Trueを返します=IF(B2,TRUE,FALSE)=IF(B2="",TRUE,FALSE)でなければなりませんTrueを与える=AND(IF(B2,TRUE,FALSE),TRUE)でなければなりません=AND(IF(B2="",TRUE,FALSE),TRUE)はTrueを与える すべてのテストを記述するために常に試してみて、Excelが行うとは思わないでください。 IF関数の使用方法 ExcelのAND関数 常にLogical Testを覚えて、あなたの数式でB2のテストではありません

0  None  2016-08-31


タイトルとURLをコピーしました