Access VBAのNull判定についてお探しですね。

広告

Access VBAでのNull判定、ちゃんと理解してますか?IsNull関数と空白文字列の正しい扱い方

Access VBAでプログラムを書いていると、突然「実行時エラー ’94’: Nullの使い方が不正です」って出てきて、「え、何これ?」ってなったことありませんか?あるいは、「空っぽだったら処理をスキップする」って書いたつもりなのに、なぜかそのまま処理が進んじゃって、データがおかしくなっちゃった…なんて経験をした人も多いんじゃないでしょうか。

Accessはデータベースを扱うツールなので、「値が入っていない状態」を表す「Null」というものをちゃんと理解しておく必要があります。

この記事では、初心者が特につまずきやすい「Null」と「空白文字列」の違いをわかりやすく説明して、IsNull関数やNz関数を使った正しい判定方法を紹介していきます。

これを読めば、今まであいまいだったNull判定に自信が持てるようになりますよ!

「Null」と「空白文字列」って何が違うの?

エラーの出ないしっかりしたプログラムを書くには、まず「Null」「空白文字列(””)」「Empty」という3つの状態の違いを理解しておく必要があります。

見た目はどれも「空っぽ」に見えるんですが、プログラムの中では全然違うものとして扱われるんです。

**Null**は、データベース特有の考え方で、「値そのものが存在しない・未定義」っていう状態です。

「有効なデータが入っていない」ことを意味していて、計算(足し算とか文字列の結合とか)をすると、結果も全部Nullになっちゃうという強力な性質があります。

一方、**空白文字列**は、長さ0の文字列(””)のことで、「文字データとしては存在してるけど、中身が空っぽ」っていう状態です。

たとえば、フォームのテキストボックスに何か入力した後、Backspaceで全部消した場合なんかは、設定によってはNullじゃなくて空白文字列になることがあります。

そして**Empty**は、変数を作ったばかりで、まだ何も入れていない初期状態のことです。

Access VBAで特に気をつけたいのが、**String型(文字列型)の変数にはNullを入れられない**ということ。

String型の変数にうっかりNullが入るような処理をしちゃうと、すぐにエラーが出ます。

だから、Nullが入る可能性がある変数は、どんなデータでも入れられる**Variant型(バリアント型)**で宣言するのがルールです。

IsNull関数を使った正しい判定方法

「変数がNullかどうか」を調べたいとき、つい `If 変数 = Null Then` って書きたくなりますよね。

でも、これはVBAでは間違いで、思った通りには動きません。

なぜかというと、Nullはどんな値とも「等しい」って判定されないからなんです。

Nullと比較演算子(=)で比較すると、その結果自体が「True」でも「False」でもなく「Null」になっちゃいます。

If文はTrueの時だけ処理を実行するので、結果として「Nullなのに、Nullじゃないって判断された」みたいな動きになっちゃうんです。

これがバグの原因になることが多いんですね。

そこで使うのが、VBAに最初から用意されている**「IsNull関数」**です。

この関数は、指定した値がNullならTrueを、そうじゃなければFalseを返してくれます。

使い方はとってもシンプルで、`If IsNull(変数) Then` って書くだけ。

これなら確実にNullを見つけて、エラー処理や別の処理に切り替えることができます。

特に、テーブルやクエリからデータを取ってくるとき、フィールドの値が空だったらそれは基本的にNullとして取得されます。

だから、データベースから取ってきた値を使うときは、必ずIsNull関数でチェックするか、これから説明するNz関数で安全な値に変換してから使う癖をつけましょう。

これがAccess VBA上達への近道です!

実務で超便利な「Nz関数」の使い方

IsNull関数と同じくらいよく使うのが**「Nz関数」**です。

これは「Null to Zero(NullをZeroに)」みたいな意味で、対象の値がNullだったら、指定した別の値に変換してくれる便利な関数なんです。

基本的な書き方は `Nz(調べる値, Nullの場合の戻り値)` です。

たとえば、`Nz(Me.txtKingaku, 0)` って書けば、金額入力欄がNullだったら自動的に数値の0に変換してくれます。

`Nz(Me.txtName, “”)` なら、名前入力欄がNullの場合に空白文字列(””)に変換してくれます。

第二引数を書かなかった場合は、状況に応じて0か空白文字列が自動的に使われます。

Nz関数の良いところは、**コードがすごく短く書ける**ことです。

IsNull関数を使ってIf文で分岐させて、Nullの場合の処理を書くと何行にもなっちゃう処理が、Nz関数なら1行で済んじゃいます。

特に、複数のフィールドの値を足し合わせる計算とか、文字列をつなげて表示する処理では、一つでもNullが混じると結果全体がNullになっちゃうので、Nz関数でガードしておくのは必須テクニックと言えます。

ただし、注意点もあります。

あえて「未入力(Null)」と「0」や「空文字」を区別したい場合は、Nz関数を使っちゃうと情報が失われちゃいます。

データ分析なんかで「値がまだ入力されていないこと」自体に意味がある場合は、安易にNz関数で埋めずに、IsNull関数できちんと判定を行うべきです。

「値が入っていない」を完璧にチェックする方法

実際のアプリ開発では、ユーザーがフォームに入力するとき、いろんなパターンがあります。

「何も入力せずに次の項目へ移動した(Null)」のか、「一度入力したものを消した(空白文字列)」のか、あるいは「スペースキーだけが押されている(空白のみ)」のか…。

これらを全部まとめて「未入力」として扱いたい場合、IsNull関数だけだと空白文字列をスルーしちゃいますし、単に `Variable = “”` だけだとNullの時にエラーになる可能性があります。

そこで、実務で一番よく使われる「鉄板の未入力チェック」の書き方を覚えておきましょう。

一番使いやすくて安全な判定方法は、**Nz関数とLen関数(文字数を数える関数)、そしてTrim関数(前後のスペースを取り除く関数)を組み合わせる**方法です。

具体的にはこう書きます。

“`
Len(Trim(Nz(対象のコントロール, “”))) = 0
“`

このコードの意味を順番に見ていくと、まず `Nz(…, “”)` でNullを安全に空白文字列に変換します。

次に `Trim(…)` で、もしスペースだけが入力されていたらそれを取り除きます。

最後に `Len(…)` で文字数を数えて、それが0だったら「実質的に何も入力されていない」って判断するわけです。

この1行の判定式を使うだけで、Null、空白文字列、スペースのみの入力という3つのパターンを全部キャッチできます。

フォームの「登録ボタン」を押したときの必須入力チェックなんかは、この書き方で統一しておくと、予期せぬエラーやデータの不備を防げます。

Access VBAでのNull判定は、このパターンを基本として覚えておくことを強くおすすめします!

広告