- 技術 💻
VBA MsgBoxの使い方|ボタン・戻り値一覧とInputBox判定
MsgBox は、メッセージとボタンを表示し、押されたボタンを数値で返す VBA の関数です。 2番目の引数に「ボタンの種類+アイコン+既定ボタン」の定数を足して渡し、戻り値を vbYes や vbCancel と比べて処理を分けます。
この記事では、足し算に使う定数と戻り値を1枚の早見表にまとめ、はい・いいえの分岐、改行の入れ方、入力を受け取る InputBox のキャンセル判定までを、コピーして使えるコードで説明します。InputBox 関数と Application.InputBox メソッドの違いと選び方も比較表にしました。
確認環境:構文・定数の値・戻り値は、Microsoft Learn の Office VBA リファレンス(英語版)の MsgBox 関数、InputBox 関数、Application.InputBox メソッド、Miscellaneous constants、VarType 関数の各ページを 2026-10-06 に開いて照合しました。定数を足した合計値は Python 3.11 で検算しています。
この記事の結論
はい・いいえで分岐する形です。
If MsgBox("保存しますか?", vbYesNo + vbQuestion, "確認") = vbYes Then
' はい のときの処理
Else
' いいえ のときの処理
End If
InputBox 関数のキャンセルを見分ける形です。
Dim ans As String
ans = InputBox("名前を入力してください", "入力")
If StrPtr(ans) = 0 Then
' キャンセル
ElseIf ans = "" Then
' 何も入力せずに OK
Else
' 入力あり
End If
Application.InputBox メソッドなら、キャンセルのとき戻り値が False になります。
Dim v As Variant
v = Application.InputBox("数量を入力してください", "入力", Type:=1)
If VarType(v) = vbBoolean Then
' キャンセル(False が返っている)
Else
' v に数値が入っている
End If
- ボタン・アイコン・既定ボタンは、各グループから1つずつ選んで
+で足します。 - 戻り値は vbOK=1、vbCancel=2、vbAbort=3、vbRetry=4、vbIgnore=5、vbYes=6、vbNo=7 です。数値ではなく定数名で比べます。
- 数値やセル範囲を受け取りたいとき、キャンセルを公式の記載どおりに判定したいときは Application.InputBox を選びます。
MsgBoxのボタン・アイコン・戻り値早見表
値は Microsoft Learn の MsgBox 関数のページの記載です。A・B・C の各グループから1つずつ選び、値を足したものが buttons 引数になります。
| グループ | 定数 | 値 | 表示されるもの |
|---|---|---|---|
| A:ボタン | vbOKOnly | 0 | OK(省略時の既定) |
| A:ボタン | vbOKCancel | 1 | OK、キャンセル |
| A:ボタン | vbAbortRetryIgnore | 2 | 中止、再試行、無視 |
| A:ボタン | vbYesNoCancel | 3 | はい、いいえ、キャンセル |
| A:ボタン | vbYesNo | 4 | はい、いいえ |
| A:ボタン | vbRetryCancel | 5 | 再試行、キャンセル |
| B:アイコン | vbCritical | 16 | 警告(Critical Message)アイコン |
| B:アイコン | vbQuestion | 32 | 問い合わせ(Warning Query)アイコン |
| B:アイコン | vbExclamation | 48 | 注意(Warning Message)アイコン |
| B:アイコン | vbInformation | 64 | 情報(Information Message)アイコン |
| C:既定ボタン | vbDefaultButton1 | 0 | 1番目のボタンが既定 |
| C:既定ボタン | vbDefaultButton2 | 256 | 2番目のボタンが既定 |
| C:既定ボタン | vbDefaultButton3 | 512 | 3番目のボタンが既定 |
| C:既定ボタン | vbDefaultButton4 | 768 | 4番目のボタンが既定 |
| 戻り値の定数 | 値 | 押されたボタン |
|---|---|---|
| vbOK | 1 | OK |
| vbCancel | 2 | キャンセル |
| vbAbort | 3 | 中止 |
| vbRetry | 4 | 再試行 |
| vbIgnore | 5 | 無視 |
| vbYes | 6 | はい |
| vbNo | 7 | いいえ |
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「VBA MsgBoxの使い方|ボタン・戻り値一覧とInputBox判定」
MsgBoxの構文と引数
MsgBox(prompt, [buttons], [title], [helpfile, context])
| 引数 | 必須 | 内容 | 省略したとき |
|---|---|---|---|
| prompt | 必須 | 表示するメッセージ。長さの上限はおよそ 1024 文字(文字の幅による) | ― |
| buttons | 省略可 | ボタンの種類・アイコン・既定ボタン・モーダルの種類を足した数値 | 0(OK ボタンだけ) |
| title | 省略可 | タイトルバーの文字列 | アプリケーション名が表示される |
| helpfile | 省略可 | ヘルプファイル。指定するときは context も必要 | ― |
| context | 省略可 | ヘルプのコンテキスト番号。指定するときは helpfile も必要 | ― |
表示するだけなら、かっこなしで1行書けば済みます。押されたボタンで処理を分けるときは、かっこを付けて戻り値を受け取ります。
Sub MsgBoxBasic()
Dim r As Long
' 表示するだけ(戻り値は使わない)
MsgBox "処理が終わりました。", vbInformation, "完了"
' 戻り値を受け取る(かっこを付ける)
r = MsgBox("処理を続けますか?", vbOKCancel + vbQuestion, "確認")
If r = vbOK Then
MsgBox "続けます。"
Else
MsgBox "中止しました。"
End If
End Sub
ボタンとアイコンを足し算で指定する
よく使う組み合わせと、その合計値です。合計の数値を直接書いても動きますが、定数を + でつないで書くと、何を表示するのかが読み取れます。
| 用途 | buttons の書き方 | 合計 | 返る可能性のある値 |
|---|---|---|---|
| お知らせ | vbOKOnly + vbInformation |
64 | vbOK |
| 続行の確認 | vbOKCancel + vbExclamation |
49 | vbOK、vbCancel |
| はい・いいえ | vbYesNo + vbQuestion |
36 | vbYes、vbNo |
| はい・いいえ(いいえを既定に) | vbYesNo + vbQuestion + vbDefaultButton2 |
292 | vbYes、vbNo |
| 削除の確認(いいえを既定に) | vbYesNo + vbExclamation + vbDefaultButton2 |
308 | vbYes、vbNo |
| 保存して閉じるかの確認 | vbYesNoCancel + vbQuestion |
35 | vbYes、vbNo、vbCancel |
| 3択でキャンセルを既定に | vbYesNoCancel + vbQuestion + vbDefaultButton3 |
547 | vbYes、vbNo、vbCancel |
| やり直しの確認 | vbRetryCancel + vbCritical |
21 | vbRetry、vbCancel |
| 中止・再試行・無視(無視を既定に) | vbAbortRetryIgnore + vbCritical + vbDefaultButton3 |
530 | vbAbort、vbRetry、vbIgnore |
既定ボタンを「いいえ」にする
既定ボタンは、Enter キーを押したときに選ばれるボタンです。削除のように取り消しにくい操作の確認では、2番目の「いいえ」を既定にしておくと、Enter を続けて押しても処理が進みません。
Sub ConfirmDelete()
If MsgBox("選択した行を削除します。よろしいですか?", _
vbYesNo + vbExclamation + vbDefaultButton2, "削除の確認") = vbYes Then
MsgBox "削除の処理をここに書きます。"
End If
End Sub
3つのボタンを Select Case で分ける
Sub ConfirmSave()
Select Case MsgBox("変更を保存しますか?", vbYesNoCancel + vbQuestion, "確認")
Case vbYes
' 保存の処理をここに書く
Case vbNo
' 保存しないで先へ進む
Case vbCancel
Exit Sub
End Select
MsgBox "次の処理へ進みます。"
End Sub
MsgBox 関数のページには、キャンセルボタンがあるダイアログでは、Esc キーを押すとキャンセルを押したのと同じ結果になると書かれています。vbOKCancel・vbYesNoCancel・vbRetryCancel を使うときは、vbCancel の分岐を必ず用意します。
そのほかの buttons の定数
| 定数 | 値 | 内容 |
|---|---|---|
| vbApplicationModal | 0 | アプリケーションモーダル。応答するまでそのアプリケーションの操作を続けられない |
| vbSystemModal | 4096 | システムモーダル |
| vbMsgBoxHelpButton | 16384 | ヘルプボタンを追加する |
| vbMsgBoxSetForeground | 65536 | メッセージボックスを最前面のウィンドウにする |
| vbMsgBoxRight | 524288 | 文字を右寄せにする |
| vbMsgBoxRtlReading | 1048576 | ヘブライ語・アラビア語のシステムで右から左に表示する |
メッセージを改行する(vbCrLf・vbNewLine・vbLf)
メッセージの途中に改行の定数を & でつなぎます。
Sub MsgBoxNewLine()
MsgBox "取り込みが終わりました。" & vbCrLf & _
"件数:120 件" & vbCrLf & vbCrLf & _
"続けて集計しますか?", vbYesNo + vbQuestion, "確認"
End Sub
| 定数 | 中身 | 説明(Miscellaneous constants のページの記載) |
|---|---|---|
| vbCrLf | Chr(13) + Chr(10) | キャリッジリターンとラインフィードの組み合わせ |
| vbNewLine | Chr(13) + Chr(10)。Macintosh では Chr(13) | 実行している環境に合った改行 |
| vbCr | Chr(13) | キャリッジリターン |
| vbLf | Chr(10) | ラインフィード |
MsgBox 関数のページでは、prompt の行は Chr(13)、Chr(10)、Chr(13) & Chr(10) のどれでも区切れると説明されています。つまり MsgBox の改行は、4つのどの定数でも書けます。
| 条件 | 選ぶもの |
|---|---|
| Windows の Excel で使う | vbCrLf |
| Windows と Mac の両方で同じコードを使う | vbNewLine |
| 1文字の改行として扱いたい(文字数を数える、Replace で取り除く) | vbLf |
| 空行を1行入れたい | 改行の定数を2つ続ける(vbCrLf & vbCrLf) |
1つのブックの中では、どれか1つに決めておくと読みやすくなります。
InputBoxで入力を受け取り、キャンセルを判定する
InputBox 関数は、入力欄のあるダイアログを表示し、入力された文字列を返します。
InputBox(prompt, [title], [default], [xpos], [ypos], [helpfile, context])
| 引数 | 内容 | 省略したとき |
|---|---|---|
| prompt | メッセージ(必須)。上限はおよそ 1024 文字 | ― |
| title | タイトルバーの文字列 | アプリケーション名 |
| default | 入力欄に最初から入れておく文字列 | 入力欄は空 |
| xpos・ypos | 画面の左端・上端からの距離(単位は twip) | 横は中央、縦は画面の上からおよそ3分の1の位置 |
InputBox 関数のページには、OK を押すと入力欄の内容が返り、キャンセルを押すと長さ0の文字列("")が返ると書かれています。つまり、戻り値を "" と比べるだけでは、「キャンセル」と「何も入力せずに OK」が同じ結果になります。
2つを同じ扱いにしてよい場合
「空なら何もしない」で足りる処理は、この形で十分です。
Sub AskName()
Dim ans As String
ans = InputBox("シート名を入力してください", "シートの追加", "集計")
If ans = "" Then Exit Sub ' キャンセル、または空のまま OK
MsgBox "シート名:" & ans ' ここにシートを追加する処理を書く
End Sub
キャンセルと「空で OK」を見分ける場合
広く使われているのが、文字列変数に受けてから StrPtr 関数で調べる書き方です。キャンセルのときは 0、空のまま OK を押したときは 0 以外になることを利用します。
Sub AskMemo()
Dim ans As String
ans = InputBox("メモを入力してください(空欄も可)", "メモ")
If StrPtr(ans) = 0 Then
MsgBox "キャンセルされました。"
Exit Sub
End If
If ans = "" Then
MsgBox "空欄で登録します。"
Else
MsgBox "入力内容:" & ans
End If
End Sub
StrPtr は InputBox 関数のページには出てこない関数です。Microsoft Learn に書かれている内容だけで組みたい場合は、次の Application.InputBox メソッドを使うと、キャンセルを False で受け取れます。
InputBox関数とApplication.InputBoxメソッドの違いと選び方
Excel には、VBA の InputBox 関数とは別に、Application オブジェクトの InputBox メソッドがあります。InputBox(...) と書けば関数、Application.InputBox(...) と書けばメソッドが呼ばれます。
Application.InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextID, Type)
| 比べる点 | InputBox 関数 | Application.InputBox メソッド |
|---|---|---|
| 書き方 | InputBox("...") |
Application.InputBox("...") |
| 使える場所 | VBA 全般 | Excel |
| 戻り値 | 文字列 | Variant(Type 引数で種類を指定できる) |
| キャンセルのとき | 長さ0の文字列 "" |
False |
| 空のまま OK との見分け | 戻り値だけでは同じ "" になる |
キャンセルは False(Boolean)なので型で見分けられる |
| 入力の種類の指定 | なし(常に文字列) | Type 引数で数値・文字列・論理値・セル範囲などを指定 |
| セル範囲の選択 | できない | Type:=8 で Range オブジェクトを受け取れる |
| タイトルを省略したとき | アプリケーション名 | Input |
| prompt の長さ | およそ 1024 文字まで | 255 文字まで(超えるとプロンプトが表示されず、エラー 2015 が返る) |
| 位置の引数と単位 | xpos・ypos(twip) | Left・Top(ポイント) |
| 入力欄の制限 | 255 文字まで受け付け、戻り値は 254 文字に切り詰められる。改行は入力できない | ― |
Type 引数に指定できる値です。
| Type の値 | 受け取るもの |
|---|---|
| 0 | 数式 |
| 1 | 数値 |
| 2 | 文字列(テキスト) |
| 4 | 論理値(True または False) |
| 8 | セル参照(Range オブジェクト) |
| 16 | #N/A などのエラー値 |
| 64 | 値の配列 |
Type を省略すると文字列が返ります。数値と文字列の両方を受け付けたいときは Type:=1 + 2 と足して指定します。
| 条件 | 選ぶもの |
|---|---|
| 文字列を1つ受け取るだけで、空欄とキャンセルを同じ扱いにしてよい | InputBox 関数 |
| 数値だけを受け付けたい | Application.InputBox(Type:=1) |
| セル範囲をマウスで選んでもらいたい | Application.InputBox(Type:=8) |
| キャンセルと「空のまま OK」を分けたい | Application.InputBox(戻り値の型を調べる) |
| Excel 以外の Office アプリでも同じコードを使う | InputBox 関数 |
| 255 文字を超える長い説明を表示したい | InputBox 関数 |
数値を受け取る
Sub AskQuantity()
Dim v As Variant
v = Application.InputBox("数量を入力してください", "数量", 1, Type:=1)
If VarType(v) = vbBoolean Then
MsgBox "キャンセルされました。"
Exit Sub
End If
MsgBox "数量:" & v
End Sub
キャンセルの判定は、値を False と比べるのではなく、VarType で型を調べています。 数量に 0 が入力される場合もあるので、「Boolean 型かどうか」で見分けると、0 とキャンセルを取り違えません。VarType 関数は Boolean 型のとき vbBoolean(11)を返します。
文字列を受け取り、空のまま OK と見分ける
Sub AskComment()
Dim v As Variant
v = Application.InputBox("コメントを入力してください(空欄も可)", "コメント", Type:=2)
If VarType(v) = vbBoolean Then
MsgBox "キャンセルされました。"
ElseIf v = "" Then
MsgBox "空欄で登録します。"
Else
MsgBox "コメント:" & v
End If
End Sub
セル範囲を選んでもらう
Application.InputBox メソッドのページには、Type が 8 のときは Range オブジェクトが返るので、Set ステートメントで代入すると書かれています。キャンセルのときは False が返り Range オブジェクトにならないため、代入の行を On Error で囲み、範囲が入ったかどうかを Nothing で確かめます。
Sub AskRange()
Dim rng As Range
On Error Resume Next
Set rng = Application.InputBox("集計する範囲を選択してください", "範囲の選択", Type:=8)
On Error GoTo 0
If rng Is Nothing Then
MsgBox "キャンセルされました。"
Exit Sub
End If
MsgBox "選択されたセルの数:" & rng.Cells.Count
End Sub
入力されるまで繰り返す例
MsgBox と Application.InputBox を組み合わせた、1以上の数値が入るまで聞き直す例です。
Sub AskUntilValid()
Dim v As Variant
Do
v = Application.InputBox("1 以上の数量を入力してください", "数量", Type:=1)
If VarType(v) = vbBoolean Then
MsgBox "入力を中止しました。", vbInformation, "数量"
Exit Sub
End If
If v >= 1 Then Exit Do
If MsgBox("1 以上の値が必要です。入力し直しますか?", _
vbRetryCancel + vbExclamation, "数量") = vbCancel Then Exit Sub
Loop
MsgBox "数量 " & v & " で登録します。", vbInformation, "数量"
End Sub
つまずきやすい点と直し方
| 症状 | 原因 | 直し方 |
|---|---|---|
r = MsgBox "続けますか?", vbYesNo が構文エラーになる |
戻り値を受け取るのに、かっこが付いていない | r = MsgBox("続けますか?", vbYesNo) と書く |
MsgBox("完了", vbInformation) だけの行が構文エラーになる |
戻り値を使わない行で、複数の引数をかっこで囲んでいる | かっこを外して MsgBox "完了", vbInformation と書く |
| Esc を押したときの動きが決まっていない | キャンセルボタンのあるダイアログで vbCancel の分岐が無い | Case vbCancel または Else を用意する |
| InputBox をキャンセルしたのに、空の文字列のまま後続の処理が動く | キャンセルで "" が返っている |
If ans = "" Then Exit Sub を入れる |
| Application.InputBox の Type:=8 で、キャンセルすると止まる | False を Set で代入しようとしている | On Error Resume Next で囲み、If rng Is Nothing で判定する |
| Application.InputBox でメッセージが表示されない | Prompt が 255 文字を超えている | メッセージを短くする |
| アイコンが2つ指定されて意図と違う表示になる | 同じグループの定数を2つ足している(例:vbCritical + vbQuestion = 48 = vbExclamation) | 各グループから1つだけ選ぶ |
確かめて分かったこと
Microsoft Learn の各ページを読み比べて分かった、見落としやすい点です。
- InputBox 関数のキャンセルは、公式の記載では「長さ0の文字列を返す」までです。 空のまま OK を押した場合と戻り値の内容は同じになります。
- Application.InputBox のタイトルを省略すると「Input」になります。 InputBox 関数と MsgBox はアプリケーション名です。タイトルは省略せずに書くと表示がそろいます。
- 位置の単位が違います。 InputBox 関数の xpos・ypos は twip、Application.InputBox の Left・Top はポイントです。同じ数値を渡しても同じ位置にはなりません。
- Application.InputBox の Prompt は 255 文字までです。 MsgBox と InputBox 関数のおよそ 1024 文字より短いので、長い説明を移すときに気をつけます。
- InputBox 関数の入力欄は 255 文字まで受け付け、戻り値は 254 文字に切り詰められます。 改行も入力できません。長い文章の入力には向かないので、セルやユーザーフォームに入力してもらう形にします。
- 同じグループの定数を足すと、別の定数と同じ値になります。 vbCritical(16)と vbQuestion(32)を足すと 48 で、vbExclamation と同じ値です。vbOKCancel(1)と vbAbortRetryIgnore(2)を足すと 3 で、vbYesNoCancel と同じ値になります。
よくある質問
Q. MsgBox の戻り値とは?
A. 押されたボタンを表す 1〜7 の数値です。vbOK=1、vbCancel=2、vbAbort=3、vbRetry=4、vbIgnore=5、vbYes=6、vbNo=7 で、If MsgBox(...) = vbYes Then のように定数名で比べます。
Q. MsgBox で改行するには?
A. メッセージの途中に & vbCrLf & を入れます。MsgBox は vbCrLf・vbNewLine・vbCr・vbLf のどれでも改行として扱うので、ブックの中で1つに決めて使います。
Q. InputBox でキャンセルされたか判定するには?
A. InputBox 関数は "" が返るので、空欄と同じ扱いでよければ If ans = "" Then Exit Sub と書きます。空のまま OK と分けたいときは、Application.InputBox を使い、VarType(v) = vbBoolean ならキャンセルと判定します。
Q. InputBox 関数と Application.InputBox の違いは? A. Application.InputBox は Excel 専用のメソッドで、Type 引数で数値やセル範囲を受け取れ、キャンセルのとき False を返します。InputBox 関数は常に文字列を返し、キャンセルのときは長さ0の文字列を返します。
Q. 「いいえ」を最初から選ばれた状態にするには?
A. buttons に vbDefaultButton2 を足します。vbYesNo + vbQuestion + vbDefaultButton2(合計 292)と書くと、2番目の「いいえ」が既定ボタンになります。
まとめ
- MsgBox の buttons は「ボタン+アイコン+既定ボタン」を各グループから1つずつ足す。はい・いいえの確認は
vbYesNo + vbQuestion。 - 戻り値は vbOK=1〜vbNo=7。 戻り値を使うときは、かっこを付けて
If MsgBox(...) = vbYes Thenと書く。 - 取り消しにくい操作の確認は vbDefaultButton2 で「いいえ」を既定にする。
- 改行は
& vbCrLf &。 Windows と Mac の両方で使うコードは vbNewLine。 - InputBox 関数はキャンセルで
""を返す。 空欄と同じ扱いでよければIf ans = "" Then Exit Sub。 - 数値・セル範囲の入力と、キャンセルの確実な判定は Application.InputBox。 キャンセルは
VarType(v) = vbBoolean、Type:=8 は Set とIs Nothingで受ける。
参考・出典
- Microsoft Learn「MsgBox function」「InputBox function」「Miscellaneous constants」「VarType function」(Office VBA Reference、learn.microsoft.com、2026-10-06 に確認)
- Microsoft Learn「Application.InputBox method (Excel)」(2026-10-06 に確認)
本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。
(記載例)出典:株式会社RJC「VBA MsgBoxの使い方|ボタン・戻り値一覧とInputBox判定」
株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。
WE ARE HIRING
RJCで一緒に開発しながら、
成長を楽しみませんか?
RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!
- 127日年間休日
- 12時間平均残業時間
- 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!
ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。