2秒で自動的に閉じるメッセージボックス

業務アプリケーションを作成しているときに、動作の確認のため、メッセージボックス(Msgbox)をよく使うと思います。例えばこんな感じです。

フォーム上のボタンをクリックすると、最初のメッセージボックスのところ(上のリストで7行目)で、「はい」か「いいえ」を確認するメッセージボックスを表示します。

msgbox1

「いいえ」がクリックされたとき、このプロシージャから抜けて(Exit Sub)フォームに戻ります。「はい」がクリックされると、以下のコードが実行され、最後に通知をして(15行目)終了します。

msgbox2

最初の「はい」「いいえ」は別として、最後の終了の通知のあとも「OK」をユーザーにクリックして閉じさせるのは面倒だと感じたので、色々試したところ、2秒ぐらいで勝手に閉じても問題ないと思いました。

Windows Scripting HostのPopup機能を使えば良いのですが、その都度、変数を宣言してオブジェクトを生成して・・・っていうのを繰り返し記述するのは面倒なので、そのようなプロシージャを作ってしまえばよいことに気付きました。

2秒で自動的に閉じるメッセージボックス

仕様

私はこのような仕様としました。

  • メッセージボックスに表示する言葉(Prompt)は引数として必ず渡す。
  • バーに表示するタイトル(Title)は引数として渡すが、省略したときは何も表示しない。
  • メッセージボックスに表示するアイコンは情報表示(iマーク, vbInformation)に、ボタンは「OK」のみ(vbOkOnly)に固定する。(そもそも通知を対象としており、問いかけや警告の場合は自動的に閉じる必要性がありません。)
  • 自動的に閉じるまでの秒数は2秒に固定する。(3秒以上では長いと感じました。)
  • 自動的に閉じたか、OKボタンで2秒以内に閉じたかによって処理を分ける必要はないため、戻り値は要らない、したがって、FunctionプロシージャでなくSubプロシージャとする。
  • 複数のフォームから使用できるよう、標準モジュールに作成する。

ここまで設計できれば、コーディングは簡単ですね。
アイコンや閉じる秒数を変えたい場合は、それらも引数として渡してやれば良いと思います。

コード

標準モジュールを用意して、以下のコードを追加します。

使用例

最初の例で、15行目の代わりに17行目のように書くだけです。

関連記事