ACCESSでNz関数を使って空白を0にする

ACCESSでNz関数を使って空白を0にする

ACCESSでデータを集計した際に、値がないところを空白ではなく0で表示したい時があると思います。
複数のフィールドの値を合計する際に、一つでも空白(Null)のフィールドがあると合計できないんですよね。
今日はそんな時に役立つ、Nz関数の使い方を解説していきましょう。


こんにちは。
はこにわガジェット (@hakoniwagadget) です。

ACCESSを使った売上管理、顧客管理などのデータベース開発を行っています。
ACCESSは使いこなすために少しスキルが必要なものの、うまく活用すればExcelよりも業務の効率化が図れます。
この記事ではACCESSをもっと使いこなしたい方向けにACCESSの関数をご紹介していきます。

構文

最初にNz関数の構文を示します。

Nz ( 値 , Nullだった場合の代替値 )

引数は2つのみで比較的簡単な構文です。

いくつか使用例を挙げましょう。

区分条件構文
クエリ売上金額がNullの場合に0にする Nz ( [売上金額] , 0 )
クエリ顧客名がNullの場合に”不明”にする Nz ( [顧客名] , “” )
VBAtestという変数の値がNullだった場合に0にするNz ( test , 0 )
VBA売上テーブルの売上金額を合計した値がNullの場合に0にするNz ( DSum ( “売上金額” , “売上テーブル” ) , 0 )

なお、Nullだった場合の代替値を設定しなかった場合は、数値の0または長さ0の文字列””が返されます。

Nullは集計の敵

それでは使い方を見ていきましょう。

そもそも、なぜNullを置き換えなければいけないのでしょうか。
例えば、下記のような売上テーブルがあるとします。

このテーブルの売上金額から仕入金額を引いて、利益を計算したいとします。
その場合、選択クエリで売上金額から仕入金額を引く計算式を設定します。

こんな感じですね。
ではクエリの結果を表示してみましょう。

はい。
こんな感じになりました。
概ね期待通りですが、5行目の売上だけは利益が計算できず、空白になっています。
これは仕入金額がNullのため、[売上仕入] – [仕入金額]が計算できていない状態です。

別にNullでも困らないんじゃないの?と思われるかもしれません。
しかし、Nullには大きな問題があります。Nullは0とは違って計算ができないのです。

たとえば、この5行目の仕入金額が0だったらどうでしょう?
利益は17,000円になり、利益の合計金額も変わってきますよね。
しかし仕入金額にNullが入ってしまったがために、全体が正しく集計できなくなってしまうのです。

NullはACCESSで集計を行う上では避けなければならない敵なのです。

規定値設定でNullを回避する

こうしたNullの発生を回避する方法はいくつかあります。
もっとも一般的なのはテーブルにおける規定値設定です。

上の例では、売上金額の規定値を0にしています。
こうしておけば何も入力しなくても、自動的に0が入力されるのでNullになる可能性が低くなります。

しかしこれでもNullの発生を完全に防げるわけではありません。

ACCESSは一人ではなく複数のユーザーが使用します。
その中にはパソコンに詳しくない人も多いことでしょう。
そうしたユーザーは開発者の思いもよらない操作をするものです。
規定値の0をあえて削除してNullを入力されるということも起こり得ます。

特に集計結果はNullによって集計されないフィールドがあっても実務上は気づきにくい部分です。
明確にエラーが出るわけではなく、集計結果が少し減るだけになってしまいます。

そこで、どんなユーザーが使用してもNullが入らないよう設計しておく必要があるのです。

Nz関数でNullがあっても計算する

こうした時に便利なのがNz関数です。
Nz関数は以下の構文で使用します。

Nz ( 値 , Nullだった場合の代替値 )

例えば、先ほどのクエリで

利益: [売上金額]-[仕入金額]

となっていた計算式を

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

と変更します。

こんな感じですね。

ではデータシートビューでクエリの結果を見てみましょう。

売上ID:5のデータを見てください。
仕入金額が空白(Null)ですが、利益はきちんと計算できるようになりました。

Val関数と組み合わせて確実に数値の0にする

Nz関数はNullだった場合の値のデータ型を前後の文脈で判断するため、場合によっては数値の0にしたいにも関わらず、文字列の0になってしまう場合があります。こうなると当然数値としての集計はできません。

これを防ぐために、Nz関数を使用する際は、文字列に含まれる数値を適切なデータ型の数値で返すVal関数と組み合わせて使用することを推奨します。

Val関数の構文は以下の通りです。

Val ( 数値にしたい文字列 )

これをNz関数と組み合わせるとこのようになります。

Val ( Nz ( 値 , Nullだった場合の代替値 ) )

こうすることにより、Nullの際に確実に数値の0を返すことが可能です。

iif関数の代わりに使用する

Nz関数はその性質上、条件分岐をする機能をあらかじめ備えています。

ACCESSで条件分岐をさせる際に使用する関数といえばiif関数です。
Nz関数を使用せず、iif関数で代替することも、もちろん可能です。

例えば、

Nz ( [売上金額] , 0 )

は、iif関数を使用すると

iif ( Isnull ( [売上金額] ) = true , 0 )

と記載することが可能です。

ただ、条件分岐が複雑になるとどんどん構文が長くなっていってしまいます。
そのため、Nullの判別をするだけであればNz関数を使用したほうがコードの可読性が高まり、結果的にデータベースのメンテナンスが容易になります。

こうした観点でもNz関数をうまく使いこなしたいですね。

以上、ACCESSでNz関数を使って空白を0にする方法をご紹介しました。


ACCESSを使いこなせば、業務の効率化や自動化が実現できます。
しかし、自分でACCESSを学ぶには時間がない、難しそうで不安、という方も多いでしょう。

そんな時は、ACCESS開発歴20年以上、過去に100以上のACCESSデータベースを開発してきた私(@hakoniwagadget)にお任せください。

ACCESSの新規開発、既存のACCESSの修正、ACCESSの操作レッスンなど様々なサービスをご提供しています。
ご興味のある方は下記のサービス一覧をご覧ください。

サービス一覧

最後までお読みいただき、ありがとうございました。