2014-03-24 117 views
1

我有一個If聲明,我假設是將每個值相互比較。然而,無論這些值是什麼(例如,所有的值都包含4),它都會轉到else。我在If聲明中錯過了什麼嗎?比較邏輯

If rst![CountOfProvider] = rst![CountOfDelivery Type] = rst![CountOfBU Creator] = rst![CountOfOrigin] = rst![CountOfSub-Destination] = rst![CountOfDestination Zipcode] = rst![CountOfCity] = rst![CountOfState] = rst![CountOfCost Zone] = rst![CountOfRate] = rst![CountOfMarket Name] Then 
     chk = False 
    Else 
     chk = True 
    End If 
+2

使用' AND':'如果rst![CountOfProvider] = rst![CountOfDelivery類型] AND rst![CountOfProvider] = rst![CountOfBU Creator] .. –

+0

沒有更清潔更簡單的方法嗎?建議我需要測試每一個給我一個巨大的if語句的每一個。 – KSM

回答

2

VBA不會執行您所期望的那種比較順序。

從即時窗口考慮這個簡單的例子...

Debug.Print 2 = 2 
True 
Debug.Print 2 = 2 = 2 
False 

我不確定VBA如何處理這些多個相等比較,但懷疑它可能被測試,然後再從比較的結果與下...有點像這樣...

Debug.Print (2 = 2) = 2 
False 

第一個比較返回True,這是整數-1 ...

​​

因此,這意味着最終的比較就相當於這個...

Debug.Print -1 = 2 

自然是返回False。

+1

所以'4 = 4 = -1'是真的;-) –

+0

是的,VBA認爲是。 :-) – HansUp

2

計算最快的方法是對比較進行硬編碼。可擴展的方法是通過循環測試。

HansUp成爲一名優秀的評論 - 你應該警惕潛在的空值,並添加一個處理程序來對付他們根據需要(例如,在任何主機環境中使用在Access Nz()IsNull()

'Method 1 
    If rst![CountOfProvider] = rst![CountOfDelivery Type] And _ 
     rst![CountOfProvider] = rst![CountOfBU Creator] And _ 
     ...etc...Then 
     chk = False 
    Else 
     chk = True 
    End If 

'Method 2 
    chk = True 
    For Each ele In Array(rst![CountOfDelivery Type], rst![CountOfBU Creator],...your others...) 
     If ele <> rst![CountOfProvider] Then 
      chk = False 
      Exit For 
     End If 
    Next ele 
+0

我不需要多個循環來檢查rst![CountOfDelivery類型],然後與數組的其他元素? – KSM

+0

@KSM爲什麼?平等是平等的。它是可交換的,所以秩序無關緊要,如果提供者的數量等於所有這些數量,那麼其他任何數量都將與其他數量相等。例如'a = b和b = c'與'a = b和a = c'不同(即具有相同的真值表)。希望這是有道理的。 –

+1

@KSM請注意,如果您的記錄集字段可以包含Null,因爲Null永遠不會等於另一個值,並且永遠不會與另一個值相等......即使其他值也爲Null。 – HansUp