きなこSHOW

寝ながらあれこれ考える

Accessで「お待ちください」メッセージフォームを表示するサンプル

Accessで長い処理を実行している間、なんの音沙汰もないと不安になります。
その対策として、実行中に「お待ちください」みたいなメッセージを表示すれば、ユーザーに少し安心してもらえるかなと思います。
そんな時のためのお待ちくださいフォームを作りました。
コピーしてそのまま使えるサンプルを紹介します。

職場でAccessのちょっとしたツールを作って使っているのですが、
自分が使う分には、あー、このクエリ時間かかるやつだったよなー、
しゃーないタバコでも吸いに行くか、で済むのですが、
他の人に使ってもらうときは、けっこう気を使います。

そもそもクエリの書き方に気を付けて、遅くならないようにするのはもちろんですが、それでも処理に時間がかかってしまう時の対策として、実行中はメッセージを表示して、終わったら消す、みたいなユーザーフォームを使っています。
進行状況をプログレスバーで表示したりとか複雑なことは一切しません。
クエリを実行する前にメッセージを表示して、終わったら閉じるだけの
シンプルなフォームです。

お待ちくださいメッセージフォーム

今回は、Accessのフォーム1本と、標準モジュール1本の構成です。
まずは、フォームオブジェクトの設定から。

完成図


フォーム名:F_PreaseWait

フォーム名はご自分の命名規則に合わせて変えてくださいませ。
詳細セクションにラベルコントロールをひとつ配置しておきます。

フォームデザイン

[書式]
表題 (空白)
既定のビュー 単票フォーム
レコードセレクタ いいえ
移動ボタン いいえ
区切り線 いいえ
スクロールバー いいえ
コントロールボックス はい
閉じるボタン はい
最小化/最大化ボタン なし
[データ]
レコードソース (空白)
[イベント]
開く時 [イベント プロシージャ]
[その他]
ポップアップ はい
作業ウィンドウ固定 はい

フォームのサイズはお好きにどうぞ。

ラベルのプロパティ

名前 lblMsg
表題 ="実行中..." & CHR(13) & CHR(13) & "しばらくお待ちください"

ラベル名もご自分の命名規則に合わせて変更可能。
フォーム名やコントロール名を変更した場合、
以下のソースコード内のコントロール名もそれに合わせて読みかえてください。

フォームモジュール

フォームモジュールに以下を記述します。

フォームを開く時のイベント「Form_Open」では、
まずフォームの表題=タイトルバーにツールのタイトルをセットしているのと、
開く時に引数が渡された場合、それをラベル「lblMsg」の表題にセットします。
引数が渡されない場合は、フォームデザイン時に設定した表題のままフォームを表示します。

Publicプロシージャの「gDispMessage」では、
引数で受け取ったメッセージの内容をラベルの表題にセットし、フォームを再描画します。

フォームの設定は以上です。

標準モジュール側のソースコード

メッセージを渡してフォームを開いたり、閉じたりするためのプロシージャを、標準モジュールに記述します。
これをフォームモジュールに書いてしまうと動かないので、必ず標準モジュールに書いてください。

まずツールのタイトルとして、宣言セクションにグローバル定数「cgs_ToolTitle」を定義しています。
この定数の文言は任意で、ご自分のツールのタイトルを入力したり、「実行中」など、適宜変更してください。

次にPublicプロシージャの「gWaitMsg」では、
CurrentProject内のすべてのフォームからローカル定数「C_WAITFORM_NAME」に指定したフォーム名が存在するかチェックして、存在しなかった場合このプロシージャを抜けます。
フォームが存在する場合、第1引数が「True」だったらフォームを表示する方に、「False」だったらフォームを閉じる方に分岐します。

フォームを表示する方の処理でやっている事は、
フォームがまだ読み込まれていない場合、フォームの引数に当プロシージャの第2引数であるメッセージを渡してフォームをOpenします。
フォームがすでに読み込まれている場合、フォーム側の「gDispMessage」にメッセージを渡して呼び出します。
どちらの場合も、マウスポインタに砂時計ポインタを表示します。

フォームを閉じる方の処理では、マウスポインタを標準に戻し、フォームを閉じています。

呼び出し例

クエリ名「q_nageee」を実行するときはこんな感じに記述します。

フォームを開くのも閉じるのも、メッセージを設定するのもすべてグローバルプロシージャ「gWaitMsg」を使います。
下図のように、Accessのマクロからも呼び出すことができます。

注意したいのは、クエリの実行を「DoCmd.OpenQuery」で記述しちゃうと、たしか非同期(だったと思う...)のため、クエリがまだ終わっていなくても終了メッセージまでいっきに進んでしまうかもしれないので気を付けて。

...とまあこんな感じで、お役に立てれば嬉しいです。