AccessのNz関数とはについてお探しですね。

広告

AccessのNz関数を使いこなそう!Nullを0や文字に変換してエラーを防ぐ方法

Accessで集計クエリやフォームを作っていると、「見た目は空白なのに計算結果がおかしい」「合計が合わない」「VBAでエラーが出る」といった困った状況に遭遇することがあります。

その原因の多くは、Access特有の「Null」という値の扱いにあるんです。

この記事では、AccessのNz関数を使って、空白に見えるNullを0や好きな文字に変換し、計算エラーや表示の崩れを防ぐ方法を分かりやすく解説します。

Nz関数って何?Nullを別の値に置き換える便利な関数

AccessのNz関数は、値がNullだった場合に、指定した別の値に変換してくれる関数です。

Nullって何かというと、「0」や「空っぽの文字列」とは違って、「値そのものが存在しない状態」のことを指します。

たとえば売上金額のフィールドがNullのまま計算に使われると、Accessでは普通の数値として扱えず、計算結果も全部Nullになってしまうことがあるんです。

Nz関数の基本的な書き方はこうです。

“`
Nz(対象の値, Nullだった場合に返す値)
“`

たとえば、売上金額がNullの場合に0として扱いたいなら、クエリでこんな風に書きます。

“`
Nz([売上金額], 0)
“`

この式は、売上金額に値が入っていればその値をそのまま返して、Nullだったら0を返してくれます。

つまり、計算や集計をする前に「Nullを安全な値に置き換えておく」ための関数だと考えると分かりやすいですね。

Accessではクエリ、フォーム、レポート、VBAなど、いろんな場所でNz関数が使えるので、Null対策の基本として覚えておくと便利です。

ちなみに、Nz関数の2番目の引数(Nullだった場合に返す値)は省略できるんですが、実際の作業では省略しない方が安全です。

省略すると、Accessが状況に応じて0や空っぽの文字列を返してくれることもあるんですが、思っていたのと違うデータ型として扱われることがあります。

数値として計算したいなら`Nz([金額], 0)`、文字として表示したいなら`Nz([氏名], “未入力”)`のように、置き換える値をはっきり書いておくと、後で見たときにも分かりやすくなります。

空白に見えるNull・空文字・スペースの違いを知っておこう

Accessで「空白」と呼ばれる状態には、実はいくつか種類があります。

特にややこしいのが、Null、空文字列、スペースの3つです。

画面で見ると、どれも何も入っていないように見えることがあるんですが、Access内部では全く別のものとして扱われています。

この違いを知らないと、Nz関数を使っているのに思った結果にならない、抽出条件に合わない、入力チェックがうまくいかない、といった問題が起こります。

**Null**は「値が存在しない状態」です。

数値型、日付型、テキスト型など、いろんなデータ型で発生する可能性があって、`= Null`のような比較では正しく判定できません。

Nullかどうか調べるには、クエリでは`Is Null`、VBAでは`IsNull()`を使います。

**空文字列**は`””`で表される「長さ0の文字列」です。

値は存在しているけど、中身の文字数が0という状態で、主にテキスト型のフィールドで使われます。

**スペース**は、半角スペースや全角スペースが入力されている状態です。

見た目は空欄のようでも、実際には1文字以上の文字が入っています。

だから、Nz関数でNullを空文字に変換しても、スペースまでは自動で取り除けません。

フォームで未入力チェックをするときなどは、`Nz()`だけじゃなくて`Trim()`関数も組み合わせて、前後のスペースを取り除いてから判定することが大切です。

たとえば、テキストボックスが未入力かどうかを判定する場合は、こんな書き方ができます。

“`
Trim(Nz([顧客名], “”)) = “”
“`

この式では、まず顧客名がNullなら空文字列に変換して、その後Trim関数で前後のスペースを削除しています。

結果が空文字列なら、Null、空文字、スペースだけの入力をまとめて「未入力」と判断できるわけです。

Accessでは見た目だけで空白を判断せず、内部的に何が入っているのかを意識することが、エラー防止の第一歩になります。

Nz関数で空白を0や好きな文字に変換する基本パターン

Nz関数のよくある使い方は、数値フィールドのNullを0に変換することです。

たとえば、売上金額から仕入金額を引いて利益を求めるクエリがあるとします。

普通に`[売上金額] – [仕入金額]`と書いた場合、仕入金額がNullのレコードでは利益もNullになってしまい、正しい計算結果が表示されません。

