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

pul*_*424 31 worksheet-function microsoft-excel microsoft-excel-2013

我有空白的 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 会这样吗?

jcb*_*rmu 41

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

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

  • *如果任何**但不是全部**的参数包含文本值或空单元格,则此类值将被忽略。*但如果所有参数包含文本值或空单元格,则函数返回#VALUE! (3认同)
  • 很高兴知道这一点!! (2认同)
  • 也许您可以添加覆盖表达式“IF(B2,TRUE,FALSE)”的规则?另外,我希望返回结果空集的逻辑上正确(但有点违反直觉)的合取和析取,即“AND(B2)”为真,而“OR(B2)”为假,但实验表明他们返回一个错误。 (2认同)

小智 6

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

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

AND 在对象浏览器中

请注意,它返回 a Boolean而不是a Variant。这意味着在评估函数过程中的某个时刻,所有参数都必须转换为Booleans。实际观察到的行为表明这是在处理的早期完成的 - Excel 通过尝试转换所有参数并在计算中使用转换后的值(如果成功)来尝试对用户友好。这可以通过将String值“True”和“False”传递给函数来证明:

=AND("true","true") <---Results in TRUE
=AND("false","true") <---Results in FALSE
Etc.
Run Code Online (Sandbox Code Playgroud)

它也可以用数字参数来证明——它将任何非零值视为真,零视为假:

=AND(42,-42) <---Results in TRUE
=AND(0,0) <---Results in FALSE
=AND(42,0) <---Results in FALSE
Etc.
Run Code Online (Sandbox Code Playgroud)

它在组合中具有相同的行为:

=AND("false",0) <---Results in FALSE
Etc.
Run Code Online (Sandbox Code Playgroud)

现在你应该得到这张照片。那么这与测试空白单元格有什么关系呢?答案在于 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
Run Code Online (Sandbox Code Playgroud)

那么当AND函数将其转换为 a时会发生什么Boolean?好问题!它恰好是 False,类似于编程语言通常对待零的方式:

Sub DemoMacro2()
    MsgBox CBool(vbEmpty)
End Sub
Run Code Online (Sandbox Code Playgroud)

您可以通过完全省略参数来看到相同的行为:

=AND(,)
Run Code Online (Sandbox Code Playgroud)

……和……一样

=AND({vbEmpty},{vbEmpty})
Run Code Online (Sandbox Code Playgroud)

……和……一样

=AND(0,0)
Run Code Online (Sandbox Code Playgroud)

...这是:

=AND(FALSE,FALSE)
Run Code Online (Sandbox Code Playgroud)