我编写了一个if语句,如下所示:
你可以在这里看到我在这个语句中悬停了所有三个值,所有这些值都应该等于True值,因此if语句中的内容应该运行。但是,由于某些原因,当我执行此语句时,它会直接跳到代码的End If
部分。
有人知道为什么只是看着这个吗?
答案 0 :(得分:5)
在VB中,And
和Or
运算符是按位的,不是逻辑运算符。它们对数字操作数执行按位运算,最后只能在逻辑上下文中考虑位操作的结果。
在您的示例中,您有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 Then
或And
来搞乱结果。
如果您确实在条件中使用它们,则应始终使用显式比较。然后,按位运算符将具有操作的布尔操作数,在这种情况下,它们的工作结果将与它们是逻辑运算符相同。
真正的逻辑运算符AndAlso
和OrElse
仅在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
,只需用明确指定的比较重写行就可以轻松纠正,因此信息通常适用于社区。 p>
有关类型转化的说明
顺便说一下,与其他语言不同,在VBA中,False
转换为0,True
不转换为0,但转换为 255 (2s补码为-1,全1)。请注意。
编辑:纠正了位混淆