Null相当の扱い
Excel VBAでは「Null」という値はデータベース由来の特殊な値で、普通のセルや変数ではあまり使われません。ですが「空欄」「未設定」「Nothing」「Empty」など、“Null相当”の状態をどう扱うかは初心者がよくつまずくポイントです。ここではそれぞれの違いと、実務での安全な扱い方をコード例と一緒に解説します。
Null相当の種類と違い
| 状態 | 説明 | 判定方法例 |
|---|---|---|
| Empty | 変数が初期化されていない状態(Variant型の初期値) | IsEmpty(x) |
| Nothing | オブジェクト変数が何も参照していない状態 | If obj Is Nothing Then ... |
| “” | 文字列が空(セルが空欄を読み込んだ場合など) | If str = "" Then ... |
| Null | データベース由来の「値が存在しない」状態(Variant型でのみ保持可能) | IsNull(x) |
- セルの空欄を読み込むと、通常は
""(空文字)やEmptyになります。 - オブジェクト変数(Range, Workbookなど)は「参照がない」=
Nothing。 - ADO/DAOでDBを扱うときに
Nullが出てくることがあります。
基本テンプレ:セルの空欄を安全に判定
Sub CheckCellEmpty()
Dim ws As Worksheet: Set ws = Worksheets("Sheet1")
Dim v As Variant: v = ws.Range("A1").Value
If IsEmpty(v) Or v = "" Then
MsgBox "セルは空欄です"
Else
MsgBox "セルには値があります: " & v
End If
End Sub
VB- ポイント
IsEmptyと=""を併用すると「空欄」「未入力」を確実に判定できる。- 数値セルが空欄なら
IsEmptyが真になる。
オブジェクトのNull相当(Nothing)の判定
Sub CheckObjectNothing()
Dim ws As Worksheet
'Set ws = Worksheets("Sheet1") 'コメントアウトすると未設定
If ws Is Nothing Then
MsgBox "オブジェクトは参照されていません(Nothing)"
Else
MsgBox "参照中のシート名: " & ws.Name
End If
End Sub
VB- ポイント
- オブジェクト変数は必ず
Is Nothingで判定。 - 未設定のまま使うと「オブジェクト変数が設定されていません」エラーになる。
- オブジェクト変数は必ず
データベース由来のNull判定(IsNull)
Sub CheckDatabaseNull()
Dim v As Variant
v = Null '擬似的にNullを代入
If IsNull(v) Then
MsgBox "値はNullです(DB由来の未設定)"
Else
MsgBox "値は存在します"
End If
End Sub
VB- ポイント
Nullは Variant型でのみ保持可能。- 普通のセル値では出てこないが、ADO/DAOでレコードセットを扱うときに出る。
Null相当を安全に扱う共通関数(テンプレ)
Function IsNullLike(v As Variant) As Boolean
'セル空欄、Empty、Null、空文字をまとめて判定
If IsNull(v) Then
IsNullLike = True
ElseIf IsEmpty(v) Then
IsNullLike = True
ElseIf VarType(v) = vbString And v = "" Then
IsNullLike = True
Else
IsNullLike = False
End If
End Function
VB- 使い方例
Sub Example_UseIsNullLike()
Dim ws As Worksheet: Set ws = Worksheets("Sheet1")
Dim v As Variant: v = ws.Range("A1").Value
If IsNullLike(v) Then
MsgBox "A1はNull相当(空欄や未設定)です"
Else
MsgBox "A1には値があります: " & v
End If
End Sub
VBよくある落とし穴と対策
If v = ""だけだと数値セルの空欄を拾えない
→IsEmptyも併用する。- オブジェクト変数を未設定のまま使う
→If obj Is Nothing Thenで必ずチェック。 - DBのNullをそのまま計算に使うとエラー
→Nz関数(Access VBA)やIIf(IsNull(v),0,v)で補完。 - 文字列と数値の混在
→VarTypeを見て型ごとに処理を分けると安全。
例題で練習
'例1:セルが空欄かどうか判定
Sub Example_CellEmpty()
CheckCellEmpty
End Sub
'例2:オブジェクト変数がNothingか判定
Sub Example_ObjectNothing()
CheckObjectNothing
End Sub
'例3:DB由来のNullを判定
Sub Example_DBNull()
CheckDatabaseNull
End Sub
'例4:共通関数でNull相当をまとめて判定
Sub Example_NullLike()
Example_UseIsNullLike
End Sub
VB