絶対に失敗しない!自動的に閉じるMsgBoxの作り方
VBA(マクロ)のプログラムを作成する中で、一定の時間が経過したら 自動で消えるメッセージを表示したい場合が出てくると思います
その時使えるコードを2通り記載し、使いやすさを比べてみました
本ページにはプロモーションが含まれています
検証しました
例文1
Sub test1()
Dim WSH As Object
Set WSH = CreateObject("WScript.Shell")
WSH.Popup "ファイルを選択してください", 3, _
"メッセージ", vbOKOnly
Set WSH = Nothing
End Sub
解説1
例文1で操作する場合、事前設定が必要になります
VBA(マクロ)を実行するブックで「Visual Basic Editor」を開き、「ツール」タブをクリックして参照設定を開きます
参照設定画面の参照可能なライブラリから「Windows Script Host Object Model」を探し、チェックを入れ「OK」をクリックします
これで2行目の「CreateObject("WScript.Shell")」が使用可能になります
- 1行目:WSHをオブジェクト型変数として宣言します
- 2行目:変数にCreateObject関数の「WScript.Shell」を設定します
- 3行目:PopupメソッドでMsgBoxを表示します
- 4行目:変数を初期化します
書き方はMsgBoxに表示する文字, 閉じるまでの秒数, MsgBoxのタイトル, アイコンやボタンの種類の順にカンマ「,」で区切って記入します
これが一般的な方法ですが、実は問題点が2つあります
それは
- 参照設定が必要な事
- Excel2019では使えなかった事
です
つまり、自分が使うには問題ないが プログラムを不特定多数の人に配布する場合、思惑通りに動作しないことが起こるという事です
自分だけ使う場合ならMsgBoxやエラー回避などはいらないので、例文1の方法は不評を買う可能性がある事を理解して使う必要があります
そこで使用環境に影響されない別の方法を紹介します
例文2
Sub test2()
UserForm1.Show
End Sub
Sub CloseInfo()
Unload UserForm1
End Sub
解説2
- 標準モジュールにコードを書く
- 「UserForm1」を作る
- 「UserForm1」の形を整える
- メッセージを表示する「Label」を追加する
- 「OK」ボタンを追加する
- 「UserForm1」にコードを書く
- 1行目:UserFormのタイトルを「メッセージ」に変更する
- 2行目:Labelに表示する文字を設定する
- 3行目:3秒後に「CloseInfo」を呼び出しUserForm1を閉じます
Sub Test2の「UserForm1.Show」でMsgBox代わりに使うユーザーフォームを表示し、Sub CloseInfoの「Unload UserForm1」でユーザーフォームを閉じます
作り方はTest2を記述した標準モジュール上で右クリック、「挿入」にカーソルを合わせ「ユーザーフォーム」をクリックします
プロパティで「UserForm1」の大きさを、幅(Width):120、高さ(Height):93.75に設定します
もしプロパティウィンドが表示されていない場合は「表示」タブをクリックして、「プロパティウィンド」をクリックすることで画面に表示されるようになります
ツールボックスでラベル(Label)をクリックして、幅:100、高さ:20(Left:12、Top:14)に設定します
ツールボックスからコマンドボタン(Command Button)をクリックして、幅:58、高さ:20(Left:40、Top:45)表示する文字(Caption)にOKを記入します
「UserForm1」を右クリックして「コードの表示」をクリックする
以下のコードを書きます
Private Sub UserForm_Initialize()
UserForm1.Caption = "メッセージ"
Label1.Caption = "ファイルを選択してください"
Application.OnTime Now + _
TimeValue("00:00:03"), "CloseInfo"
End Sub
それまでの間、UserForm1が表示されています
実際の動作を確認する
では例文1、例文2の動作を動画で確認します
いかがでしょうか?
UserFormを使ってもサイズを合わせれば、通常のMsgBoxと見分けがつかないぐらいになりますし、「TimeValue」関数が正確な時を刻むので狙い通りの動作も可能になり、使用環境に影響されないプログラムが完成します
★狙い通り…プログラマーとして一番うれしい言葉ですね!★
コメント