AND 関数は、空の BLANK セルに対して TRUE の結果を返します。なぜでしょうか?

AND 関数は、空の BLANK セルに対して TRUE の結果を返します。なぜでしょうか?

B2セルが空白です。

=空白(B2)TRUEを返す

簡単な論理テストではFALSEが返される

=IF(B2,TRUE,FALSE)FALSEを返す

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

=AND(B2,TRUE)TRUEを返す

もちろん、AND文で間接的に使用された場合、FALSEが返されます。

=AND(IF(B2,TRUE,FALSE),TRUE)FALSEを返す

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

答え1

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

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

答え2

要約- これは、Excel がセルの内容を内部的に保存および交換する方法によるものです。空のセルは値のない VARIANT であり、プログラミング言語がゼロ値と非ゼロ値の真偽を処理する方法により、FALSE に変換されます。

AND()(および他のすべての論理関数)の動作は、両方の引数をブール値に変換し、andそれらに対して論理演算を実行することです。Visual Basic エディターのオブジェクト ブラウザーを使用して、Excel オブジェクト モデルでの定義の詳細を確認できます。

オブジェクトブラウザでのAND

返されることに注意してくださいBooleanないこれは、関数Variantを評価する過程のある時点で、すべての引数はBooleansに変換する必要がある実際に観察された動作は、これが処理の早い段階で行われることを示しています。Excelは、すべての引数を変換し、変換された計算が成功した場合、計算に値が使用されます。これは、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 オブジェクト モデルが役立ちます。

オブジェクト ブラウザのセル値

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

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

同じ動作は次のようにも見られます。省略する議論全体:

=AND(,)

...は同じものです...

=AND({vbEmpty},{vbEmpty})

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

=AND(0,0)

...それは次の通りです:

=AND(FALSE,FALSE)

答え3

@jcbermu の回答に対する私のコメントに従って、少し訂正します:

もしあればすべてではありません引数にテキスト値が含まれている セル値または空のセルがある場合、そのような値は無視されます。しかし、すべての引数にテキスト値が含まれている場合 セル値または空のセルの場合、関数は#VALUE!

訂正は次のことを意味します:

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

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

ここに画像の説明を入力してください

しかし、見知らぬ人...

もしどれでも引数のいずれかがエラーの場合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!

答え4

=ISBLANK(B2)
B2が空白でない場合はTRUEを返します。

=AND(B2,TRUE)
=AND(B2="",TRUE)値(B2は空でTrueを返す)を書き込む必要 があり、2番目の論理はTrueでTrueを返します。Trueを返す
=IF(B2,TRUE,FALSE)必要があります。Trueを返す必要があります 。常にすべてのテストを記述し、Excelが行うとは思わないでください。数式では 常に、B2をテストしないことを覚えておいてください。=IF(B2="",TRUE,FALSE)
=AND(IF(B2,TRUE,FALSE),TRUE)=AND(IF(B2="",TRUE,FALSE),TRUE)

Logical Test
IF関数の使い方
Excel AND関数

関連情報