AccessのNz関数をお探しですね。

広告

エラー回避の必須知識!AccessのNull値を「Nz関数」で0や空白に変換する方法

Microsoft Accessを使っていて、「あれ?計算結果が空白になっちゃった」「なんかエラーが出る…」なんて経験、ありませんか?
実はその原因、ほとんどが「Null値(ヌル値)」というものの扱い方にあるんです。

Excelを使い慣れている人ほど、Accessに移ったときに「え、何これ?」ってなりがちなポイントなんですよね。

Excelでは「空白」も「0」も、わりとゆるく扱ってくれるんですが、Accessはもっと厳密。

「何も入ってない」ことと「0が入ってる」ことは、まったく別物として扱われるんです。

この違いを知らないと、システムを作るときに必ずつまずきます。

そこで登場するのが「Nz関数」!この関数を使えば、やっかいなNull値を「0」や「空白」に変えて、扱いやすくできるんです。

この記事では、Accessを使い始めた人から、もうちょっと使いこなしたい人まで、Null値のトラブルとNz関数での解決方法をわかりやすく解説していきます。

Accessの「Null値」って何?なんでトラブルになるの?

Accessを使うなら、まず「Null値」を理解しておかないと始まりません。

特にExcelから移ってきた人が一番混乱するところでもあります。

まずは、なぜNull値がエラーや計算ミスの原因になるのか、整理してみましょう。

Excelの「空白」とAccessの「Null」は全然違う!

Excelでセルに何も入力しないと、それは単なる「空っぽ」として扱われますよね。

計算式でそのセルを使っても、だいたい「0」として計算されたり、エラーにならずに済んだりします。

でも、Accessなどのデータベースソフトの「Null」は、ちょっと特殊なんです。

「値がまだ決まってない」「不明」っていう意味なんですね。

「0が入ってる」わけでも、「空っぽの文字が入ってる」わけでもありません。

言うなれば「そこには何もない(虚無)」っていう、特別な状態なんです。

この違いは、計算するときにはっきり出てきます。

たとえば「100 + Null」って計算をすると、Accessの答えは「100」じゃなくて「Null」になっちゃうんです。

「わからないものに何を足しても、答えはわからないまま」っていう、データベース特有の厳しいルールがあるんですね。

これが、Accessで合計を出そうとしたら結果が空白になっちゃう、よくある原因です。

Null値が起こすよくあるトラブル

Null値をちゃんと処理しないままだと、こんなトラブルが起きます。

* **計算結果が消える**:
「単価 × 数量」みたいな計算で、どっちかが未入力(Null)だと、答えもNull(空白)になって、金額が表示されない。

* **データの抽出がうまくいかない**:
「0以外のデータを抽出したい」と思って `<> 0` って条件を書いても、Nullのデータは引っかからない(Nullは0でもないし、0以外でもないって判定されるから)。

* **VBAでエラーが出る**:
プログラムの中で数値を扱う変数にNull値を入れようとすると、「Nullの使い方がおかしいです」ってエラーで止まっちゃう。

こういう問題は、Access側に「Nullが来たらこう扱ってね」って教えてあげれば解決します。

そのための最強ツールが「Nz関数」なんです。

Nz関数の基本的な使い方

Nz関数(Null-to-Zero)は、名前の通り「Null値をゼロ(または好きな値)に変換する」ためのAccess専用関数です。

他のデータベースソフトにも似たような関数はあるんですが、Accessでは「Nz関数」が標準なんですね。

基本の書き方

Nz関数の書き方は、とってもシンプル。

引数は2つまで指定できます。

**書き方:Nz ( 調べたい値 , [Nullだった時の値] )**

1. **1つ目(必須)**:
Nullかどうかチェックしたいフィールド名や式を書きます。

2. **2つ目(省略OK)**:
1つ目がNullだったとき、代わりに何を返すか指定します。

2つ目を省略すると、Accessが自動で判断してくれます。

数値なら「0」、文字なら「空っぽの文字(空文字)」を返してくれるんですが、バグを防ぐためにも、ちゃんと2つ目まで書くのがおすすめです。

数値を扱うとき(Nullを0にする)

金額計算とか在庫管理とか、数値を計算するフィールドでNullが入るかもしれないときは、こう書きます。

**例:Nz([数量], 0)**

こう書くと、[数量]に値が入ってればその数字を、未入力(Null)だったら「0」を返してくれます。

これを使って「単価 × 数量」の計算式を作れば、数量が未入力でも「単価 × 0 = 0」になって、計算結果がNullになるのを防げるんです。

文字を扱うとき(Nullを空文字にする)

住所とか備考欄とか、文字データをつなげるときも注意が必要です。

普通、Accessでは「[姓] & [名]」みたいに `&` でつなげればNullは無視されるんですが、`+` でつなぐときや、特定の処理をするときは、Nullを「空文字(””)」に変えておく方が安全です。

**例:Nz([備考], “”)**

あと、CSVファイルに出力するときに「Null」じゃなくて「空欄」として出したいときにも、この書き方が便利です。

2つ目の引数に `””` (ダブルクォーテーション2つ)を書けば、はっきりと空文字に変換できます。

または、「データなし」って文字を表示したいときは、`Nz([備考], “データなし”)` って書くこともできますよ。

