🚀The world's best VBA AI has evolved. ExcelMaster is now an autonomous Agent.Read more →
Back to Blog

VBA MsgBox(メッセージボックス)— はい/いいえ・ボタン・カッコのルール

|

VBA MsgBox(メッセージボックス)— はい/いいえ・ボタン・カッコのルール

動作確認: 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 の役目を超えていて、InputBoxUserForm の出番です。

つまり 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 なら、そのルールを自然な日本語で言うだけ——「ステータスが空で期限が過ぎている行を削除して。ただし先に確認して」——で、チェック・確認・削除までまとめて書いてくれます。無料で試す →

関連ガイド

よくある質問(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 を使います。