IsNull・Nz関数でAccessのNull値を安全に処理する|クエリ条件・フォーム表示・集計エラーを防ぐ実務パターンとMOS試験対策

Accessを使っていると、フォームのテキストボックスが空白のまま演算に使われてエラーになったり、クエリの合計が期待より小さかったり、IIf関数が意図しない分岐をしたりといったトラブルに出くわします。その原因のほとんどはNull値の扱いにあります。

ExcelではA1セルが空白のとき「0」や「””」として計算してくれる場面が多いですが、AccessはNull(値が存在しない状態)を厳密に管理します。Nullは「0でも空文字でもない、データそのものが未入力」を意味し、Null + 1 の結果はエラーではなく Null になります。これをVBA・クエリ・フォーム上で安全に処理するために使うのが IsNull関数Nz関数です。

本記事ではIsNull・Nzの構文・戻り値の仕組みから、クエリ条件・フォーム表示・集計計算・MOS試験頻出問題まで体系的に解説します。

AccessのNullは0でも空文字でもない「値なし」状態であることを示す比較図解
目次

NullとはAccess特有の「値なし」状態

Accessのテーブルフィールドには「必須入力」プロパティをオフにした場合、データが入力されていないとNullが格納されます。Nullは次のような特別な性質を持ちます。

比較結果理由
Null = 0FalseNullは0ではない
Null = “”FalseNullは空文字でもない
Null = NullNull(不定)Null同士の比較もNullを返す
Null + 100Null算術演算にNullが含まれると結果もNull
Is NullTrue/FalseNullかどうかを確認する正しい書き方

特に「Null = Null」が不定(True にならない)という点がトラブルの元です。クエリの抽出条件で = "" と書いても、Nullレコードは引っかかりません。Nullを検索・処理するには専用の構文が必要です。

IsNull関数の構文と基本的な使い方

IsNull関数はAccessとVBA両方で使える関数で、対象の式がNullかどうかを確認し、TrueまたはFalseを返します。

構文

IsNull(式)
引数内容
フィールド名・コントロール名・変数・任意の式

戻り値は True(Nullである)または False(Nullでない)です。

クエリの演算フィールドでの使用例

クエリデザインビューの「フィールド」行に以下のように記述します。

確認: IIf(IsNull([備考]),"未入力","入力済み")

[備考]フィールドがNullなら「未入力」、そうでなければ「入力済み」と表示する演算フィールドです。IsNullIIf の第1引数(条件式)として使うのが最も多いパターンです。

クエリの抽出条件でのNull検索

抽出条件にNullを検索する場合は Is Null、Nullでないレコードは Is Not Null と入力します(スペースに注意)。

目的抽出条件欄の入力
Nullのレコードだけ取得Is Null
Nullでないレコードだけ取得Is Not Null
Nullまたは空文字のレコードを取得Is Null Or “”

= Null<> Null と書いても正しく動作しません。クエリで Null を扱うときは必ず Is Null / Is Not Null を使います。

Nz関数の構文(式・ValueIfNull)とNullを代替値に置き換える処理フローの図解

Nz関数の構文と基本的な使い方

Nz関数は「Null→ゼロ(Null→Zero)」の頭文字が由来で、NullをあらかじめデフォルトのNullでない値に置き換える関数です。IsNullで真偽を判定するより、直接「Nullだったら代替値を使う」という処理に向いています。

構文

Nz(式 [, ValueIfNull])
引数省略内容
不可Nullかどうか確認したいフィールド・変数・式
ValueIfNull省略可Nullのときに代わりに返す値。省略すると数値型なら0、文字列型なら””

クエリでの使用例

合計金額: Nz([数量],0) * Nz([単価],0)

[数量]か[単価]のどちらかがNullでも、0として計算するため結果はNullではなく0になります。Nullのままだと乗算結果もNullになってしまうのでこのパターンは非常に頻出です。

