比较逻辑

时间:2014-03-24 15:27:16

标签: vba ms-access ms-access-2007 access-vba

我有一个If语句,我假设是将每个值相互比较。然而,似乎无论值是什么(例如,所有值都包含4的计数),它都会转到其他位置。我在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 个答案:

答案 0 :(得分:2)

VBA并没有像你期望的那样执行那种比较序列。

从立即窗口考虑这个更简单的例子......

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

我不确定VBA如何处理这些多重平等比较,但怀疑它可能正在测试第一个,然后将结果与下一个进行比较......有点像......

Debug.Print (2 = 2) = 2
False

第一个比较返回True,即整数-1 ...

Debug.Print CInt(2 = 2)
-1 

这意味着最终的比较将等同于......

Debug.Print -1 = 2

当然,返回False。

答案 1 :(得分:2)

计算上最快捷的方法是对比较进行硬编码。更多 可扩展的方法是通过循环进行测试。

HansUp做出了很好的评论 - 您应该警惕潜在的空值并添加处理程序以根据需要处理它们(例如在Access中使用Nz()或在任何主机环境中使用IsNull() < / p>

'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