2011-11-29 28 views
0

我的代碼如下:IF 'AND' 和 'OR' 語句

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包含字符串 「全部」 或它包含UVar.Device 的價值和ISEC還包含字符串「所有「或者它包含UVar.Sec的值,並且IDev還包含字符串」All「或者它包含UVar.Model的值

然後我想要有if statement = true

上面的代碼似乎只要至少有一個值標準集合匹配就會返回真值。

因此,字符串IType,Idev和Isec都包含值「all」還是特定的用戶定義值?

回答

2

那麼,對於一件事,你的代碼無法編譯 - 你要麼有IF後刪除左括號或添加匹配的右括號。

但更重要的是,您已經將Instr()參數的順序混淆了。首先是字符串看,IN,第二是字符串看FOR。這應該解決它。 PS:雖然Brettdj的回答是正確的,但VBA會將位置0解釋爲false,而其他任何解釋爲true,所以這不一定是問題。

+0

opps你的權利,我在我的實際代碼中的額外括號必須在複製過程中將其刪除。我想我可能有GT = Find查找工作表函數混淆,這是字符串查找後跟字符串查看。歡呼的想法,我會檢查出來 – DevilWAH

+0

是的,那是一個!它正在運行的Casue我假設它是我的「如果」,「And's」和「Or's」在錯誤的地方,但全面交換它的作品是完美的。親切的問候和非常感謝 – DevilWAH

+2

VBA確實將任何非零值解釋爲真實。然而,imo,這種做法比好的編碼做法更加黑客。比較位置和0的值對我們人類來說更容易理解。我想這是對語法和語義的討論。 – Bobort

1

(更新:要解決的訂單,並返回一個True布爾變量)

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