担当者表示: Nz([担当者名],"(未割り当て)")

[担当者名]がNullのとき「(未割り当て)」と表示します。第2引数で文字列を渡す場合は引用符で囲みます。

IsNull関数とNz関数の戻り値・向いている場面・記述例を比較した使い分け図解

IsNullとNzの使い分けポイント

関数戻り値向いている場面
IsNullTrue / FalseNullかどうかで分岐したい(IIf・If文の条件判定)
Nz元の値 or 代替値Nullを即座に0・空文字・任意の値に変換して計算や表示に使いたい

「Nullのとき何かをする・しない」という判定が目的ならIsNull、「Nullを別の値として扱いたい」という変換が目的ならNzが適しています。組み合わせて使うことも多くあります。

PR

MOS Access 365&2019 Expert 対策テキスト&問題集(よくわかるマスター/富士通ラーニングメディア)

MOS Access試験の出題範囲を体系的に演習できる公式教材シリーズ。テーブル・クエリ・フォーム・レポートの操作を試験形式で確認できます。

実務パターン別の活用例5選

パターン① 未入力チェックフラグをクエリに追加する

顧客テーブルの[電話番号]が未入力のレコードを見つけて「要確認」フラグを立てます。

要確認: IIf(IsNull([電話番号]),"◯","")

クエリ結果を担当者に共有するとき、[要確認]列に「◯」がついているレコードが一目でわかります。

パターン② 集計クエリでNullを0として合計する

SUM関数はNullを無視して合計しますが、グループ間の差を計算するとき「合計がNullになるグループ」が生まれることがあります。

売上合計: Nz(Sum([売上金額]),0)

Sum([売上金額])がNullを返してしまった場合でも、Nzで0に変換して後段の比較計算が壊れないようにします。

パターン③ フォームのテキストボックスがNullのまま計算されるのを防ぐ

フォームで[数量]と[単価]を入力して[合計]テキストボックスに自動計算させる場面です。コントロールソースに直接式を書く場合:

=[数量]*[単価]

これだと[数量]か[単価]が未入力のままだと#Errorが表示されます。次のように書き換えます。

=Nz([数量],0)*Nz([単価],0)

片方が未入力でも0として計算し、エラー表示が出なくなります。

パターン④ IIf+IsNullで担当者未割当の行をハイライトするレポートを作る

レポートの条件付き書式機能では「フィールドの値が」条件のほかに「式が」条件でIsNullが使えます。[担当者名] Is Nullを条件に指定して、背景色を赤にすれば未割当行を一目で確認できます。または演算フィールドとして以下を設け、そのフィールドを条件付き書式のトリガーにします。

IsNull([担当者名])

パターン⑤ NULL値が含まれる文字列連結でエラーにしない

クエリやフォームで姓と名を結合して氏名を作る場合、どちらかがNullだと文字列演算子(&)の結果がNullになります。

氏名: Nz([姓],"") & " " & Nz([名],"")

姓または名がNullでも空文字として連結するため、結果は常に文字列になります。

フォーム未入力のNullをIsNull判定とNz変換で安全に処理するVBAの2つの型の図解

フォームコントロールのNull操作実践

フォームのテキストボックスはコントロールソースにフィールドを紐づけているとき、未入力レコードの値はNullになります。VBAでコントロールの値を読み取るときは次の対処が必要です。

VBAでNullを判定して処理する

If IsNull(Me![数量]) Then
    MsgBox "数量を入力してください"
    Me![数量].SetFocus
    Exit Sub
End If

[数量]テキストボックスが未入力(Null)の場合にメッセージを表示してフォーカスを戻す処理です。フォームのBeforeUpdateイベントや保存ボタンのClickイベントに記述します。

Nzで変数に代入する

Dim lngQty As Long
lngQty = Nz(Me![数量], 0)

