我在Excel VBA中有以下INSTR条件,它始终不起作用
STR_TEXT="SKU1234 $100/10' $200/20'" ' < example string
IF INSTR(STR_TEXT,"/10'") AND INSTR(STR_TEXT,"/20'") THEN
' code
ELSE
' code
END IF
由于某些不明原因,它似乎无法检查这两个条件,因此第一个IF,即使两个条件匹配,似乎也不起作用并且转到ELSE。
以下工作正常:
STR_TEXT="SKU1234 $100/10' $200/20'" ' < example string
IF INSTR(STR_TEXT,"/10'") THEN
IF INSTR(STR_TEXT,"/20'") THEN
' code
END IF
ELSE
' code
END IF
如您所见,如果我将第一个IF上的条件分开,它就可以了。 但我希望在相同的IF中同时具备这两个条件,因为代码是“更清洁”的。
任何人都知道为什么和/或如何修复它而不必将IF放在另一个IF中?
答案 0 :(得分:10)
其他答案指出了最重要的事情,即InStr
实际上返回另一个字符串的数字位置(如果找不到所需的字符串,则返回0) 。正如他们所说,您应该在<result> > 0
语句中测试条件 If
。我只会说明你的观察背后的原因是你的测试“不起作用(所有时间)”。这是一个很好的机会,可以陶醉在一些古老的I-&lt; 3-BASIC中。“
正在发生的是,在这种情况下 (请参阅底部的编辑了解更多信息)VBA的And
运算符(和Or
等)实际上是< em>按位运算符,而不是逻辑运算符。也就是说,如果你传递两个整数操作数,它将逐位And
,并返回结果整数。例如,42 And 99
评估为34
,因为(二进制)0101010 And 1100011
为0100010
。
现在,通常情况下,如果使用VBA Boolean
值,And
就像逻辑运算符一样工作。这是因为在VBA中,常量True
等于数字-1
,False
等于数字零。因为VBA将-1
表示为所有位都设置的二进制数,并将零作为二进制数并且所有位都清零,您可以看到二进制运算变得等同于逻辑运算。 -1 And <something>
总是等于<something>
。但是,如果您只是将任何旧数字传递给And
,那么您将获得一个数字,并且它不会总是一个等于常量True
或{{的数值。 1}}。
考虑一个简单的例子(在立即窗口中输入):
False
现在回想一下,VBA的x="abc"
?Instr(x,"a")
1
?Instr(x,"b")
2
?Instr(x,"c")
3
?(Instr(x,"a") and Instr(x, "b"))
0
?(Instr(x,"a") and Instr(x, "c"))
1
语句将任何非零数字参数视为与If
相同,并将零数字参数视为与True
相同。当你把所有这些放在一起时,你会发现你的例子形式的陈述:
False
有时会选择第一个条件,有时会选择第二个条件,具体取决于搜索字符串中的内容。这是因为有时按位IF INSTR(STR_TEXT,"/10'") AND INSTR(STR_TEXT,"/20'") THEN
操作将返回零,有时它将返回非零。确切的结果将取决于找到的字符串的确切位置,这显然不是您所期望的。所以那是为什么你已经得到的建议在细节中很重要。
Does the VBA "And" operator evaluate the second argument when the first is false?
VBA的And
运算符确实返回And
两个值为Boolean
的操作数。所以说它是一个按位运算符并不严格正确。但这对于这个问题是正确的。此外,它可以充当按位运算符的事实意味着它不能像“正常”,纯粹逻辑的运算符那样行事。例如,因为它必须评估两个操作数以确定它们是否为数字,所以它不能短路。
答案 1 :(得分:4)
EXMAPLE:
if instr(str_Text,"/10'") > 0 AND instr(str_text,"/20'") > 0 then
Tim说的是instr函数返回被搜索字符串的第一个实例的字符串中的位置。
所以在你的例子中:为instr(str_Text,“/ 10')返回了13。
当VBA读取你的版本instr(str_text,“/ 10;”)(没有&gt; 0)时,它会看到结果不是1(这意味着是真的)所以它总是命中其他的)
击>
答案 2 :(得分:1)
Instr()返回一个数值结果:如果它是&gt; 0则测试的字符串包含要搜索的字符串。
Sub Test()
Dim str_text As String
str_text = "SKU1234 $100/10' $200/20'" ' < example string
If InStr(str_text, "/10'") > 0 And InStr(str_text, "/20'") > 0 Then
MsgBox "Both"
Else
MsgBox "Only one, or none"
End If
End Sub
答案 3 :(得分:0)
INSTR
函数将返回您要在sub-string
中找到的string
的索引。
因此,以下内容将提供数值而不是boolean value
:
INSTR(STR_TEXT,"/10'")
要解决此问题,请使用以下内容,该答案将提供if条件所需的boolean
答案:
INSTR(STR_TEXT,"/10'") > 0