Contents
この記事でできること
VBAのMsgBoxで確認ダイアログを表示し、ユーザーの回答(はい/いいえ)に応じて処理を分岐する方法を解説します。
- 対象:マクロ実行前に確認を入れたい人。MsgBoxのボタンやアイコンの使い方がわからない人
- 所要時間:コピペ → 実行まで3分
完成イメージ
実行すると「削除しますか?」の確認ダイアログが表示されます。
- 「はい」をクリック → 削除処理を実行
- 「いいえ」をクリック → キャンセルしてマクロ終了
確認ダイアログを1行入れるだけで、うっかり実行による事故を防げます。
導入
自分も以前、削除マクロをうっかり実行してデータを丸ごと消してしまったことがあります。バックアップもなく、正直あのときは血の気が引きました。
MsgBoxで確認ダイアログを入れるようになってからは、同じ事故はゼロ。マクロを他の人に渡すときも「勝手に実行されて困る」という心配がなくなりました。
この記事で、削除や上書きなどの操作前に確認を入れる方法を身につけてもらえればうれしいです。
事前準備
以下の環境を前提にしています。
| 項目 | 内容 |
|---|---|
| Excel | Excel 2016以降 / Microsoft 365 |
| OS | Windows 10/11 |
| 保存形式 | .xlsm(マクロ有効ブック) |
| コードの貼り付け場所 | 標準モジュール |
| 実行方法 | マクロ実行(Alt + F8 → 実行)またはボタン割り当て |
VBE(コードを書く画面)の開き方がわからない場合は、Alt + F11 で開けます。標準モジュールは「挿入」→「標準モジュール」で追加してください。
コード(最小版)– 基本のMsgBox
通知メッセージ(戻り値なし)
まずは一番シンプルな使い方です。OKボタンだけのメッセージを表示します。
Sub メッセージを表示する()
MsgBox "処理が完了しました。"
End Sub
ポイント: 通知だけの場合は括弧なしで書きます。戻り値を使わないので、これで十分です。
確認ダイアログ(Yes/No分岐)
次に、Yes/Noで処理を分岐するコードです。これが本記事のメインです。
Sub 確認してから実行する()
Dim answer As VbMsgBoxResult
answer = MsgBox("データを削除します。" & vbCrLf & _
"よろしいですか?", vbYesNo + vbQuestion)
If answer = vbYes Then
' はい → 処理を実行
MsgBox "削除しました。"
Else
' いいえ → キャンセル
MsgBox "キャンセルしました。"
End If
End Sub
コードの解説:
| 行 | 内容 |
|---|---|
Dim answer As VbMsgBoxResult |
戻り値を受け取る変数を宣言 |
MsgBox("...", vbYesNo + vbQuestion) |
「はい/いいえ」ボタン + 疑問アイコンのダイアログを表示 |
vbCrLf |
メッセージ内で改行する定数 |
If answer = vbYes Then |
「はい」が押されたら処理を実行 |
注意: 戻り値を受け取る場合は括弧が必須です。
answer = MsgBox "メッセージ", vbYesNoと書くとエラーになります。
MsgBoxのボタン定数一覧
MsgBoxの第2引数でボタン構成を指定します。
| 定数 | 値 | ボタン構成 | 用途 |
|---|---|---|---|
| vbOKOnly | 0 | OK | 通知メッセージ |
| vbOKCancel | 1 | OK / キャンセル | 続行確認 |
| vbYesNo | 4 | はい / いいえ | 実行確認 |
| vbYesNoCancel | 3 | はい / いいえ / キャンセル | 3択の判断 |
| vbRetryCancel | 5 | 再試行 / キャンセル | エラー後の再試行 |
実務で最も使うのは vbYesNo(削除や上書きの確認)と vbOKOnly(完了通知)の2つです。
MsgBoxのアイコン定数一覧
ボタン定数に「+」でアイコン定数を足すと、アイコン付きのダイアログになります。
| 定数 | 値 | アイコン | 用途 |
|---|---|---|---|
| vbInformation | 64 | 情報(i) | 完了通知 |
| vbQuestion | 32 | 疑問(?) | 確認ダイアログ |
| vbExclamation | 48 | 警告(!) | 注意喚起 |
| vbCritical | 16 | エラー(×) | 重大な警告 |
組み合わせ例:
vbYesNo + vbQuestion → はい/いいえ + 疑問アイコン
vbYesNo + vbExclamation → はい/いいえ + 警告アイコン
vbOKOnly + vbInformation → OK + 情報アイコン
コード(実務版)– 削除確認 + 件数表示 + アイコン付き
実際の業務では「何件のデータを削除するか」を表示してから確認するのが安全です。自分もこのパターンを使うようになってから、「何が消えるのかわからないまま実行してしまう」という不安がなくなりました。
注意: このコードはデータを削除(ClearContents)します。実行前に必ずファイルのバックアップを取ってください。
Sub データを安全に削除する()
Dim ws As Worksheet
Dim lastRow As Long
Dim cnt As Long
Set ws = ActiveSheet
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
cnt = lastRow - 1
If cnt <= 0 Then
MsgBox "削除するデータがありません。", vbInformation
Exit Sub
End If
' 確認ダイアログ(件数 + 警告アイコン)
Dim answer As VbMsgBoxResult
answer = MsgBox(cnt & " 件のデータを削除します。" & vbCrLf & _
"この操作は元に戻せません。" & vbCrLf & vbCrLf & _
"実行しますか?", _
vbYesNo + vbExclamation, _
"削除の確認")
If answer <> vbYes Then
MsgBox "キャンセルしました。", vbInformation
Exit Sub
End If
' 処理を実行
ws.Range("A2:D" & lastRow).ClearContents
MsgBox cnt & " 件のデータを削除しました。", vbInformation
End Sub
実務版のポイント:
| 処理 | 説明 |
|---|---|
cnt = lastRow - 1 |
ヘッダー行を除いたデータ件数を計算 |
cnt & " 件のデータを削除します。" |
件数をメッセージに含めて表示 |
vbYesNo + vbExclamation |
はい/いいえボタン + 警告アイコン |
"削除の確認" |
第3引数でタイトルバーに表示する文字列 |
answer <> vbYes |
「はい」以外はすべてキャンセル扱い |
ClearContents |
セルの値だけ削除(書式は残す) |
最終行の取得(Cells.End(xlUp).Row)の詳細はデータの最終行・最終列を正確に取得する方法を参照してください。
InputBoxとの使い分け
MsgBoxは「選択肢から選ぶ」、InputBoxは「テキストを入力する」という違いがあります。
| 項目 | MsgBox | InputBox |
|---|---|---|
| 用途 | はい/いいえの確認 | テキスト入力 |
| 戻り値 | VbMsgBoxResult(定数) | 文字列 |
| キャンセル判定 | answer <> vbYes |
input = "" |
| 使用場面 | 削除確認、実行確認 | シート名入力、検索文字列入力 |
Sub InputBoxで入力を受け取る()
Dim sheetName As String
sheetName = InputBox("処理するシート名を入力してください。", "シート名の入力")
If sheetName = "" Then
MsgBox "キャンセルされました。", vbInformation
Exit Sub
End If
MsgBox sheetName & " を処理します。"
End Sub
「はい/いいえで聞く」→ MsgBox、「値を入力してもらう」→ InputBox、と覚えればOKです。
落とし穴
| # | 症状 | 原因 | 対策 |
|---|---|---|---|
| 1 | If answer = "Yes" で分岐しない |
vbYesの値は数値の6。文字列”Yes”とは一致しない | 定数名 vbYes で比較する(If answer = vbYes) |
| 2 | 戻り値が取れない(型エラー) | MsgBoxを括弧なしで呼んでいる | 戻り値を受け取るなら括弧で囲む: answer = MsgBox("...", vbYesNo) |
| 3 | タイトルバーが「Microsoft Excel」のまま | 第3引数(タイトル)を省略している | MsgBox "メッセージ", vbYesNo, "確認" のように第3引数を設定 |
| 4 | 危険な操作で「はい」がデフォルト選択 | vbDefaultButton1(第1ボタン)がデフォルト | vbDefaultButton2 を足して「いいえ」をデフォルトにする |
| 5 | ボタンとアイコンの組み合わせ方がわからない | 定数を足し算で組み合わせることを知らない | vbYesNo + vbQuestion + vbDefaultButton2 のように + で足す |
自分も2番の落とし穴で30分ハマったことがあります。answer = MsgBox "メッセージ", vbYesNo と書いてコンパイルエラーになり、何が悪いのかわからなかった。括弧の有無でVBAの動作が変わることを、そのとき初めて知りました。
落とし穴4の補足 — vbDefaultButton2の使い方:
削除やデータの上書きなど、取り消せない操作では「いいえ」をデフォルトにするのが安全です。Enterキーを押しても「いいえ」が選ばれるようになります。
' いいえをデフォルトにする(Enterキー=キャンセル)
answer = MsgBox("削除しますか?", vbYesNo + vbExclamation + vbDefaultButton2, "確認")
FAQ
Q1. MsgBoxで3行以上のメッセージを表示するには?
vbCrLf を複数回使って改行できます。
MsgBox "1行目" & vbCrLf & "2行目" & vbCrLf & "3行目"
Q2. MsgBoxの戻り値の一覧は?
| 定数 | 値 | 対応ボタン |
|---|---|---|
| vbOK | 1 | OK |
| vbCancel | 2 | キャンセル |
| vbAbort | 3 | 中止 |
| vbRetry | 4 | 再試行 |
| vbIgnore | 5 | 無視 |
| vbYes | 6 | はい |
| vbNo | 7 | いいえ |
Q3. 確認ダイアログとエラー処理を組み合わせるには?
確認ダイアログで「はい」を選んだ後の処理に On Error を入れると、さらに安全です。エラー処理の詳細はエラー処理(On Error)で止まらないマクロを作る方法を参照してください。
If answer = vbYes Then
On Error GoTo ErrHandler
' 処理
Exit Sub
ErrHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End If
Q4. MsgBoxをボタンクリックで実行するには?
シート上にボタンを配置し、マクロを割り当てます。詳しくはマクロをボタン1つで実行する方法を参照してください。
Q5. MsgBoxの代わりにUserFormで確認画面を作れる?
できますが、単純なYes/No確認ならMsgBoxで十分です。入力項目が複数ある場合は入力フォーム(UserForm)で手入力ミスを防ぐ方法を検討してください。
まとめ
この記事では、VBAのMsgBoxで確認ダイアログを表示し、Yes/Noの回答に応じて処理を分岐する方法を解説しました。
- 通知だけ:
MsgBox "完了しました。" - 確認して分岐:
answer = MsgBox("実行しますか?", vbYesNo + vbQuestion) - 実務版: 件数表示 + 警告アイコン + デフォルトを「いいえ」に
削除や上書きなどの取り消せない操作には、必ず確認ダイアログを入れることをおすすめします。1行追加するだけで事故を防げます。
関連記事
- 古いファイルを自動削除する方法 — 削除前の確認ダイアログの実例
- マクロをボタン1つで実行する方法 — 確認ダイアログ付きマクロをボタンに割り当て
- エラー処理(On Error)で止まらないマクロを作る方法 — 確認後の処理でエラーが起きても安全に止める
- データの最終行・最終列を正確に取得する方法 — 実務版コードで使った最終行取得の詳細
- 空白行・空白セルを一括で削除する方法 — 削除系マクロに確認ダイアログを組み込む応用
次にやりたくなること
- マクロをボタン1つで実行する方法 — 確認ダイアログ付きのマクロをボタンに割り当てれば、誰でも安全に実行できるようになります
- エラー処理(On Error)で止まらないマクロを作る方法 — 確認ダイアログ + エラー処理を組み合わせると、マクロの安全性がさらに上がります

コメント