業務アプリケーションを作成しているときに、動作の確認のため、メッセージボックス(Msgbox)をよく使うと思います。例えばこんな感じです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Option Explicit Private Sub CommandButton1_Click() '「●●を実行」ボタンがクリックされた時 '実行するかメッセージボックスで確認 '「いいえ」の場合、フォームに戻る If MsgBox("●●を実行しますか?", vbYesNo + vbQuestion) = vbNo Then Exit Sub '「はい」の場合、処理を続ける ' ・・・(省略) '終了の通知 MsgBox "終了しました。", vbOKOnly + vbInformation End Sub |
フォーム上のボタンをクリックすると、最初のメッセージボックスのところ(上のリストで7行目)で、「はい」か「いいえ」を確認するメッセージボックスを表示します。
「いいえ」がクリックされたとき、このプロシージャから抜けて(Exit Sub)フォームに戻ります。「はい」がクリックされると、以下のコードが実行され、最後に通知をして(15行目)終了します。
最初の「はい」「いいえ」は別として、最後の終了の通知のあとも「OK」をユーザーにクリックして閉じさせるのは面倒だと感じたので、色々試したところ、2秒ぐらいで勝手に閉じても問題ないと思いました。
Windows Scripting HostのPopup機能を使えば良いのですが、その都度、変数を宣言してオブジェクトを生成して・・・っていうのを繰り返し記述するのは面倒なので、そのようなプロシージャを作ってしまえばよいことに気付きました。
2秒で自動的に閉じるメッセージボックス
仕様
私はこのような仕様としました。
- メッセージボックスに表示する言葉(Prompt)は引数として必ず渡す。
- バーに表示するタイトル(Title)は引数として渡すが、省略したときは何も表示しない。
- メッセージボックスに表示するアイコンは情報表示(iマーク, vbInformation)に、ボタンは「OK」のみ(vbOkOnly)に固定する。(そもそも通知を対象としており、問いかけや警告の場合は自動的に閉じる必要性がありません。)
- 自動的に閉じるまでの秒数は2秒に固定する。(3秒以上では長いと感じました。)
- 自動的に閉じたか、OKボタンで2秒以内に閉じたかによって処理を分ける必要はないため、戻り値は要らない、したがって、FunctionプロシージャでなくSubプロシージャとする。
- 複数のフォームから使用できるよう、標準モジュールに作成する。
ここまで設計できれば、コーディングは簡単ですね。
アイコンや閉じる秒数を変えたい場合は、それらも引数として渡してやれば良いと思います。
コード
標準モジュールを用意して、以下のコードを追加します。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Public Sub MsgBox2(Prompt, Optional Title) Dim WSH As Object Set WSH = CreateObject("WScript.Shell") 'タイトルの引数が省略されたらブランクにする。 If IsMissing(Title) Then Title = "" WSH.Popup Prompt, 2, Title, vbOKOnly + vbInformation Set WSH = Nothing End Sub |
使用例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Option Explicit Private Sub CommandButton1_Click() '●●を実行 '実行するかメッセージボックスで確認 '「いいえ」の場合、フォームに戻る If MsgBox("●●を実行しますか?", vbYesNo + vbQuestion) = vbNo Then Exit Sub '「はい」の場合、処理を続ける ' ・・・(省略) ' 終了の通知 ' MsgBox "終了しました。", vbOKOnly + vbInformation MsgBox2 "終了しました。" End Sub |
最初の例で、15行目の代わりに17行目のように書くだけです。