web-dev-qa-db-ja.com

AND関数が空の空白のセルに対してTRUEの結果を返す-なぜですか?

空白のB2セルがあります。

= ISBLANK(B2) TRUEを与える

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

= IF(B2、TRUE、FALSE) FALSEを与える

ANDステートメントで直接使用すると、TRUEを返します

= AND(B2、TRUE) TRUEを与える

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

= AND(IF(B2、TRUE、FALSE)、TRUE) FALSEを与える

Excelがこのように動作する理由を教えてください。

30
pulsar3424

ここ から抽出され、Excel論理関数-事実と図というタイトルのセクションを探します。

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

41
jcbermu

TL; DR-Excelが内部でセルの内容を保存および交換する方法のアーティファクトです。空のセルは、値のないVARIANTです。これは、プログラミング言語がゼロ値と非ゼロ値の真偽をどのように扱うかにより、FALSEに変換されます。

AND()(および他のすべての論理関数)の動作は、両方の引数をブール値に変換してから、それらに対して論理and操作を実行します。カバーをはがして、Visual Basic Editorのオブジェクトブラウザーを使用して、Excelオブジェクトモデルでどのように定義されているかを確認できます。

AND in Object Browser

Booleannot a Variantを返すことに注意してください。つまり、関数を評価するプロセスのある時点で、すべての引数をBooleansに変換する必要があります。実際に観察された動作は、これが処理の早い段階で行われることを示しています。Excelは、すべての引数を変換しようとし、成功した場合は計算でconverted値を使用して、ユーザーフレンドリーになるように試みます。これは、Stringの値「True」と「False」を関数に渡すことで確認できます。

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

また、数値引数で示すこともできます。ゼロ以外の値はすべてtrueとして扱われ、ゼロはfalseとして扱われます。

=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_EMPTYVariantで表される「値」があります。繰り返しますが、これはマクロで確認できます:

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

では、AND関数がそれをBooleanに変換するとどうなりますか?良い質問!これはたまたまFalseであり、プログラミング言語が通常ゼロを扱う方法と同様です。

Sub DemoMacro2()
    MsgBox CBool(vbEmpty)
End Sub

omitting引数を完全に指定することで、同じ動作を確認できます。

=AND(,)

...と同じです...

=AND({vbEmpty},{vbEmpty})

...これは...と同じです.

=AND(0,0)

...それは:

=AND(FALSE,FALSE)
6
Comintern

@jcbermuの回答に対する私のコメントのとおり、少し修正します。

ある場合すべてではない引数の==にはテキストが含まれます inセル値または空のセル、そのような値は無視されます。ただし、すべての引数にテキストが含まれている場合 inセル値または空のセル、関数は_#VALUE!_を返します

修正が意味するところ:

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

つまり、セル_A1_の値が「abc」である場合、=AND(A1,TRUE)TRUEを返し、but=AND("abc",TRUE)は_#VALUE!_。下の画像の9〜13行目を参照してください。

enter image description here

しかし、取得stranger ...

引数のanyがエラーの場合、ANDfirstエラーを返します。 Except、引数のいずれかが文字列リテラルの場合、戻り値は_#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

=ISBLANK(B2)
B2が空白ではなく空の場合はTRUE

=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でできるとは思わないでください。
常にLogical Test、数式でB2をテストしない
IF関数の使用方法
Excel AND関数

0
user555689