【Access】テキストボックスの空白判断で気を付ける事!

こんにちは! イマジネットPCサポートの橋崎です。

最近このネタが多くて申し訳ないのですが、また久しぶりに受注したAccessデータベースネタです。

Accessをご存知なくてもなるべくわかるようにしているので、よろしければご覧ください。

お客様はAccessの知識がない方が大半です。

少しだけ前置きのお話をします。

受注して作成するデータベースで意外に大変な作業ってわかりますか?

納品先のお客様はMicrosoft Accessの操作方法をご存知ない方がほとんどです。そのためAccessの操作を知らなくても迷うことないように操作できるようにフォームを作成します。

それと同時にエラーを発生させない事が重要です。

なぜならエラーが発生すると作業が中断してお仕事に支障が出ます。

それにほとんどのお客様にはAccess製品ではなくAccessランタイムを使用するのでエラーが出ると問答無用でアプリがシャットダウンされて訳が分かりません。

Accessランタイム

AccessランタイムはMicrosoftから無料で提供されているAccessファイルを動作させるためのプログラムです。動作させるためだけなのでクエリ等、内部の編集等はできません。また一部の機能(マウスでの文字コピー操作等)で制限がありますが、基本的にあまり問題はありません。

そのように使用中に何度もシャットダウンを繰り返せばお客様からのクレームは必須です。

ですからなるべくエラーを発生させてはいけませんが、こればかりは経験上、お客様の操作が読めない時が結構あるんですよ!

ですから色々な事を想定して「あーでもない、こーでもない」と結構、地味で根気のいる作業が続きます。

今回のお話はそのようなエラーを発生させない仕組みの内容なのですが、テキストボックスの空白判断に焦点を当ててみました。

テキストボックス内の空白を判断する!

テキストボックスの空白判断は以下のような状況で活用します。

下の画像は今回作成した売上履歴を検索するフォームです。

お客様によりますが、日常的に入力する売上伝票は数年で少なくとも数万単位の件数が入力されます。そのような件数から目的の履歴を探すのは検索の仕組みがなければ大変です。

例えば2023/08/01~2023/08/31、一ヶ月間の売上履歴を検索する場合は「検索期間」の横にあるテキストボックスに開始日と終了日を入力する必要があります。そして次に横にある矢印のボタンを選択すれば検索結果が下に一覧として表示されます。

そして検索結果の横にあるボタンを選択すると詳細が確認できる仕組みです。

普通は先に検索条件を入力する事から始めると思います。

今回であれば期間を示す日付ですね。

しかし現実はそうではなく、入力より先に間違ってボタンを選択する方もいるのです。

その場合はエラーが発生してAccessランタイムを使用している場合は強制終了してしまいます。

またエラーにならないとしてもメニュー上には何の変化もありません。(検索結果が表示されない。)

つまり間違った操作をした事も気が付かないのです。

では、それを回避するのはどうすればよいのでしょうか?

エラーの原因は?

そもそもエラーの原因は検索条件の日付が未入力であった事です。

やはり人間が操作しますから、いくら検索条件の入力から初めて下さい。と、お願していてもうっかりする時はします。

やはりそれ込みの前提で考えなければいけません。

では、こうしたらどうでしょう!

間違って先にボタンを選択した時に日付を入力するテキストボックスに文字の入力がなければ(空白)ユーザーにその事をお知らせして動作を止める指示を出すVBAを書けばよいのではないでしょうか。

それにはテキストボックスの空白の状態を判断できれば上手く出来そうです。

ではテキストボックスの空白判断はどうすれば良いのでしょうか?

IsNull関数

Accessには「IsNull」関数と言ってテキストボックスが空白かどうかを判断してくれる優れた関数が用意されています。

この関数と「IF」文を組み合わせる事で動作の制御ができそうですね。

日本語で表現すると

もし 検索期間のテキストボックスが空白であれば、「期間が未入力です。」とメッセージを出し動作をストップする。
それ以外は検索結果を表示させる。

VBAでは

IF IsNull(Me.日付を入力するテキストボックス名) Then
  MsgBox “期間が未入力です。”
  Exit Sub
Else
  クエリをデータソースにする
End IF

VBAはサンプルで最小限の記述です。

では未入力で実行してみましょう。

ちゃんと未入力である事をお知らせしています。

動作も止まっているのでエラーもなくお客様もこれで日付入力を忘れている事に気が付きますね。

勿論。入力されていれば検索結果が表示されます。

これで一件落着ですね!

中々そう上手くはいきません。

