Instr条件不适用于2个或更多条件

时间:2011-11-07 21:19:50

标签: excel vba excel-vba

我在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中?

4 个答案:

答案 0 :(得分:10)

其他答案指出了最重要的事情,即InStr实际上返回另一个字符串的数字位置(如果找不到所需的字符串,则返回0) 。正如他们所说,您应该在<result> > 0语句中测试条件 If。我只会说明你的观察背后的原因是你的测试“不起作用(所有时间)”。这是一个很好的机会,可以陶醉在一些古老的I-&lt; 3-BASIC中。“

正在发生的是,在这种情况下 (请参阅底部的编辑了解更多信息)VBA的And运算符(和Or等)实际上是< em>按位运算符,而不是逻辑运算符。也就是说,如果你传递两个整数操作数,它将逐位And,并返回结果整数。例如,42 And 99评估为34,因为(二进制)0101010 And 11000110100010

现在,通常情况下,如果使用VBA Boolean值,And就像逻辑运算符一样工作。这是因为在VBA中,常量True等于数字-1False等于数字零。因为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