Access VBAを開発していると、
- 突然「無効な Null の使用です」が発生する
- DLookupの結果でエラーになる
- CSV取込後に集計処理が失敗する
- レコードセットの値取得でエラーになる
- フォームの未入力項目で処理が止まる
といった経験があるのではないでしょうか。
Access VBAのエラー原因の上位に入るのがNull未対策です。
そして、その解決策として最も重要なのが
Nz関数
です。
Access VBAを本格的に開発するなら、DAOよりも先に覚えた方が良いと言われるほど重要なテクニックです。
- Nullとは何か
- Nullと空文字は違う
- Nullが危険な理由
- Nz関数とは
- 逆引き① Nullを空文字へ変換したい
- 逆引き② Nullを0へ変換したい
- 逆引き③ DLookupを安全に使いたい
- 逆引き④ DAO Recordsetを安全に扱う
- 逆引き⑤ 計算処理で使いたい
- Null判定をしたい
- 実務活用例① CSV取込システム
- 実務活用例② 顧客管理システム
- 実務活用例③ 売上管理システム
- 実務活用例④ 設備管理システム
- 実務活用例⑤ ログ管理
- DAO開発で必須の書き方
- ベテラン開発者の定番ルール
- Null対策テンプレート
- Copilot活用術① Null対策レビュー
- Copilot活用術② Nz自動追加
- Copilot活用術③ CSV取込対策
- Null対策でよくあるミス
- Null対策が重要なシステム
- 開発現場での利用頻度
- まとめ
Nullとは何か
初心者が最初につまずくポイントです。
例えばフォームで
顧客名
を入力しなかった場合、
値は
“”
ではなく
Null
になります。
Nullと空文字は違う
よく誤解されます。
空文字
“”
意味
文字はある
長さ0
です。
Null
Null
意味
値が存在しない
です。
Nullが危険な理由
例えば
Dim strName As String
strName = rs!顧客名
顧客名がNullの場合、
実行時エラー
が発生することがあります。
Nz関数とは
Null対策の定番です。
構文
Nz(値, 置換値)
例
Nz(Null, "")
結果
“”
になります。
逆引き① Nullを空文字へ変換したい
最も利用されます。
strName = _
Nz(rs!顧客名, "")
結果
Null → “”
東京商事 → 東京商事
逆引き② Nullを0へ変換したい
数値項目です。
lngAmount = _
Nz(rs!売上金額, 0)
結果
Null → 0
になります。
逆引き③ DLookupを安全に使いたい
初心者がよく遭遇する問題です。
危険なコード
strName = _
DLookup("顧客名", "T_CUSTOMER", "顧客コード='C001'")
検索対象が存在しないと
Null
になります。
安全なコード
strName = _
Nz(DLookup("顧客名", "T_CUSTOMER", "顧客コード='C001'"), "")
逆引き④ DAO Recordsetを安全に扱う
実務で非常に多いです。
危険
strCustomer = _
rs!顧客名
安全
strCustomer = _
Nz(rs!顧客名, "")
逆引き⑤ 計算処理で使いたい
金額集計です。
lngTotal = _
Nz(rs!売上金額, 0) + Nz(rs!消費税, 0)
メリット
Nullが混ざっても計算できます。
Null判定をしたい
IsNull関数です。
If IsNull(rs!顧客名) Then
End If
用途
Nullか確認
用途の違い
IsNull
判定
Nz
変換
です。
実務活用例① CSV取込システム
CSVに空欄があるケースです。
対策
strTel = _
Nz(rs!電話番号, "")
効果
取込エラー防止
実務活用例② 顧客管理システム
担当者未入力です。
strUser = _
Nz(rs!担当者, "")
効果
画面エラー防止
実務活用例③ 売上管理システム
金額集計です。
lngSales = _
Nz(rs!売上金額, 0)
効果
集計エラー防止
実務活用例④ 設備管理システム
点検日未登録です。
If IsNull(rs!点検日) Then
End If
効果
未点検抽出
実務活用例⑤ ログ管理
コメント未入力です。
strComment = _
Nz(rs!コメント, "")
効果
履歴表示安定化
DAO開発で必須の書き方
DAO記事でも紹介したRecordset処理です。
推奨
Do Until rs.EOF
strCode = Nz(rs!顧客コード, "")
strName = Nz(rs!顧客名, "")
lngAmount = Nz(rs!売上金額, 0)
rs.MoveNext
Loop
効果
圧倒的に安定します。
ベテラン開発者の定番ルール
フォーム参照時です。
悪い例
If Me!売上金額 > 0 Then
良い例
If Nz(Me!売上金額, 0) > 0 Then
フォーム値は基本的に
Nz
で囲むことが多いです。
Null対策テンプレート
実務でそのまま使えます。
文字列
Nz(値, “”)
数値
Nz(値, 0)
真偽値
Nz(値, False)
日付
If Not IsNull(日付) Then
Copilot活用術① Null対策レビュー
Copilotへの依頼例です。
Access VBAです。
Nullエラーになる可能性がある箇所を
指摘してください。
Copilot活用術② Nz自動追加
以下のDAOコードへ
Nz関数を利用した
Null対策を追加してください。
Copilot活用術③ CSV取込対策
CSV取込処理です。
Nullエラーが出ないように
改善してください。
非常に相性が良いテーマです。
Null対策でよくあるミス
空文字と比較
危険です。
If rs!顧客名 = "" Then
安全
If Nz(rs!顧客名, "") = "" Then
Null対策が重要なシステム
特に重要なのは次のシステムです。
- CSV取込システム
- 顧客管理システム
- 設備管理システム
- 売上管理システム
- ログ管理システム
- バッチ処理
開発現場での利用頻度
| 順位 | 用途 |
|---|---|
| 1位 | DAO Recordset |
| 2位 | フォーム値取得 |
| 3位 | DLookup |
| 4位 | CSV取込 |
| 5位 | 集計処理 |
Access VBA開発では毎日利用します。
まとめ
Null対策はAccess VBA開発における最重要テクニックの一つです。
特に覚えておきたいのは次の3つです。
Nz(値,””)
Nz(値,0)
IsNull(値)
これだけで、
- DAOエラー防止
- CSV取込エラー防止
- DLookupエラー防止
- フォーム入力エラー防止
が実現できます。
Access VBA初心者の方ほど、まずは
Nz
を徹底的に使う習慣を付けることをおすすめします。
システムの安定性が大きく向上し、運用後のトラブルも大幅に減らすことができます。

コメント