12

我正在尝试编写一个 if 语句,如果某个组合框为空,则它运行代码的某个部分,如果其中有数据,然后运行另一个。我写了这个:

Private Sub ProjectAddSetDateAutoBtn_Click()
If ProjectAddAllDueDateAutoCmBx = Null Then
'Code1
Msgbox("ComboBox Is Null")
Else
'Code2
Msgbox("ComboBox Has Data")
End If
End Sub

我留下没有数据的组合框,然后它也不会运行 if 的第一部分中的代码或第二部分中的代码!如果我在框中输入数据,它会完美地运行 if 语句的第二部分。没有错误,我对此感到很困惑。ComboBoxes 有自己的“Null”吗?这个 if 语句有问题吗?

4

5 回答 5

21

没有什么是等于 Null 的,甚至不是另一个 Null

使用IsNull()检查组合框是否为 Null。

'If ProjectAddAllDueDateAutoCmBx = Null Then
If IsNull(ProjectAddAllDueDateAutoCmBx) = True Then
于 2013-11-12T12:41:31.550 回答
4

您无法使用= Null比较来获得所需的结果,因为 Null 会传播。要查看实际情况,请尝试:

? Null = Null

在立即窗口中,您会看到返回了 Null。使用 IsNull 函数,它将按照您的预期返回 true 或 false。

Private Sub ProjectAddSetDateAutoBtn_Click()
If IsNull(ProjectAddAllDueDateAutoCmBx) Then
'Code1
Msgbox("ComboBox Is Null")
Else
'Code2
Msgbox("ComboBox Has Data")
End If
End Sub
于 2013-11-12T12:42:20.797 回答
4

我会建议

If IsNull(ProjectAddAllDueDateAutoCmBx.Value) Then

它正确地检查Null(IsNull而不是= Null),并且显式地检查组合框的

(在大多数情况下 - 取决于上下文 - 仅使用控件的名称会产生值,但明确表示并没有什么坏处。)

于 2013-11-12T12:47:07.810 回答
4

虽然接受的答案是完全正确的,但我使用了不同的方法:

If HasValue(ProjectAddAllDueDateAutoCmBx) Then

其中 HasValue 函数为:

Public Function HasValue(v As Variant) As Boolean
    If Trim(v & "") <> "" Then
        HasValue = True
    Else
        HasValue = False
    End If
End Function

这具有将 NULL 和“”(或任何纯空格)值视为相同的优点,这是您想要使用 MSAccess 控件的许多倍。例如,在一个空值文本框中输入一个值并用退格键再次删除它会导致一个“”值,而不是 NULL。从用户的角度来看,这主要是相同的。

[ (v & "") 部分只是强制转换为字符串的技巧。]

于 2013-11-12T13:40:18.803 回答
0

VB 中 null 的等价物是 Nothing 所以你的检查想要:

If ProjectAddAllDueDateAutoCmBx Is Nothing Then

……

希望有帮助。

于 2013-11-12T12:34:43.790 回答