【问题标题】:IF 'AND' and 'OR' StatementsIF 'AND' 和 'OR' 语句
【发布时间】:2011-11-29 11:15:58
【问题描述】:

我的代码如下:

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, Apple, Pear, Orange
  • Isec = dog, cat, duck
  • Idev = tree, flower, plant

每个 UVar.x 都是一个单词,例如-

  • UVar.Device = Apple
  • UVar.Sec = Cat
  • UVar.Model = tree

所以,如果 Itype 包含字符串“All”或者它包含 UVar.Device 的值 并且 Isec 还包含字符串“All”或者它包含 UVar.Sec 的值 并且 IDev 还包含字符串“All”或者它包含 UVar.Model 的值

那么我想要if statement = true

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

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

【问题讨论】:

    标签: vba if-statement


    【解决方案1】:

    嗯,一方面,您的代码无法编译 - 您要么必须删除 IF 之后的左括号,要么添加匹配的右括号。

    不过,更重要的是,您将 Instr() 参数的顺序搞混了。首先是要查找的字符串IN,其次是要查找的字符串FOR。应该可以解决的。

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

    【讨论】:

    • 反对你的权利,我的代码中有多余的括号一定是在复制过程中删除了它。我想我可能对 =Find 工作表函数感到困惑,这是要查找的字符串,然后是要查找的字符串。为这些想法干杯,我会检查一下
    • 是的,就是那个!因为它正在运行,我假设它是我的“如果”、“与”和“或”在错误的位置,但将它全部交换完美。亲切的问候和非常感谢
    • 确实,VBA 会将任何非零值解释为真。但是,imo,这种做法更像是一种黑客行为,而不是良好的编码实践。将位置与 0 的值进行比较对于我们人类来说更容易理解。我想这是对语法与语义的讨论。
    • @Bobort:我完全同意 - 我也希望看到明确的检查,但没有它也可以。
    • 对数字使用 VBA 的“逻辑”运算符是自找麻烦。见stackoverflow.com/a/8047021/58845
    【解决方案2】:

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

    InStr 返回一个位置,而不是 True 或 False。因此,您可以将两个测试加在一起以测试 >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
    

    【讨论】:

      猜你喜欢
      • 2010-12-20
      • 2012-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      相关资源
      最近更新 更多