2014-03-24 116 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