Instr条件不适用于2个或更多条件
我在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 instr(str_Text,"/10'") > 0 AND instr(str_text,"/20'") > 0 then
Tim所说的是,instr函数返回被searchstring的第一个实例的string中的位置。
所以在你的例子中:13返回instr(str_Text,“/ 10”)。
当VBA读取你的版本instr(str_text,“/ 10;”)(没有> 0),那么它看到结果不是1(意思是真的),所以它总是碰到else)
其他的答案指出了最重要的事情,即InStr
实际上返回一个string在另一个string的数字位置 (或0,如果没有find所需的string)。 正如他们所说的,你应该在你的If
语句中testing<result> > 0
的条件 。 我只想说明你的观察背后的原因是什么,你的testing“不工作( 所有的时间 )”。 这是一个很好的机会,陶醉在一些古老的我<3基本的迷人。
发生了什么事情, 在这种情况下 (见底部的更多编辑)VBA的And
运算符(和Or
等)实际上是一个按位运算符,而不是逻辑 运算符。 也就是说,如果你传递了两个整数操作数,它将逐位执行,然后返回结果整数。 例如42 And 99
评估为34
,因为(二进制) 0101010 And 1100011
是0100010
。
现在,通常情况下,如果你使用VBA Boolean
值, And
像逻辑运算符一样工作。 这是因为在VBA中,常量True
等于数字-1
,而False
等于数字零。 因为VBA表示所有位设置为-1
的二进制数,清零所有位为二进制数,所以可以看到二进制操作等同于逻辑操作。 -1 And <something>
总是等于相同的<something>
。 但是,如果你只是传递任何旧的数字,你会得到一个数字,并不总是一个数字值等于常量True
或False
。
考虑一个简单的例子(在立即窗口键入):
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的If
语句将任何非零数字参数视为与True
相同,并将零数字参数视为与False
相同。 当你把所有这一切放在一起,你会发现你的例子forms的声明:
IF INSTR(STR_TEXT,"/10'") AND INSTR(STR_TEXT,"/20'") THEN
有时会select第一个条件,有时候会select第二个条件,具体取决于searchstring中的内容。 这是因为有时按位And
操作将返回零,有时它会返回非零。 确切的结果将取决于find的string的确切位置,这显然不是你所期望的。 所以这就是为什么你已经得到的build议在细节上的事情。
编辑:正如休·艾伦在这个评论中指出的那样:
VBA“和”运算符是否在第一个参数为假时评估第二个参数?
VBA的And
运算符实际上返回Boolean
值,它的两个操作数都是Boolean
。 所以说这是一个按位运算符不是严格正确的。 但是这个问题是正确的。 此外,它可以作为一个按位运算符的事实,意味着它不能像一个“正常的”,纯粹的逻辑运算符。 例如,因为它必须评估两个操作数以确定它们是否是数字,所以它不能短路。
Instr()返回一个数字结果:如果它> 0,那么被testing的string包含被search的string。
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
INSTR
函数将返回您想要在string
查找的sub-string
的索引。
所以下面将给出一个数值而不是一个boolean value
:
INSTR(STR_TEXT,"/10'")
要解决这个问题,可以使用下面的代码来给出if条件所要求的boolean
答案:
INSTR(STR_TEXT,"/10'") > 0