動作確認: Excel 365 v2509 · Excel 2021 · Excel 2019 · 最終確認 2026-06-06
要点(TL;DR) — MsgBox は短いメッセージとボタンをユーザーに見せ、どのボタンが押されたかを返します。使い方は2通り——何かを知らせるときと、はい/いいえをたずねるときです。
Sub MsgBoxBasics()
' 1. 知らせる — 表示して終わり(ステートメント。カッコは付けない)
MsgBox "インポートが完了しました。", vbInformation, "完了"
' 2. たずねる — 答えを受け取る(関数。カッコが必須)
Dim answer As VbMsgBoxResult
answer = MsgBox("選択した行を削除しますか?", vbYesNo + vbQuestion, "確認")
If answer = vbYes Then
Selection.EntireRow.Delete
End If
End Sub
このたった一つの違い——カッコを付けるか付けないか——が、MsgBox でつまずく 「Expected: end of statement」 のほぼ全ての原因です。この記事はそこを軸に進めます。
考え方:MsgBox は「インターホン」であって「キーボード」ではない
壁のインターホンを思い浮かべてください。聞いている人へ一言を放送でき、答えるためのいくつかのボタン——はい・いいえ・キャンセル・再試行——を差し出せます。けれど、相手が文章を打ち込むのを聞き取ることはできません。ファイル名・数値・日付など自由入力が必要になった瞬間、もう MsgBox の役目を超えていて、InputBox か UserForm の出番です。
つまり MsgBox が得意なのは2つだけ。ユーザーに何かを伝えるか、閉じた質問をしてクリックで分岐するか。ここに徹していれば、MsgBox は決して手に負えなくなりません。
たった一つのルール:ステートメント形式 と 関数形式
MsgBox には2つの顔があり、どちらを使うかでカッコが許されるかどうかが決まります。
ステートメント形式 — メッセージを表示するだけで、どのボタンかは気にしない場合:
MsgBox "保存しました!" ' ✅
MsgBox "保存しました!", vbInformation, "状態" ' ✅ 引数はカンマ区切り。カッコは付けない
MsgBox ("保存しました!", vbInformation) ' ❌ Expected: end of statement
最後の行が失敗するのは、ステートメントの後ろの ( … ) を VBA が 「この1つの式を評価せよ」 と読むからです。"保存しました!", vbInformation は1つの式ではなく引数リストです。カッコが付くのは関数呼び出しのときだけです。
関数形式 — 戻り値が欲しいので変数に代入する。このときカッコは必須になります:
Dim r As VbMsgBoxResult
r = MsgBox("ファイルを上書きしますか?", vbYesNo) ' ✅ 戻り値を使う → カッコが必要
一文でいうと——戻り値を使う → カッコあり、無視する → カッコなし。これが身につけば、あのエラーは二度と出ません。
答えは「数字」ではなく「名前」で読む
MsgBox は整数を返しますが、生の数字と比べてはいけません。vbYes はたまたま 6 ですが、6 ではなく vbYes と書きます。名前付き定数は文章のように読め、あとでマクロを読む人(未来の自分を含む)にも伝わります。
Select Case MsgBox("閉じる前に変更を保存しますか?", vbYesNoCancel + vbExclamation)
Case vbYes: ThisWorkbook.Save
Case vbNo: ' 保存せずに閉じる — 何もしない
Case vbCancel: Exit Sub ' ユーザーが考え直した → マクロ全体を止める
End Select
この3択の vbYesNoCancel こそ覚えておくべき型です。キャンセル=「やっぱりやめた、全部止めて」。Exit Sub でこれに応えれば、ユーザーはマクロを信頼してくれます。
ボタンとアイコンは + で組み合わせる
2番目の引数は、独立した2つの選択——どのボタンか と どのアイコンか——を1つの数値に詰め込みます。だから足し算します。
MsgBox "ディスクの空きが残りわずかです。", vbOKOnly + vbCritical ' 赤い ✖ アイコン
MsgBox "夜間処理を今すぐ実行しますか?", vbYesNo + vbQuestion ' 青い ? アイコン
MsgBox "ネットワーク障害 — 再試行しますか?", vbRetryCancel + vbExclamation ' 黄色い ! アイコン
これらは数値の中の別々の「枠」に入るので、+ がきれいに効きます。既定とは別のボタンを強調したい(うっかり Enter で何も消えないように)ときは、vbDefaultButton2 を足して2番目のボタンを既定にします。
メッセージに変数を埋め込む
実務では定数の文字列はまれで、たいてい件数・名前・結果を伝えたいはずです。& で連結し、改行には vbNewLine を使います。
Dim n As Long
n = WorksheetFunction.CountA(Range("A:A")) - 1
MsgBox n & " 行を処理しました。" & vbNewLine & _
"完了時刻 " & Format(Now, "hh:mm:ss"), vbInformation, "レポート"
文字列の連結は + ではなく &、改行は vbNewLine——この2つが最も忘れられがちです。
MsgBox をデバッグに使わない
最もよくある誤用が、値を「見る」ために MsgBox x をループの中に撒くことです。500行なら500回クリック——しかもそのたびにマクロは固まります。MsgBox はモーダルで、クリックされるまでわざと止まります。人間を立ち止まらせて判断させるための部品だからです。
開発中に値を眺めたいなら、イミディエイトウィンドウを使いましょう。
Debug.Print i & " 行目 = " & cell.Value ' Ctrl+G で確認。クリック0回、止まらない
合言葉:MsgBox はエンドユーザー向けの「判断のゲート」、Debug.Print は開発者向けの「出力ツール」。これを取り違えると、マクロが途端に使いづらくなります。
よくある MsgBox の間違い(と直し方)
| 症状 | 原因 | 直し方 |
|---|---|---|
| 「Expected: end of statement」 | ステートメント形式にカッコ:MsgBox ("Hi", vbYesNo) |
カッコを外すか、結果を代入:r = MsgBox("Hi", vbYesNo) |
| 答えが一致しない | マジックナンバー 6 / 7 と比較 |
定数 vbYes / vbNo と比較 |
| キャンセル後もマクロが続く | vbYes だけ見て vbCancel を無視 |
Case vbCancel: Exit Sub を足す |
| タイトルが違う場所に出る | 引数の順番は prompt, buttons, title |
タイトルは3番目:MsgBox "本文", vbOKOnly, "タイトル" |
| 文字と数値がくっつく | + で連結し、加算かエラーに |
& で連結:"合計 " & n |
| ボタンとアイコンが両方出ない | 間にカンマを使った | + で組み合わせる:vbYesNo + vbQuestion |
ダイアログの配線は飛ばして、ルールだけ言えばいい
1つの判断なら MsgBox の確認で十分です。けれど、判断の背後にあるロジックが本当の仕事になるとき——「削除する前に、D列が空で、日付が過去であることを確認する」——、手間はそこに潜んでいます。ExcelMaster Agent なら、そのルールを自然な日本語で言うだけ——「ステータスが空で期限が過ぎている行を削除して。ただし先に確認して」——で、チェック・確認・削除までまとめて書いてくれます。無料で試す →
関連ガイド
- VBA InputBox — 2つの InputBox と使い分け
- VBA UserForm — 本格的な入力フォームを作る
- VBA If Then Else — 条件分岐の正しい書き方
- VBA For ループ — 実務で使える8例
よくある質問(FAQ)
VBA の MsgBox とは何ですか?
MsgBox は VBA 組み込みの関数で、メッセージと1つ以上のボタンを持つ小さなダイアログを表示し、どのボタンが押されたかを示す値を返します。ユーザーへの通知や、簡単なはい/いいえの確認に使います。
MsgBox で「Expected: end of statement」が出るのはなぜですか?
MsgBox をステートメントとして使いながら引数をカッコで囲んだから——例:MsgBox ("Hi", vbYesNo)。カッコは戻り値を受け取るときだけ許されます:answer = MsgBox("Hi", vbYesNo)。戻り値を使わないならカッコを外します:MsgBox "Hi", vbYesNo。
VBA ではい/いいえのメッセージボックスを作るには?
MsgBox を関数として vbYesNo 定数とともに呼び、結果を読みます:If MsgBox("続行しますか?", vbYesNo) = vbYes Then …。クエスチョンマークのアイコンには vbQuestion を足します:vbYesNo + vbQuestion。
VBA の MsgBox にアイコンを表示するには?
ボタンの引数にアイコン定数を + で足します:vbCritical(赤い ✖)、vbExclamation(黄色い !)、vbQuestion(青い ?)、vbInformation(青い i)。例:MsgBox "完了", vbOKOnly + vbInformation。
MsgBox に変数を入れるには?
文字列と変数を & で連結します:MsgBox "合計: " & total。メッセージ内で改行するには vbNewLine を使います。
MsgBox と InputBox の違いは?
MsgBox はメッセージを出力し、押されたボタンを返すだけで、入力された文字は受け取れません。InputBox はユーザーに値の入力を促し、入力された内容を返します。通知や確認には MsgBox、入力の取得には InputBox を使います。
