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 11000110100010

现在,通常情况下,如果你使用VBA Boolean值, And像逻辑运算符一样工作。 这是因为在VBA中,常量True等于数字-1 ,而False等于数字零。 因为VBA表示所有位设置为-1的二进制数,清零所有位为二进制数,所以可以看到二进制操作等同于逻辑操作。 -1 And <something>总是等于相同的<something> 。 但是,如果你只是传递任何旧的数字,你会得到一个数字,并不总是一个数字值等于常量TrueFalse

考虑一个简单的例子(在立即窗口键入):

 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