Nullを型付き変数(Long型など)に代入しようとするとエラーになります。Nzで0に変換してから代入するとエラーが回避できます。

テキストボックスの既定値でNullを防ぐ

フォームのコントロールプロパティ「既定値」に 0"" を設定しておくと、新規レコード入力時のNullを最初から回避できます。ただしNullと0・空文字は意味が異なる場合があるため、「未入力なのか0を入力したのか区別したい」フィールドには既定値を設定しないよう注意します。

クエリSQL文でNullを扱う

SQLビューで直接SQL文を記述する場合のNull操作構文をまとめます。

目的SQL記述例
Nullのレコードを抽出WHERE [フィールド] IS NULL
Nullでないレコードを抽出WHERE [フィールド] IS NOT NULL
NullをSQLで置換(IIf利用)IIf(IsNull([フィールド]),0,[フィールド])
NullをSQLで置換(Nz利用)Nz([フィールド],0)

標準SQLには COALESCEISNULL 関数があり、SQL ServerやMySQLではこれらが使えます。ただしAccessのJet/ACEエンジンでは COALESCE はサポートされず、AccessのSQL環境内では Nz または IIf(IsNull(...))... を使います。

Null関連でよくあるエラーと対処一覧

症状原因対処
演算フィールドが#Errorになる演算に使うフィールドのどれかがNullNzで0または空文字に変換してから演算
IIfが意図しない分岐をする条件式に「= Null」を使っているIsNull([フィールド])に書き換える
SUM集計の結果がNullになるグループがある対象レコードが1件もなく集計値がNullNz(Sum([フィールド]),0)でラップ
VBAでType MismatchエラーNull値を型付き変数に直接代入したNzで変換してから代入
Is Nullで抽出しても件数が合わないNullと空文字(””)が混在しているIs Null Or “”の複合条件を使う
文字列連結結果がNullになる&演算子にNullが含まれるNz([フィールド],””)で空文字に変換してから連結

PR

今すぐ使えるかんたん Access 2024[Office 2024/Microsoft 365 両対応](井上香緒里)

画面手順つきでデータベース設計から実務操作まで解説する入門書。用語につまずきやすいAccess初学者に向いています。

IsNull・NzとMOS Access試験の出題傾向

MOS Access 365(またはAccess 2019)の試験では、クエリの演算フィールドや抽出条件にNullが絡む問題は比較的高い頻度で出題されます。試験対策として押さえておくべきポイントを整理します。

MOS試験頻出チェックリスト

チェック項目正しい操作
Nullを含むフィールドをクエリで抽出するとき抽出条件欄に「Is Null」と入力する(「= Null」は誤り)
Nullでないレコードを抽出するとき抽出条件欄に「Is Not Null」と入力する
Nullがあっても演算を止めない演算フィールドNz([フィールド],0)を演算式の中で使う
IsNullをIIfと組み合わせて表示を切り替えるIIf(IsNull([フィールド]),”値なし”,[フィールド])の形式で記述できる
フィールドのNullを許可するかどうかの設定場所テーブルデザインビューの「フィールドサイズ」下部「必須入力」プロパティ
テキスト型フィールドでNullと空文字を区別する設定「空文字列の許可」プロパティをYes/Noで制御する

試験問題でよく問われるケース

MOS試験では「特定フィールドが入力されていないレコードを一覧で表示せよ」という形で出題されます。抽出条件欄に Is Null と入力するのが正解で、選択肢問題の場合は = ""= Null がひっかけとして並ぶことがあります。

また、演算フィールドを作成して「Nullの場合は代替テキストを表示する」問題では、IIf(IsNull([担当者]),"未定",[担当者]) のような式を書かせる問題が出ます。Nz関数は覚えておくと式を短く書けますが、試験環境ではIIf+IsNullの組み合わせでも得点できます。

IsNull・Nzを使った実践演習シナリオ

次のシナリオで手を動かして理解を深めましょう。

