ExcelのVBAでマクロを作っていると、「処理が完了したことをユーザーに知らせたい」「削除する前に確認を取りたい」「エラーが発生したときに原因を表示したい」という場面が必ず出てきます。
そのときに使うのがMsgBox関数です。ダイアログボックスを表示してユーザーにメッセージを伝えたり、ボタンの選択結果を受け取って処理を分岐させたりできる、VBAの基本かつ重要な機能のひとつです。しかし「ボタンの種類が多くてどれを使えばいいか分からない」「返り値をどう扱えばいいか迷う」「メッセージを見やすくする方法を知りたい」という方も多いのではないでしょうか。
本記事では、MsgBoxの基本構文から引数の使い方、ボタン種類と返り値の一覧、条件分岐への応用、実践的な使用例まで、初心者の方でもすぐに活用できるよう体系的に解説します。
VBAのMsgBoxとは

MsgBoxの基本概念
MsgBox(メッセージボックス)はVBAに組み込まれた関数で、画面上にダイアログボックスを表示してユーザーにメッセージを伝えます。マクロの実行中に一時停止してユーザーの応答を待ち、選択したボタンに応じて次の処理を制御することができます。
MsgBoxには2つの使い方があります。
- ステートメントとして使う:メッセージを表示するだけで返り値を使わない
- 関数として使う:返り値を変数に格納してボタンの選択結果を処理に活用する
表示できるメッセージの種類
情報メッセージ
処理の完了通知や結果の報告など、ユーザーに情報を伝えるためのメッセージです。青い「i」のアイコンが表示され、OKボタンのみが配置されるのが一般的です。
警告メッセージ
ユーザーに注意を促したい場面で使います。黄色い「!」の警告アイコンが表示されます。操作を続けてよいかどうかを確認するYes/Noボタンと組み合わせることが多いです。
質問メッセージ
ユーザーに選択肢を提示して回答を求める場面で使います。「?」のクエスチョンアイコンが表示され、YesNoやYesNoCancelなどのボタンと組み合わせてユーザーの意思確認を行います。
MsgBoxの基本構文

基本的な書き方
MsgBoxの基本構文は以下のとおりです。
' ステートメントとして使う(返り値不要)
MsgBox "表示するメッセージ"
' 関数として使う(返り値を変数に格納) Dim result As Integer result = MsgBox("表示するメッセージ", ボタン定数, "タイトル")
最もシンプルな使い方は引数にメッセージ文字列だけを指定する形です。
MsgBox "処理が完了しました。"
これだけでOKボタン付きのダイアログが表示されます。
引数の意味(Prompt, Buttons, Title)
| 引数 | 必須・任意 | 内容 |
|---|---|---|
| Prompt | 必須 | ダイアログに表示するメッセージ文字列 |
| Buttons | 任意 | ボタンの種類・アイコン・デフォルトボタンの指定 |
| Title | 任意 | タイトルバーに表示する文字列 |
Prompt:表示する文字列
ダイアログボックスに表示するメッセージです。文字列定数、変数、文字列結合式などを指定できます。最大約1024文字まで表示可能です。
Dim userName As String
userName = "田中"
MsgBox userName & "さんの処理が完了しました。"
Buttons:ボタンの種類とアイコン
Buttons引数はボタンの種類とアイコンの種類を数値または定数で指定します。複数の設定を組み合わせる場合は+で足し合わせます。
' OKボタン+情報アイコン
MsgBox "処理完了", vbOKOnly + vbInformation, "通知"
' はい・いいえボタン+質問アイコン Dim result As Integer result = MsgBox("続けますか?", vbYesNo + vbQuestion, "確認")
Title:タイトルバーに表示する文字列
ダイアログボックスの上部タイトルバーに表示される文字列です。省略するとアプリケーション名(通常は「Microsoft Excel」)が表示されます。システム名やツール名を入れると、どのマクロからのメッセージか分かりやすくなります。
MsgBox "データのバックアップが完了しました。", vbOKOnly + vbInformation, "バックアップツール"
ボタンの種類と返り値

