〖ExcelVBA・マクロ〗MsgBoxを自動で閉じる方法|一定時間で自動Dismissする通知の作り方

MsgBoxを自動で閉じる方法 ExcelVBA

ExcelVBAでメッセージを出すとき、通常は次のように書きます。

vba msgboxの基本の書き方

しかしこの標準のMsgBoxはユーザーがボタンを押すまで処理が止まるため、次のようなニーズが出てきます。

  • 一定時間だけメッセージを表示して自動で閉じたい
  • ポップアップ案内をユーザー確認不要で消したい
  • ループ中の通知を一瞬だけ出して消したい

この記事では、MsgBoxの代わりに「一定時間経過で自動的に閉じるメッセージ」を作る方法を紹介します。


スポンサーリンク
スポンサーリンク

結論:標準MsgBoxは基本的に自動で閉じられない

まず大切なポイントです。

  • 通常の MsgBox は自動で閉じません
  • ユーザーがボタンを押すまで処理が止まります
  • 自動で閉じたい場合は、代替の仕組みを作る必要があります

この記事では、次の2つを紹介します。

  1. Windows APIを使ってMsgBoxを閉じる方法(応用)
  2. UserFormで「自動で閉じる通知」を作る方法(おすすめ)

方法①:Windows APIでMsgBoxを自動で閉じる(応用)

Windows APIを使うと「特定のウィンドウを探して閉じる」ことができます。
ただし環境依存もあるため、まずは仕組みを理解してから使うのがおすすめです。

下記コードは「タイトルが一致するMsgBox」を探し、指定秒数後に閉じます。

Option Explicit

#If VBA7 Then
    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As LongPtr

    Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" ( _
        ByVal hWnd As LongPtr, _
        ByVal wMsg As Long, _
        ByVal wParam As LongPtr, _
        ByVal lParam As LongPtr) As LongPtr
#Else
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
        ByVal lpClassName As String, _
        ByVal lpWindowName As String) As Long

    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
        ByVal hWnd As Long, _
        ByVal wMsg As Long, _
        ByVal wParam As Long, _
        ByVal lParam As Long) As Long
#End If

Private Const WM_CLOSE As Long = &H10

Sub AutoCloseMsgBox_API()

    Dim startTime As Double
    Dim hWnd As LongPtr
    Dim title As String

    title = "情報" ' MsgBox のタイトル
    startTime = Timer

    ' MsgBox を表示(別ウィンドウ)
    MsgBox "5秒後に自動で閉じます", vbInformation, title

    ' タイトル一致のウィンドウを探して閉じる
    Do
        hWnd = FindWindow(vbNullString, title)

        If hWnd > 0 Then
            If Timer - startTime >= 5 Then
                SendMessage hWnd, WM_CLOSE, 0, 0
                Exit Do
            End If
        End If

        DoEvents
    Loop

End Sub

注意点

  • 32bit/64bitで宣言が変わります(上のコードは両対応)
  • タイトルが一致しないと閉じられません
  • 業務ではUserForm版のほうが安定しやすいです

方法②:UserFormで「自動で閉じる通知」を作る(おすすめ)

こちらは標準MsgBoxを使わず、最初から「自動で閉じるウィンドウ」を作る方法です。
実務ではこちらのほうが扱いやすく、安全です。


ステップ①:UserFormを用意する

VBE(VBAエディタ)で、挿入 → UserForm を選びます。
以下のように準備してください。

  • UserForm名:frmAutoCloseMsg(任意)
  • Labelを1つ配置(メッセージ表示用)
  • LabelのNameを lblMessage に変更

ステップ②:UserForm側のコード(一定時間後に閉じる)

UserForm(frmAutoCloseMsg)のコードに貼り付けます。
表示後、3秒で自動クローズします。

Option Explicit

Private Sub UserForm_Activate()

    Dim startTime As Double
    startTime = Timer

    ' 自動で閉じるまでの時間(秒)
    Do While Timer < startTime + 3
        DoEvents
    Loop

    Unload Me

End Sub

表示時間を変えたい場合は「3」の部分を変更します。

Do While Timer < startTime + 5 ' 5秒表示

ステップ③:呼び出し用のマクロ(標準モジュール)

標準モジュールに貼り付けてください。

Option Explicit

Sub ShowAutoCloseMessage(ByVal msg As String)

    frmAutoCloseMsg.lblMessage.Caption = msg
    frmAutoCloseMsg.Show vbModeless ' モードレス(作業を止めにくい)

End Sub

Sub Test_AutoClose()

    ShowAutoCloseMessage "処理が完了しました!"

End Sub

ポイント:vbModeless(モードレス)

  • モードレスにすると、表示中でもExcel操作がしやすくなります
  • 「一瞬通知して消える」用途に向きます

よくあるカスタマイズ

文字を大きくする

frmAutoCloseMsg.lblMessage.Font.Size = 14

文字色を変える

frmAutoCloseMsg.lblMessage.ForeColor = vbRed

メッセージを中央寄せにする(プロパティ)

Labelのプロパティで TextAlign = 2(中央) にします。


まとめ:MsgBoxを自動で閉じたいならUserFormが安定

  • 標準MsgBoxは基本的に自動で閉じられない
  • APIで閉じる方法は可能だが、環境依存・難易度高め
  • UserFormで自動閉じ通知を作るのが一番おすすめ

「処理完了の通知」「注意メッセージの一時表示」などに使えるので、ぜひテンプレとして保存しておくと便利です。

スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

タイトルとURLをコピーしました