VBA(マクロ)の知って得ワザ vol.4

絶対に失敗しない!自動的に閉じる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を表示します
  • 書き方はMsgBoxに表示する文字, 閉じるまでの秒数, MsgBoxのタイトル, アイコンやボタンの種類の順にカンマ「,」で区切って記入します


  • 4行目:変数を初期化します

これが一般的な方法ですが、実は問題点が2つあります


それは

  1. 参照設定が必要な事

  2. Excel2019では使えなかった事

です


つまり、自分が使うには問題ないが プログラムを不特定多数の人に配布する場合、思惑通りに動作しないことが起こるという事です


自分だけ使う場合ならMsgBoxやエラー回避などはいらないので、例文1の方法は不評を買う可能性がある事を理解して使う必要があります


そこで使用環境に影響されない別の方法を紹介します


例文2

Sub test2()

UserForm1.Show

End Sub


Sub CloseInfo()

Unload UserForm1

End Sub


解説2

  1. 標準モジュールにコードを書く
  2. Sub Test2の「UserForm1.Show」でMsgBox代わりに使うユーザーフォームを表示し、Sub CloseInfoの「Unload UserForm1」でユーザーフォームを閉じます


  3. 「UserForm1」を作る
  4. 作り方はTest2を記述した標準モジュール上で右クリック、「挿入」にカーソルを合わせ「ユーザーフォーム」をクリックします


  5. 「UserForm1」の形を整える
  6. プロパティで「UserForm1」の大きさを、幅(Width):120、高さ(Height):93.75に設定します

    もしプロパティウィンドが表示されていない場合は「表示」タブをクリックして、「プロパティウィンド」をクリックすることで画面に表示されるようになります


  7. メッセージを表示する「Label」を追加する
  8. ツールボックスでラベル(Label)をクリックして、幅:100、高さ:20(Left:12、Top:14)に設定します


  9. 「OK」ボタンを追加する
  10. ツールボックスからコマンドボタン(Command Button)をクリックして、幅:58、高さ:20(Left:40、Top:45)表示する文字(Caption)にOKを記入します


  11. 「UserForm1」にコードを書く
  12. 「UserForm1」を右クリックして「コードの表示」をクリックする


    以下のコードを書きます

    Private Sub UserForm_Initialize()


    UserForm1.Caption = "メッセージ"

    Label1.Caption = "ファイルを選択してください"

    Application.OnTime Now + _

    TimeValue("00:00:03"), "CloseInfo"

    End Sub


    • 1行目:UserFormのタイトルを「メッセージ」に変更する

    • 2行目:Labelに表示する文字を設定する

    • 3行目:3秒後に「CloseInfo」を呼び出しUserForm1を閉じます
    • それまでの間、UserForm1が表示されています

実際の動作を確認する

では例文1、例文2の動作を動画で確認します




いかがでしょうか?


UserFormを使ってもサイズを合わせれば、通常のMsgBoxと見分けがつかないぐらいになりますし、「TimeValue」関数が正確な時を刻むので狙い通りの動作も可能になり、使用環境に影響されないプログラムが完成します


★狙い通り…プログラマーとして一番うれしい言葉ですね!★

コメント