実はこの検索するフォームには「検索解除」と言うボタンを設置しています。

このボタンは入力した検索条件をテキストボックスから削除する事と検索結果一覧を初期状態に戻す機能を持たせています。

検索結果一覧を初期状態に戻す

このシステムでは検索フォームを最初に開いた状態で検索結果一覧に直近のデータが新しい順から古い順に下へ並んでいます。この状態が初期状態です。

この状態から検索をすると初期状態ではなく検索結果へ一覧が変更します。

「検索解除」ボタンはこの検索結果をクリアして初期状態へ戻す機能も追加しています。

例えば検索条件に「2023/09/01」~「2023/09/07」と「株式会社 あんなこと商事」が入力されています。この状態で右の「検索解除」を選択すると

消えました。

では、この状態から先ほどと同じように検索ボタンを選択してみると・・・

サンプル画像はありませんが

なんと 「期間が未入力です。」の表示が出ません。

表示が出たテキストボックスを見比べてみましょうか。

表示が出たこちらと

出ないこちら

見た目ではどちらも空白に見えますが・・・

なぜ検索解除ボタンを設置しているのか

今回ご紹介している検索フォームは目的のデータ(売上履歴)を検索するために使用します。検索では何度も検索条件を変更する場合が多く、その度にカーソルを移動させて条件を削除するのは手間がかかるのでそれを軽減する目的です。

本来であれば検索条件の入替は削除の必要はなく上書きでも実行が可能です。

しかし大半のお客様は一度、検索条件を削除してから再入力を行う方が多く当店もこのような機能を設置しています。

実は空白ではなかった!

「検索解除」では一体どのような処理をしていたのでしょうか。

実はテキストボックスを空白にするために「Null値」と言うものを代入していました。

実際のVBAはこのように書きます。

Me.文字を消したいテキストボックスの名前 =  “”

この「””」がNull値と言われるもので、これをテキストボックスに代入すると文字が消えます。

しかしこれはデータがなくなっている訳ではなく、表面上見えないけれど「””」が存在している訳なんです。

しがってデータがある以上「IsNull」関数は「ある」と認識するので動作としては正常なのです。

これって どうしましょうかね?

単純にこうしましょう!

あくまで一例としてください。

今回ご紹介する方法は「こんな方法もあるんだー」と言う一例として捉えてください。

見えないけど「””」が入力されているのなら、先ほどの「IF」文の条件にそれも追加してみたらどうでしょう。

このように太字部分の条件を追加しました。

もし 検索期間のテキストボックスが空白 かつ「””」であれば「期間が未入力です。」とメッセージを出し動作をストップする。
それ以外は検索結果を表示させる。

この条件をVBAに書き換えて追加すると太字のようになります。

IF IsNull(Me.日付を入力するテキストボックス名) Or (Me.日付を入力するテキストボックス名) = “” Then
  MsgBox “期間が未入力です。”
  Exit Sub
Else
  クエリをデータソースにする
End IF

早速、試してみましょう「検索解除」を選択後、実行してみると

無事、表示されていますね。

これで空白と「Null値」どちらの状態でも案内表示が出るようになりました。

あとがき

一見、見た目は同じ空白でしたが、前提の処理によって同じ空白でも違う事がわかって頂けたと思います。

Accessでデータベースを作成するには以前の記事にも書いた様にAccessにない機能を作成する必要もあると書きました。確かこの記事では「行挿入」の件だと思います。

今回の件でも「IsNull」関数で全て判断できれば良いのですが、そうもいかないようでした。

この記事を読んで頂いた方は

「なんとめんどくさい Accessって絶対勉強したくない!」と、思われるかも知れませんね。

確かにそのような事がAccess自体ExcelやWordと比べるとあまり普及していない要因の一部になっているのは否定できません。

しかし逆を言えばAccessでデータベースが作成出来るようになればあなたの希少性が上がる事も十分考えられますね!

今回はこれでお開きにしましょう。

それでは!

ご注意

記事内容についてのご質問の受付は時間が取れませんので行っておりません。

ご自身が使用しているパソコンの状態・環境により、同じような症状であっても同じとは限りません。したがって記事に書かれている内容を行う事で必ずトラブルが解消されるとは限りません。またこの記事を参考に作業される場合は自己責任でお願いします。作業された場合での損害や障害が発生しても当店は一切責任は負いませんのでご了承下さい。

この記事の内容は投稿日時点での内容です。時期によっては仕様などの変更により、この記事のとおりではない場合もございます。