OK、OKCancel、YesNo、YesNoCancelなどの使い分け
| 定数 | 値 | 表示されるボタン | 向いている場面 |
|---|---|---|---|
| vbOKOnly | 0 | OK | 通知・完了報告 |
| vbOKCancel | 1 | OK・キャンセル | 続行か中断かの確認 |
| vbYesNo | 4 | はい・いいえ | 二択の意思確認 |
| vbYesNoCancel | 3 | はい・いいえ・キャンセル | 三択の選択処理 |
| vbRetryCancel | 5 | 再試行・キャンセル | エラー発生時の再試行確認 |
アイコンの種類は以下のとおりです。
| 定数 | 値 | アイコン | 用途 |
|---|---|---|---|
| vbCritical | 16 | 赤い×(停止) | 重大なエラー |
| vbQuestion | 32 | 青い? | 質問・確認 |
| vbExclamation | 48 | 黄色い! | 警告・注意 |
| vbInformation | 64 | 青いi | 情報・通知 |
返り値を変数に格納して条件分岐
vbOK、vbCancel、vbYes、vbNoなどの定数
| 定数 | 値 | 意味 |
|---|---|---|
| vbOK | 1 | OKが押された |
| vbCancel | 2 | キャンセルが押された |
| vbYes | 6 | はいが押された |
| vbNo | 7 | いいえが押された |
| vbRetry | 4 | 再試行が押された |
条件分岐で処理を変える例
Sub ConfirmDelete()
Dim result As Integer
result = MsgBox("このデータを削除しますか?", vbYesNo + vbQuestion, "削除確認")
If result = vbYes Then
' はいが押された場合の処理
Range("A1").ClearContents
MsgBox "削除しました。", vbOKOnly + vbInformation, "完了"
Else
' いいえが押された場合の処理
MsgBox "削除をキャンセルしました。", vbOKOnly + vbInformation, "キャンセル"
End IfEnd Sub
MsgBoxの応用テクニック
複数条件に応じた処理分岐
YesNoCancelの3択ボタンを使うことで、より細かな処理分岐が実現できます。
Sub SaveOrDiscard()
Dim result As Integer
result = MsgBox("変更を保存しますか?" & Chr(10) & _
"はい:保存して終了" & Chr(10) & _
"いいえ:保存せずに終了" & Chr(10) & _
"キャンセル:処理を中断", _
vbYesNoCancel + vbQuestion, "保存確認")
Select Case result
Case vbYes
' 保存処理
ActiveWorkbook.Save
MsgBox "保存しました。", vbInformation, "完了"
Case vbNo
' 保存せずに終了
MsgBox "変更を破棄しました。", vbInformation, "完了"
Case vbCancel
' 処理を中断
MsgBox "処理を中断しました。", vbInformation, "中断"
End SelectEnd Sub
ループ処理内での確認メッセージ
複数の対象に処理を行う前に、それぞれの確認を取りながら処理するパターンです。
Sub ProcessWithConfirmation()
Dim i As Integer
Dim lastRow As Integer
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lastRow
Dim cellValue As String
cellValue = Cells(i, 1).Value
Dim result As Integer
result = MsgBox(i & "行目「" & cellValue & "」を処理しますか?", _
vbYesNoCancel + vbQuestion, "処理確認")
If result = vbYes Then
' 処理を実行
Cells(i, 2).Value = "処理済み"
ElseIf result = vbCancel Then
' ループを中断
MsgBox "処理を中断しました。", vbInformation, "中断"
Exit For
End If
' vbNoの場合はスキップして次の行へ
Next iEnd Sub
ユーザー入力に応じて処理を制御
ファイル削除や上書き確認の例
Sub DeleteFileWithConfirm()
Dim filePath As String
filePath = "C:\Users\user\Documents\data.xlsx"
' ファイルの存在確認
If Dir(filePath) <> "" Then
Dim result As Integer
result = MsgBox("以下のファイルを削除します。" & Chr(10) & _
filePath & Chr(10) & Chr(10) & _
"この操作は元に戻せません。続けますか?", _
vbOKCancel + vbCritical, "ファイル削除")
If result = vbOK Then
Kill filePath
MsgBox "ファイルを削除しました。", vbInformation, "完了"
Else
MsgBox "削除をキャンセルしました。", vbInformation, "キャンセル"
End If
Else
MsgBox "指定したファイルが見つかりません。", vbExclamation, "エラー"
End IfEnd Sub
選択肢によって処理内容を分ける
複数の処理モードをユーザーに選ばせる場合は、メッセージ内に選択肢の説明を記述して分かりやすく提示します。
Sub SelectProcessMode()
Dim result As Integer
result = MsgBox("処理モードを選択してください。" & Chr(10) & Chr(10) & _
"【はい】全データを処理します" & Chr(10) & _
"【いいえ】選択範囲のみ処理します", _
vbYesNo + vbQuestion, "処理モード選択")
If result = vbYes Then
Call ProcessAllData
Else
Call ProcessSelectedRange
End IfEnd Sub
メッセージのカスタマイズ
アイコンの種類と意味(情報・警告・停止など)
アイコンの選択はメッセージの緊急度や種類をユーザーに直感的に伝えます。適切なアイコンを選ぶことで、ユーザーがメッセージの意味を素早く理解できます。
- vbInformation(青いi):処理完了・結果通知など穏やかな情報伝達に使う
- vbExclamation(黄色い!):注意が必要な操作の前・データが見つからないときなどに使う
- vbQuestion(青い?):ユーザーに判断を求める確認ダイアログに使う
- vbCritical(赤い×):重大なエラー・取り返しのつかない操作の前に使う
タイトルや文章の書き方で伝わりやすくする
改行や記号の活用
MsgBoxのメッセージ内で改行するにはChr(10)またはvbCrLfを使います。
' Chr(10)で改行
MsgBox "1行目のメッセージ" & Chr(10) & "2行目のメッセージ"
' vbCrLfでも同じ結果 MsgBox "1行目のメッセージ" & vbCrLf & "2行目のメッセージ"
' 空白行を入れる場合は2回改行 MsgBox "タイトル行" & Chr(10) & Chr(10) & "詳細説明"
文字列結合で動的メッセージ作成
変数の値をメッセージに組み込むことで、状況に応じた動的なメッセージが作れます。
Sub DynamicMessage()
Dim processedCount As Integer
Dim errorCount As Integer
processedCount = 150
errorCount = 3
MsgBox "処理が完了しました。" & Chr(10) & Chr(10) & _
"処理件数:" & processedCount & "件" & Chr(10) & _
"エラー件数:" & errorCount & "件" & Chr(10) & Chr(10) & _
"詳細はログファイルを確認してください。", _
vbInformation, "処理完了レポート"End Sub
MsgBox関数の詳しい構文と引数については、moug「VBAのMsgBox関数の使い方」も参考になります。
VBA MsgBoxでよくある注意点
長文メッセージの可読性
MsgBoxに長すぎるメッセージを表示すると、ダイアログが画面からはみ出したり、ユーザーが読まずに閉じてしまうリスクがあります。メッセージは簡潔に、要点を先に伝える形式にしましょう。詳細な情報はログファイルやセルへの書き出しで別途確認できるようにする設計が実用的です。
ユーザーの選択を正しく判定する
MsgBoxを関数として使う場合、返り値を必ず変数に格納してから判定します。返り値を使わずにMsgBoxを呼び出すだけでは、ユーザーの選択結果を取得できません。
' 誤った例:返り値を取得していない
MsgBox "削除しますか?", vbYesNo + vbQuestion, "確認"
' ユーザーが何を選んでも処理が変わらない
' 正しい例:返り値を変数に格納して判定 Dim result As Integer result = MsgBox("削除しますか?", vbYesNo + vbQuestion, "確認") If result = vbYes Then ' 削除処理 End If
複数ボタンの選択肢を分かりやすく表示
YesNoCancelのように複数のボタンがある場合、それぞれのボタンが何を意味するかをメッセージ内に明示すると、ユーザーの誤操作を防げます。
返り値の確認忘れに注意
注意:vbOKCancelやvbYesNoCancelを使ったときは、すべてのボタンに対応する処理を書いておかないと、ユーザーの選択が無視される場合があります。特にキャンセルの処理を忘れやすいので意識して記述してください。
ボタン種類の適切な選択
確認を必要としない単純な通知にはvbOKOnlyを使い、ユーザーの判断が必要な場面にだけvbYesNoやvbYesNoCancelを使うようにします。不必要な確認ダイアログが多いと、ユーザーが「とりあえずOK」を押す習慣になり、確認の意味がなくなります。
MsgBoxを活用した実践例
処理完了の通知
Sub NotifyCompletion()
' データ集計処理(省略)
MsgBox "集計が完了しました。" & Chr(10) & Chr(10) & _
"結果は「集計シート」に出力されました。" & Chr(10) & _
"内容をご確認ください。", _
vbOKOnly + vbInformation, "集計完了"End Sub
エラーメッセージ表示
Sub ShowErrorMessage()
On Error GoTo ErrorHandler
' 何らかの処理
Dim val As Integer
val = CInt("abc") ' 意図的なエラー
Exit SubErrorHandler: MsgBox "エラーが発生しました。" & Chr(10) & Chr(10) & _ "エラー番号:" & Err.Number & Chr(10) & _ "エラー内容:" & Err.Description & Chr(10) & Chr(10) & _ "入力データを確認してから再試行してください。", _ vbCritical, "エラー" End Sub
ユーザーの意思確認(保存・削除・終了)
Sub ConfirmBeforeClose()
Dim result As Integer
result = MsgBox("ワークブックを閉じる前に保存しますか?" & Chr(10) & Chr(10) & _
"【はい】保存して閉じる" & Chr(10) & _
"【いいえ】保存せずに閉じる" & Chr(10) & _
"【キャンセル】閉じない", _
vbYesNoCancel + vbQuestion, "終了確認")
Select Case result
Case vbYes
ActiveWorkbook.Save
ActiveWorkbook.Close
Case vbNo
ActiveWorkbook.Close SaveChanges:=False
Case vbCancel
' 何もしない(処理を継続)
End SelectEnd Sub
簡単な業務自動化での活用
月次レポート生成マクロにMsgBoxを組み込んで、生成前の確認と生成後の通知を自動化する例です。
Sub GenerateMonthlyReport()
' 実行前確認
Dim startResult As Integer
startResult = MsgBox("今月分のレポートを生成します。" & Chr(10) & _
"よろしいですか?", _
vbOKCancel + vbQuestion, "レポート生成")
If startResult = vbCancel Then
Exit Sub
End If
' レポート生成処理(省略)
' 完了通知
MsgBox "レポートの生成が完了しました。" & Chr(10) & Chr(10) & _
"保存先:C:\Reports\monthly_report.xlsx", _
vbInformation, "生成完了"End Sub
複数ステップ処理の確認用メッセージ
Sub MultiStepProcess()
' ステップ1の確認
If MsgBox("ステップ1:データのクリーニングを実行します。", _
vbOKCancel + vbInformation, "ステップ1") = vbCancel Then Exit Sub
' ステップ1の処理(省略)
' ステップ2の確認
If MsgBox("ステップ2:データの集計を実行します。", _
vbOKCancel + vbInformation, "ステップ2") = vbCancel Then Exit Sub
' ステップ2の処理(省略)
MsgBox "すべての処理が完了しました。", vbInformation, "完了"End Sub
MsgBox関数のボタン種類と返り値の詳細については、侍エンジニア「VBAのMsgBox完全ガイド」、ExcelVBA解説「MsgBoxの使い方と活用例」、FeedSoft「VBAのMsgBox関数リファレンス」も参考にしてください。
VBAをはじめとするExcel活用術や業務効率化のヒントは、kakiro-web.comでも幅広く解説しています。
まとめ
MsgBoxはVBAで簡単にメッセージを表示する基本ツール
MsgBox関数はVBAでダイアログボックスを表示するための基本機能です。1行のコードで実装でき、メッセージの表示からユーザーの応答取得まで完結して処理できます。マクロのUI(ユーザーインターフェース)として最もシンプルかつ強力なツールです。
ボタン種類と返り値を理解して条件分岐に活用
vbYesNo・vbOKCancel・vbYesNoCancelなどのボタン種類と、vbYes・vbNo・vbOK・vbCancelなどの返り値の定数を理解することで、ユーザーの選択に応じた柔軟な処理分岐が実現できます。返り値は必ず変数に格納してから判定することが基本です。
実務では通知・確認・エラーメッセージなど幅広く応用可能
処理完了の通知、重要操作前の確認、エラー発生時の詳細表示、複数ステップ処理の案内——MsgBoxは業務自動化マクロのさまざまな場面で活用できます。アイコン・タイトル・メッセージを適切に組み合わせることで、ユーザーにとって分かりやすい操作体験を提供できます。
- 単純な通知は
MsgBox "メッセージ"のみで実装できる - 返り値を使う場合は必ず
Dim result As Integerに格納する - ボタン種類とアイコンは
+で組み合わせて指定する - 改行には
Chr(10)またはvbCrLfを使う - アイコンはメッセージの緊急度に合わせて選ぶ(情報・警告・質問・停止)
- YesNoCancelを使うときはすべてのケースの処理を漏れなく記述する
- メッセージは簡潔にし、選択肢の説明をメッセージ内に明示すると誤操作を防げる

