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

しかしこの標準のMsgBoxはユーザーがボタンを押すまで処理が止まるため、次のようなニーズが出てきます。
- 一定時間だけメッセージを表示して自動で閉じたい
- ポップアップ案内をユーザー確認不要で消したい
- ループ中の通知を一瞬だけ出して消したい
この記事では、MsgBoxの代わりに「一定時間経過で自動的に閉じるメッセージ」を作る方法を紹介します。
結論:標準MsgBoxは基本的に自動で閉じられない
まず大切なポイントです。
- 通常の MsgBox は自動で閉じません
- ユーザーがボタンを押すまで処理が止まります
- 自動で閉じたい場合は、代替の仕組みを作る必要があります
この記事では、次の2つを紹介します。
- Windows APIを使ってMsgBoxを閉じる方法(応用)
- 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で自動閉じ通知を作るのが一番おすすめ
「処理完了の通知」「注意メッセージの一時表示」などに使えるので、ぜひテンプレとして保存しておくと便利です。


コメント