VBA中boolean if语句的奇怪行为

时间:2014-07-10 19:41:59

标签: vba if-statement boolean

我编写了一个if语句,如下所示:

enter image description here

你可以在这里看到我在这个语句中悬停了所有三个值,所有这些值都应该等于True值,因此if语句中的内容应该运行。但是,由于某些原因,当我执行此语句时,它会直接跳到代码的End If部分。

有人知道为什么只是看着这个吗?

2 个答案:

答案 0 :(得分:5)

在VB中,AndOr运算符是按位的,不是逻辑运算符。它们对数字操作数执行按位运算,最后只能在逻辑上下文中考虑位操作的结果。

在您的示例中,您有True AND 13 AND 18-1 AND 13 AND 18(在VB True中等于-1),这会产生0,因为数字{ {1}}和13没有任何公共位。在逻辑上下文中,零最终被隐含地理解为18

通常情况下,当您编写False而不是If Len(str) Then之类的内容时,您就会侥幸成功 - 因为没有If Len(str) > 0 ThenAnd来搞乱结果。
如果您确实在条件中使用它们,则应始终使用显式比较。然后,按位运算符将具有操作的布尔操作数,在这种情况下,它们的工作结果将与它们是逻辑运算符相同。
真正的逻辑运算符AndAlsoOrElse仅在VB.NET中引入。如果您可以将Or替换为And s,则条件将评估为AndAlso(使用Option Strict Off,因为使用Option Strict On编译器会使您使用显式比较)。

请注意,True与此无关。在VB中,在逻辑上下文中有Null是可以接受的:Null是一个有效的构造。在这种情况下,If Null Then ... Else...的评估结果为Null

答案 1 :(得分:0)

您需要将其重写为

If InStr(...) > 0 Then
 '....
 ' I will run smoothly
 '
End If

而不是简单

If InStr(...) Then
' .... 
'  I will cause problems when run
'
End If

VBA无法正确解释我写的第二个样本。应明确说明比较结构。

有关NULL的说明 如果任一字符串输入为Null,则InStr返回NULL。因此,如果最好把它放在函数包装器中,它返回一个布尔值并在内部执行所有验证,以避免任何令人讨厌的运行时意外。

参考:http://office.microsoft.com/en-us/access-help/instr-function-HA001228857.aspx

这并不意味着它必然会引发问题,但它是需要考虑的事情之一。

在这个特定的问题中,问题不是null,只需用明确指定的比较重写行就可以轻松纠正,因此信息通常适用于社区。

有关类型转化的说明 顺便说一下,与其他语言不同,在VBA中,False转换为0,True不转换为0,但转换为 255 (2s补码为-1,全1)。请注意。

编辑:纠正了位混淆