Instr condition doesn't work with 2 or more conditions
我在Excel VBA中具有以下INSTR条件,该条件一直都不起作用
1 2 3 4 5 6 7 | 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。
以下内容确实有效:
1 2 3 4 5 6 7 8 9 | 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中?
其他答案指出了最重要的一点,即
发生的事情是,在这种情况下(有关更多信息,请参见底部的编辑),VBA的
现在,通常,如果您使用VBA
考虑一个简单的示例(在立即窗口中键入):
1 2 3 4 5 6 7 8 9 10 11 | 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 |
现在回想一下,VBA的
1 | IF INSTR(STR_TEXT,"/10'") AND INSTR(STR_TEXT,"/20'") THEN |
有时会选择第一个条件,有时会选择第二个条件,具体取决于搜索字符串中的内容。这是因为有时按位
编辑:正如休·艾伦(Hugh Allen)在此评论中指出的:
当第一个为false时,VBA"和"运算符是否会评估第二个参数?
VBA的
示例:
1 | 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;")(不带> 0)时,它会看到结果不是1(这表示是真的),因此总是命中else。
strike>
Instr()返回一个数字结果:如果它是> 0,则测试的字符串包含正在搜索的字符串。
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 |
因此,以下内容将提供数值而不是
1 | INSTR(STR_TEXT,"/10'") |
要解决此问题,请使用以下命令将给出if条件所要求的
1 | INSTR(STR_TEXT,"/10'") > 0 |