こういうときは、計算に使うそれぞれのフィールドをNz関数で包んであげます。

“`
利益: Nz([売上金額], 0) – Nz([仕入金額], 0)
“`

この式にすると、売上金額や仕入金額がNullでも、それぞれ0として計算されます。

たとえば売上金額が17000円で、仕入金額がNullなら、`17000 – 0`として利益が17000円になります。

もちろん、実際の業務では「仕入金額が未入力なら0として扱っていいのか」は事前に確認が必要です。

ただ、Nullのせいで計算結果全体が空白になってしまうのを防ぐという意味では、とても実用的な書き方です。

文字列に対してもNz関数はよく使われます。

たとえば顧客名がNullの場合に「未登録」と表示したいときは、こう書きます。

“`
Nz([顧客名], “未登録”)
“`

レポートやフォームで空欄のまま表示されると、入力漏れなのか該当なしなのか分かりにくいことがあります。

そんなときに「未登録」「該当なし」「確認中」などの文字に置き換えると、使う人が状態を判断しやすくなります。

ただし、表示用の文字を入れる場合は、元データを直接書き換えるんじゃなくて、クエリやフォームの表示式で変換する方が安全です。

VBAでもNz関数は使えます。

たとえば、フォーム上のテキストボックスの値を変数に入れるとき、Nullのまま文字列型の変数に代入しようとするとエラーになることがあります。

そういう場合は、こんな風にNullを空文字列に変換してから代入します。

“`
strName = Nz(Me!txtName, “”)
“`

また、DLookupやDSumなどの関数と組み合わせる使い方もよくあります。

条件に合うレコードが存在しない場合、DLookupやDSumはNullを返すことがあるので、そのまま計算や表示に使うと思わぬ結果になりやすいんです。

たとえば売上テーブルの合計がNullなら0にしたい場合は、`Nz(DSum(“売上金額”, “売上テーブル”), 0)`のように書くことで、集計対象がない場合でも0として扱えます。

Nz関数でエラーを防ぐ実務上の注意点

Nz関数は便利なんですが、「Nullなら何でも0にすればいい」という考え方で使うと、かえって集計ミスにつながることがあります。

たとえば、未入力の仕入金額を0として扱うと、利益が実際より大きく見えてしまう可能性があります。

一方で、販売数量や割引額のように「未入力なら0とみなす」という業務ルールがはっきりしている項目もあります。

Nz関数を使う前に、そのNullが「本当に0として扱っていい空白」なのか、「入力漏れとして検知すべき空白」なのかを分けて考えることが大切です。

実際の仕事でNz関数を使うときは、こんな方針で使い分けると安全です。

– 計算に使う数値フィールドは、業務上問題がなければ`Nz([金額], 0)`でNullを0に変換する
– 表示用のテキストフィールドは、`Nz([名称], “未登録”)`のように意味が分かる文字に変換する
– 入力チェックでは、`Trim(Nz([項目], “”)) = “”`のようにNull・空文字・スペースをまとめて判定する
– 元データを一括で0に更新する前に、必ずバックアップを取って、Nullの意味を確認する

また、数値として扱いたい値が文字列になっている場合は注意が必要です。

たとえば外部システムやExcelから取り込んだデータでは、見た目は「0」でも文字列として保存されていることがあります。

この状態で集計すると、思ったように合計できなかったり、型変換エラーが起きたりすることがあります。

必要に応じて`Val(Nz([金額], 0))`のようにVal関数を組み合わせて、数値として扱える形に整える方法もあります。

IIf関数でNullを判定する方法もあるんですが、Nullを別の値に置き換えるだけならNz関数の方がシンプルです。

たとえば`IIf(IsNull([売上金額]), 0, [売上金額])`と書くより、`Nz([売上金額], 0)`と書いた方が短くて、後から見ても何をしているか分かりやすいです。

クエリやVBAは長くなるほど管理が大変になるので、Null対策にはNz関数を優先して使うと、データベース全体の見通しも良くなります。

ただし、そもそもNullが発生しないようにする設計も大切です。

テーブルのフィールドには、既定値を0に設定したり、必須項目には値要求を設定したりできます。

こういうテーブル設計で入力漏れを防いで、それでも発生するNullをクエリやVBAでNz関数を使って補う、という二段構えにすると安定したAccess運用につながります。

Nz関数は単なる置き換え関数じゃなくて、Accessで集計・表示・入力チェックの信頼性を高めるための基本機能として活用すると効果的ですよ。

広告