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のオブジェクトモデルでどのように定義されているかを見てみましょう
この関数はVariant
ではなくBoolean
を返すことに注意してください。これは、関数を評価する過程のある時点で、すべての引数をBoolean
sに変換しなければならないことを意味します。実際に観測された動作は、これが処理の初期段階で行われていることを示しています – 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のオブジェクトモデルは非常に参考になります
これは、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行目を見てください
しかし、それは奇妙なことになる
引数のいずれかがエラーの場合、
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