演習1 受注テーブルの未入力件数を把握するクエリ

受注テーブルに [出荷日] フィールドがあります。まだ出荷されていないレコードは[出荷日]がNullです。

  1. 「作成」タブ→「クエリデザイン」を開く
  2. 受注テーブルを追加して [受注ID] と [出荷日] をグリッドに追加する
  3. [出荷日]の「抽出条件」欄に Is Null と入力する
  4. データシートビューに切り替えて未出荷レコードが表示されるか確認する
  5. 「クエリデザイン」タブ→「集計」ボタンをオンにして、[受注ID]の「集計」をCountに変更し、件数を取得する

演習2 売上テーブルで割引額がNullのレコードを0として合計する

売上テーブルに [売上金額] と [割引額] があります。[割引額]がNullのレコードが混在しています。

  1. クエリデザインで売上テーブルを追加する
  2. 演算フィールド欄に次の式を入力する
実売上: [売上金額] - Nz([割引額],0)
  1. データシートビューで [実売上] 列が正しく計算されることを確認する
  2. 集計欄でSumを選んで合計値を求める

演習3 フォームで必須項目チェックをVBAで実装する

  1. フォームをデザインビューで開く
  2. フォームの BeforeUpdate イベントに以下を入力する
Private Sub Form_BeforeUpdate(Cancel As Integer)
    If IsNull(Me![顧客名]) Then
        MsgBox "顧客名は必須です", vbExclamation
        Me![顧客名].SetFocus
        Cancel = True
    End If
End Sub
  1. フォームを実行して[顧客名]を空白のまま移動しようとするとメッセージが出ることを確認する

テーブル設計でNullを適切に制御する

Null問題の多くはテーブル設計段階で防げます。フィールドのプロパティを正しく設定することで、そもそもNullが格納されない構造を作れます。

プロパティ設定値効果
必須入力はいNullの格納を禁止する。未入力のままレコードを保存しようとするとエラーになる
空文字列の許可(テキスト型のみ)いいえ空文字(””)の格納も禁止する。NullでもなくNullでもある中間状態を防ぐ
既定値0 または “”新規レコードに自動で既定値が入るため入力忘れを防げる
入力規則Is Not NullNullを明示的に禁止するバリデーションルール

ただし「本当にデータが存在しない(未入力)」と「0や空文字が正しく入力されている」を区別したい場面では、あえてNullを許可する設計が適切です。たとえば体重測定フィールドは「未測定(Null)」と「測定値が0kg(現実上はあり得ないが)」を区別できます。Nullをすべて0に変換するのではなく、業務要件に応じて設計を選びます。

まとめ:IsNull・Nzを使いこなしてAccessの信頼性を高める

Accessにおける Null 値の扱いは、初心者がつまずきやすい代表的なポイントです。重要なポイントを整理します。

  • NullはExcelの空白セルと異なり、「値そのものが存在しない」状態であり、算術演算に加わるとすべての結果がNullになる
  • IsNull関数はNullかどうかを True/False で返す。クエリの抽出条件では Is Null / Is Not Null を使う(= Null は動作しない)
  • Nz関数はNullを任意の値(数値なら0、文字列なら””など)に置き換えて演算や表示に使う
  • IsNullはIIfと組み合わせて「Nullなら別の表示をする」演算フィールドに使い、NzはNullをそのまま置換して計算を続けたいときに使う
  • テーブル設計段階で「必須入力」「空文字列の許可」「既定値」を適切に設定するとNull問題を源流で防げる
  • MOS試験では「Is Null」の抽出条件記述と「IIf+IsNull」の演算フィールド式が頻出

IsNullとNzをマスターすることで、Accessデータベースの計算エラーやフォームの入力漏れ対策が格段に改善します。まずは自分が管理しているAccessデータベースのクエリを見直し、= Null の記述や演算エラーが発生しているフィールドにNzを適用してみましょう。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

目次