Function Foo(thiscell As Range) As Boolean
Foo = thiscell.hasFormula And (InStr(1, UCase(Split(thiscell.formula, Chr(40))(0)), "bar") > 0)
End Function
该功能之前(当第一个参数为假时,VBA“和”运算符是否会评估第二个参数?
我在使用是麻烦时,传递到该函数的单元是空的壳体存在,以测试特定子串的存在(栏,在这种情况下) ,thisCell.hasFormula是错误的,但是在和之后的语句仍然被评估,这给我一个下标超出了运行时的范围错误
是否VBA实际上继续评估第二个参数和,首先是假的?
请注意,VBA的'And'运算符不会短路,因为它是*位运算符而不是*逻辑*运算符。请参阅:http://stackoverflow.com/questions/8042744/excel-vba-instr-condition-doesnt-work-with-2-or-more-conditions/8047021#8047021 – jtolle
@jtolle不正确 - 它将返回一个布尔值如果它的参数是布尔值,那么它支持按位和逻辑运算。 (当然,你可能会认为逻辑是一种使用1位整数的特殊情况,但重点是如果他们选择微软可能会支持短路) –
@Hugh,有趣。我一直假设'And'只是一个按位运算符,尽管模拟逻辑运算是因为'True = -1'和'False = 0'。但是你是对的,如果传递给它的表达式都是布尔型的,则'*'是一个逻辑运算符。如果一个或两个操作数都是数字,它只是按位进行的。但我想它不能短路,因为无论如何都必须对两个表达式进行评估,以确保其中一个或两个不是数字而不是布尔值。所以我认为“比特级”仍然会导致这里没有短路。 – jtolle