web-dev-qa-db-ja.com

ifステートメントのコンボボックスがnull

特定のコンボボックスがnullの場合、コードの特定の部分を実行し、データが含まれている場合は別のコンボボックスを実行する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の最初の部分のコードも、2番目の部分のコードも実行されません!ボックスにデータを入力すると、ifステートメントの2番目の部分が完全に実行されます。エラーはなく、私はこれでかなり困惑しています。 ComboBoxには独自の「Null」がありますか?このifステートメントに問題はありますか?

11
D347HxD

Nullに等しいものはありません。別のNullもありません

IsNull() を使用して、コンボボックスがNullかどうかを確認します。

'If ProjectAddAllDueDateAutoCmBx = Null Then
If IsNull(ProjectAddAllDueDateAutoCmBx) = True Then
19
HansUp

受け入れられた答えは完全に正しいですが、私は別のアプローチを使用します:

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値のテキストボックスに値を入力し、それをバックスペースで再度削除すると、NULLではなく ""値になります。ユーザーの観点から、これはほとんど同じであることを意味します。

[(v& "")の部分は、文字列への変換を強制するためのトリックにすぎません。]

4
Oliver

Nullが伝播するため、= Null比較を使用して必要な結果を取得することはできません。この動作を確認するには、次のことを試してください。

? Null = Null

イミディエイトウィンドウにNullが返されることがわかります。期待どおりにtrueまたはfalseを返すIsNull関数を使用します。

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

私は提案します

If IsNull(ProjectAddAllDueDateAutoCmBx.Value) Then

Null= NullではなくIsNull)を正しくチェックし、コンボボックスのvalueを明示的にチェックします。

(ほとんどの場合-コンテキストに応じて-コントロールの名前を使用するだけで値が得られますが、明示的にする必要はありません。)

3
Heinzi

VB=のnullに相当するものはNothingなので、チェックは次のようになります。

If ProjectAddAllDueDateAutoCmBx Is Nothing Then

....

それが役に立てば幸いです。

0
ZaoTaoBao