実際の仕事で使えるNz関数の活用例

ここからは、実際にAccessを使う場面でよくあるケースに合わせて、Nz関数の具体的な使い方を見ていきましょう。

クエリ、フォーム、レポートのそれぞれで活躍します。

1. クエリで計算フィールドを作るとき

クエリで新しい計算フィールドを作るとき、Nz関数はほぼ必須です。

たとえば、「売上」と「経費」から「利益」を計算する式を考えてみましょう。

経費がまだ入力されてない(Null)レコードがあると、普通の引き算では利益が表示されません。

**修正前:**
`利益: [売上] – [経費]`
(経費がNullだと、利益もNullになっちゃう)

**修正後(Nz関数を使う):**
`利益: Nz([売上], 0) – Nz([経費], 0)`

こう書けば、経費が未入力でも「売上 – 0」として計算されて、ちゃんと利益が表示されます。

合計や平均を出す集計クエリを作る前の準備としても、すごく大事なポイントです。

2. フォームやレポートのテキストボックスで使う

フォームやレポート上のテキストボックスでもNz関数は使えます。

たとえば、顧客データで「担当者名」が未入力のとき、空白じゃなくて「担当者未定」って表示したいとします。

そんなときは、テキストボックスの「コントロールソース」プロパティにこう書きます。

`=Nz([担当者名], “担当者未定”)`

あと、VBAを使わずにエラー表示を防ぐときにも使われます。

サブフォームの合計をメインフォームに表示するとき、サブフォームにデータが1件もないとエラーになることがあるんですが、`=Nz([サブフォーム].Form![合計], 0)` って書けば、データがないときは0円って表示できます。

3. IIf関数との使い分け(割り算のエラーを防ぐ)

Nz関数は「Nullを別の値に変える」のは得意なんですが、「0で割る」エラー(#Div/0!)までは防げません。

たとえば「達成率 = 実績 ÷ 目標」を計算するとき、目標が0やNullだとエラーになります。

Nz関数でNullを0にしても、結局「数字を0で割る」ことになって、エラーは解消しません。

こういうときは、条件分岐ができる「IIf関数」を使います。

**例:目標が0またはNullのときの対処**
`達成率: IIf(Nz([目標], 0) = 0, 0, [実績] / [目標])`

この式は、「もし目標が0(またはNull)なら0を表示、それ以外なら割り算を実行」っていう意味です。

Nz関数は「値の変換」、IIf関数は「条件による処理の分岐」。

用途に合わせて使い分けたり、上の例みたいに組み合わせたりするのが、しっかりしたAccessシステムを作るコツです。

知っておきたい注意点とちょっと進んだテクニック

最後に、Nz関数を使うときに知っておくべき注意点と、ちょっと進んだテクニックを紹介します。

これを知っておくと、予想外のトラブルを防げますよ。

データの型に影響することがある

Nz関数を通した値は、Access内部では「バリアント型(Variant)」っていう型で扱われることが多いです。

普通に使う分には問題ないんですが、厳密な数値としての扱いが必要な場面(特定の関数に渡すときとか、きっちり並べ替えたいときとか)では、思った通りに動かないことがあります。

もしクエリの結果が「数字なのに文字列みたいに左揃えになる」なんて現象が起きたら、変換関数を使ってデータ型をはっきりさせましょう。

* **CLng(Nz([数値フィールド], 0))**:長整数型に変換
* **CCur(Nz([金額フィールド], 0))**:通貨型に変換

こうやって型変換関数で囲めば、確実に数値データとして扱えます。

「空文字」と「Null」の違いに注意

最初に「Nullは虚無」って説明しましたが、Accessには「空文字(長さ0の文字列)」っていう概念もあります。

見た目はどっちも空白なんですが、システム的には別物なんです。

Nz関数は「Null」には反応しますが、もともとデータとして入ってる「空文字」には反応しません(変換されず、空文字のまま出てきます)。

* **Null**:未入力状態。

Nz関数で変換できる。

* **空文字**:ユーザーがわざと `””` を入れた場合とか、外部データを取り込んだときに発生。

Nz関数の対象外。

もし「Nullも空文字も、まとめて”未入力”って文字にしたい」ってときは、こんな工夫が必要です。

`IIf(Len(Nz([フィールド], “”)) = 0, “未入力”, [フィールド])`

これは「Nz関数で一旦空文字に統一して、その文字数が0なら未入力とみなす」っていうロジックです。

データをインポートするときとか、Nullと空文字が混ざりやすい環境では、この考え方がすごく役立ちます。

根本的な解決が必要なときもある

Nz関数は、あくまで「表示や計算のときに、その場で値を変換する」ためのものです。

テーブルに保存されてるデータそのものを書き換えるわけじゃありません。

もし、今後のデータ管理で「Nullがあること自体が問題」なら、更新クエリを使ってテーブル内のNullを一括で0や空文字に書き換えちゃうのも一つの手です。

さらに、テーブルのデザイン設定で、各フィールドの「既定値」を「0」に設定しておけば、新しいレコードを作るときに自動的に0が入って、最初からNullが発生しないようにできます。

「その場しのぎの表示対応」なのか、「データの作り方としての対応」なのかを見極めて、Nz関数とテーブル設計をうまく使い分けていきましょう。

広告