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関数とテーブル設計をうまく使い分けていきましょう。
広告
