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判定は、このパターンを基本として覚えておくことを強くおすすめします!
広告
