我有空白的 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 函数