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)时,如果任何参数包含文本值或空单元格,这些值将被忽略。
小智 6
TL;DR - 它是 Excel 如何在内部存储和交换单元格内容的产物。空单元格是一个没有值的 VARIANT,由于编程语言如何处理零值和非零值的真实性,它会转换为 FALSE。
的行为AND()(和所有其他的逻辑功能)是两个自变量转换成布尔,然后执行逻辑and对它们的操作。您可以揭开封面,看看它是如何使用 Visual Basic 编辑器的对象浏览器在 Excel 对象模型中定义的:
请注意,它返回 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)
| 归档时间: |
|
| 查看次数: |
3918 次 |
| 最近记录: |