为什么忽略ComboBox值的条件测试? (访问VBA)

时间:2019-05-28 20:01:37

标签: ms-access access-vba ms-access-forms

在发现解决方法之前,我有一个If子句被完全忽略了,但是现在我想更好地了解幕后情况。

我们有一个带有ComboBox的表单,该表单已填充,但未在其上设置默认值。当我保存表单时,我们需要测试用户是否选择了一个值。代码是:

If (Me.Combo78.Value = "") Then
    mb "Please select a value"
End If

在将条件更改为以下内容之前,代码永远不会触发:

If ("" & Me.Combo78.Value = "") Then
    mb "Please select a value"
End If

我猜测"" &强制比较是文本比较,因此可以有效地测试空字符串"",但是先前的比较实际上是做什么的,并且在那里一种更好,更直观的方式来管理此问题?我刚才的解决方案感觉很糟糕。

-在拥有需要调试的旧版应用程序后,拥有30年使用Pascal,HTML,Javascript进行编码的经验,但是<1年使用VBA进行编码的经验。

1 个答案:

答案 0 :(得分:1)

如果ComboBox没有值,则Me.Combo78.Value将为空,因此Me.Combo78.Value = ""将为空,并且将不验证if语句的测试表达式。

在第二个代码中,将空字符串与null值连接将返回一个空字符串,因此"" & Me.Combo78.Value返回一个空字符串,从而验证测试表达式。

如果愿意,您可以在VBE即时窗口(可使用 Ctrl + G 访问)中亲自进行验证:

?Null = ""
Null
?Null & "" = ""
True

更具可读性的解决方案可能是:

If IsNull(Me.Combo78) Or Me.Combo78 = "" Then
    mb "Please select a value"
End If

或者,您可以使用Nz函数:

If Nz(Me.Combo78, "") = "" Then
    mb "Please select a value"
End If

由于Value属性是此类的默认成员,因此可以安全地将其省略。