Vba 如果';和';和';或';声明

Vba 如果';和';和';或';声明,vba,if-statement,Vba,If Statement,我的代码如下: If (InStr(1, "ALL", Itype) Or InStr(1, Uvar.Device, Itype) _ And (InStr(1, "ALL", Isec) Or InStr(1, Uvar.Sec, Isec)) _ And (InStr(1, "ALL", Idev) Or InStr(1, Uvar.Model, Idev)) Then Useline = "TRUE" 对此进行一点扩展: Itype是一个长字符串,例如- Itype=All、苹果、

我的代码如下:

If (InStr(1, "ALL", Itype) Or InStr(1, Uvar.Device, Itype)  _
And (InStr(1, "ALL", Isec) Or InStr(1, Uvar.Sec, Isec)) _
And (InStr(1, "ALL", Idev) Or InStr(1, Uvar.Model, Idev)) Then Useline = "TRUE"
对此进行一点扩展:

Itype是一个长字符串,例如-

  • Itype=All、苹果、梨、橘子
  • Isec=狗、猫、鸭
  • Idev=树、花、植物
每个UVar.x都是一个单词,例如-

  • UVar.Device=Apple
  • UVar.Sec=Cat
  • UVar.Model=tree
因此,如果Itype包含字符串“All”,或者它包含UVar.Device的值 Isec还包含字符串“All”或UVar.Sec的值 IDev还包含字符串“All”或UVar.Model的值

然后我想让
if语句=true

无论使用什么值,只要至少有一个值标准集匹配,我上面的代码似乎都会返回true

因此,字符串IType、Idev和Isec是否都包含值“all”或特定的用户定义值

(更新:修复顺序并返回真布尔变量)

InStr
返回一个位置,不是真或假。因此,您可以将这两个测试添加到一起以测试>0,因为这两个成对条件中至少有一个是真的。然后测试所有3对,即

Dim bVar As Boolean
bVar = (InStr(Itype, "ALL") + InStr(Itype, Uvar.Device)) > 0 _
       And (InStr(Isec, "ALL") + InStr(Isec, Uvar.Sec)) > 0 _
       And (InStr(Idev, "ALL") + InStr(Idev, Uvar.Model)) > 0
(更新:修复顺序并返回真布尔变量)

InStr
返回一个位置,不是真或假。因此,您可以将这两个测试添加到一起以测试>0,因为这两个成对条件中至少有一个是真的。然后测试所有3对,即

Dim bVar As Boolean
bVar = (InStr(Itype, "ALL") + InStr(Itype, Uvar.Device)) > 0 _
       And (InStr(Isec, "ALL") + InStr(Isec, Uvar.Sec)) > 0 _
       And (InStr(Idev, "ALL") + InStr(Idev, Uvar.Model)) > 0

首先,您的代码无法编译—您要么删除IF后面的左括号,要么添加匹配的右括号

但更重要的是,Instr()参数的顺序混淆了。第一个是要查找的字符串,第二个是要查找的字符串。这应该可以解决问题


PS:虽然Brettdj的答案是正确的,但VBA会将位置0解释为错误,而将其他任何位置解释为正确,因此这不一定是问题所在

首先,您的代码无法编译—您要么删除IF后面的左括号,要么添加匹配的右括号

但更重要的是,Instr()参数的顺序混淆了。第一个是要查找的字符串,第二个是要查找的字符串。这应该可以解决问题


PS:虽然Brettdj的答案是正确的,但VBA会将位置0解释为错误,而将其他任何位置解释为正确,因此这不一定是问题所在

对了,我的实际代码中有一个额外的括号,一定是在复制过程中删除的。我想我可能把gt和=Find sheet函数混淆了,这是要查找的字符串,后面是要查找的字符串。为这些想法干杯我会查一查是的,就是这个!当它运行时,我假设它是我的“如果”、“和”和“或”在错误的位置,但将其全部交换是完美的。善意的问候和许多感谢是真的,VBA将解释任何非零值为真。然而,在国际海事组织看来,这种做法与其说是良好的编码实践,不如说是一种黑客行为。将位置与0的值进行比较对我们人类来说更容易理解。我想这是关于语法和语义的讨论。@Bobort:我完全同意-我也希望看到显式检查,但没有显式检查它确实有效。在数字上使用VBA的“逻辑”运算符是自找麻烦的。请看你的右边,我的实际代码中有一个额外的括号,它一定是在复制过程中丢失的。我想我可能把gt和=Find sheet函数混淆了,这是要查找的字符串,后面是要查找的字符串。为这些想法干杯我会查一查是的,就是这个!当它运行时,我假设它是我的“如果”、“和”和“或”在错误的位置,但将其全部交换是完美的。善意的问候和许多感谢是真的,VBA将解释任何非零值为真。然而,在国际海事组织看来,这种做法与其说是良好的编码实践,不如说是一种黑客行为。将位置与0的值进行比较对我们人类来说更容易理解。我想这是关于语法和语义的讨论。@Bobort:我完全同意-我也希望看到显式检查,但没有显式检查它确实有效。在数字上使用VBA的“逻辑”运算符是自找麻烦的。看见