Answers:
从此处提取,查找标题为Excel逻辑函数的部分-事实和数据:
在Excel中,当您使用逻辑函数(AND,XOR,NOT,OR)时,如果任何参数包含文本值或空单元格,则将忽略这些值。
IF(B2,TRUE,FALSE)
?此外,我希望返回逻辑上正确(但有点反直觉)的合取和结果空集的析取,即AND(B2)
当OR(B2)
错误时为true,但实验表明它们返回错误。
TL; DR-这是Excel内部如何存储和交换单元格内容的人工产物。空单元格是没有值的VARIANT,由于编程语言如何处理零值和非零值的真实性,因此它会转换为FALSE。
的行为AND()
(和所有其他的逻辑功能)是两个自变量转换成布尔,然后执行逻辑and
对它们的操作。您可以剥开封面,并使用Visual Basic编辑器的对象浏览器查看它在Excel对象模型中的定义:
请注意,它返回一个Boolean
,不是一个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结构。该结构基本上包含两部分-一个类型(用于告诉使用它的代码如何解释它)和一个数据区域。Excel中不包含任何内容的单元格将具有一个“值”,该值由Variant
带有子类型的a表示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)
TRUE
,并且B1包含以撇号:开头的文本'FALSE
,则=AND(A1,B1)
返回TRUE。姆哈哈哈哈。
TRUE
,而B1包含任何文本值(包括空字符串),则=AND(A1,B1)
返回TRUE
。
根据我对@jcbermu的答案的评论,并做了一些小的更正:
如果有,但不是所有的参数包含文本
值的单元格值或空白单元格,这些值将被忽略。但是,如果ALL参数在单元格值或空单元格中包含文本值,则该函数将返回#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!
=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函数
AND(B2,TRUE)
绝对不应该AND(B2="",TRUE)
在问题的范围内。