我有一个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
答案 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