AND函数可为空白的空白单元格提供TRUE结果-为什么?


31

我的B2单元格空白。

= ISBLANK(B2)给出TRUE

一个简单的逻辑测试返回FALSE

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

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

= AND(B2,TRUE)得出TRUE

当然,当在AND语句中间接使用时,它仍然返回FALSE

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

您能解释一下为什么我的Excel以这种方式运行吗?

Answers:


41

此处提取,查找标题为Excel逻辑函数的部分-事实和数据

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


2
很高兴知道!!
加里的学生

2
也许您可以添加覆盖表达式的规则IF(B2,TRUE,FALSE)?此外,我希望返回逻辑上正确(但有点反直觉)的合取和结果空集的析取,即AND(B2)OR(B2)错误时为true,但实验表明它们返回错误。
PJTraill '16

2
如果任何(但不是全部)参数包含文本值或空单元格,则将忽略这些值。但是,如果ALL参数包含文本值或空单元格,该函数将返回#VALUE !!
ThunderFrame

好答案。@ThunderFrame的评论也至关重要。
Raystafarian '16

还有一个警告。作为单元格引用传递的文本与作为字符串文字传递的文本不同。请参阅我的答案以获取详细信息。
ThunderFrame

6

TL; DR-这是Excel内部如何存储和交换单元格内容的人工产物。空单元格是没有值的VARIANT,由于编程语言如何处理零值和非零值的真实性,因此它会转换为FALSE。

的行为AND()(和所有其他的逻辑功能)是两个自变量转换成布尔,然后执行逻辑and对它们的操作。您可以剥开封面,并使用Visual Basic编辑器的对象浏览器查看它在Excel对象模型中的定义:

对象浏览器中的AND

请注意,它返回一个Boolean不是一个Variant。这意味着在函数评估过程中的某些时候,所有参数都必须转换为Booleans。实际观察到的行为表明,这是在处理的早期完成的-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)

1
但是OP报告将空单元格参数视为True,而不是(如您所说)False。
nekomatic

@nekomatic-我错过了那部分。编辑即将到来。
Comintern

如果A1包含:TRUE,并且B1包含以撇号:开头的文本'FALSE,则=AND(A1,B1)返回TRUE。姆哈哈哈哈。
ThunderFrame

在这种情况下,这不是正确的答案,但是对函数求值给出了很好的一般解释。将此评论视为+1。
mtone

@ThunderFrame:你有什么意思?如果A1包含TRUE,而B1包含任何文本值(包括空字符串),则=AND(A1,B1)返回TRUE
斯科特

2

根据我对@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!


0

=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函数


8
我认为您错过了运营点。= ISBLANK(B2)只是为了证明单元格B2为空白。= AND(B2,TRUE)用于测试单元格B2的布尔值。那么,只有单元格B2的值为TRUE时,此方法才为TRUE。然后,这与以下测试矛盾,= IF(B2,TRUE,FALSE)返回FALSE。这是一个很棒的问题,因为我不知道Excel会忽略某些单元格值,而不是将它们评估为布尔值(TRUE或FALSE)。
linhartr22 '16

6
为什么要反对?AND(B2,TRUE)绝对不应该AND(B2="",TRUE)在问题的范围内。
德米特里·格里戈里耶夫
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.