TL; DR -Excelがセルの内容を内部的に保存および交換する方法の成果物です。空のセルは値のないVARIANTであり、プログラミング言語がゼロおよびゼロ以外の値の真偽をどのように扱うかにより、FALSEに変換されます。
挙動AND()
(及び他の論理関数の全て)を、ブール値に両方の引数を変換論理実行することでand
それらの操作を。カバーをはがして、Visual Basic Editorのオブジェクトブラウザーを使用して、Excelオブジェクトモデルでどのように定義されているかを確認できます。
a Boolean
ではなく aを返すことに注意してくださいVariant
。これは、関数を評価するプロセスのある時点で、すべての引数をBoolean
s に変換する必要があることを意味します。実際に観察された動作は、これが処理の早い段階で行われたことを示しています。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
関数がそれをaに変換するとBoolean
どうなりますか?良い質問!プログラミング言語が通常ゼロを扱う方法と同様に、たまたまFalseです。
Sub DemoMacro2()
MsgBox CBool(vbEmpty)
End Sub
引数を完全に省略すると、同じ動作を確認できます。
=AND(,)
...と同じことです...
=AND({vbEmpty},{vbEmpty})
...これは同じです...
=AND(0,0)
...これは:
=AND(FALSE,FALSE)