AND 函数对空的、空白的单元格给出 TRUE 结果 - 为什么?

AND 函数对空的、空白的单元格给出 TRUE 结果 - 为什么?

我有空白的 B2 单元格。

=ISBLANK(B2)给出 TRUE

对其进行简单的逻辑测试将返回 FALSE

=IF(B2,TRUE,FALSE)给出 FALSE

然而,当直接在 AND 语句中使用时,它返回 TRUE

=AND(B2,TRUE)给出 TRUE

当然,当间接用于 AND 语句时,它仍然返回 FALSE

=AND(如果(B2,TRUE,FALSE),TRUE)给出 FALSE

你能解释一下为什么我的 Excel 会出现这种情况吗?

答案1

摘自这里,查找标题为Excel 逻辑函数 - 事实和数据

在 Excel 中使用逻辑函数(AND、XOR、NOT、OR)时,如果任何参数包含文本值或空单元格,这些值将被忽略。

答案2

总结- 这是 Excel 内部存储和交换单元格内容的产物。空单元格是没有值的 VARIANT,由于编程语言处理零值和非零值的真实性的方式,它会转换为 FALSE。

AND()(以及所有其他逻辑函数)的行为是将两个参数转换为布尔值,然后and对它们执行逻辑运算。您可以揭开面纱,使用 Visual Basic 编辑器的对象浏览器查看它在 Excel 对象模型中的定义方式:

对象浏览器中的“与”

请注意,它返回一个Boolean不是Variant意味着在评估函数的过程中,所有参数都必须转换Boolean实际观察到的行为表明,这是在处理早期完成的 - 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 对象模型很有启发性:

对象浏览器中的单元格值

请注意,这是一个 COMVARIANT 结构。此结构基本上包含 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!

修正内容如下:

如果一个或多个参数是字符串文字中的文本,而不是单元格引用中的文本,则结果为#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)并且第二个逻辑为 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 函数

相关内容