【VBA】MsgBoxで確認ダイアログを出して処理を分岐する方法(コピペOK)

VBAのMsgBoxで確認ダイアログを表示して処理を分岐する方法のアイキャッチ VBA

この記事でできること

VBAのMsgBoxで確認ダイアログを表示し、ユーザーの回答(はい/いいえ)に応じて処理を分岐する方法を解説します。

  • 対象:マクロ実行前に確認を入れたい人。MsgBoxのボタンやアイコンの使い方がわからない人
  • 所要時間:コピペ → 実行まで3分

どんな場面で使う?

MsgBoxの確認ダイアログが活躍するのは、たとえばこんな場面です。

  • データの削除前に「本当に消していいか」確認したい — 行の一括削除やシートのクリアなど、元に戻せない操作の前にワンクッション入れることで事故を防げます
  • マクロを他の人に渡すとき、誤実行を防ぎたい — 自分だけが使うマクロなら操作ミスは自己責任ですが、他の人が使うマクロでは「何が起きるか」を表示してから実行させたい場面が多いです
  • 処理件数を事前に表示して安心感を出したい — 「50件のデータを削除します。よろしいですか?」のように件数を表示すれば、想定外の件数が出たときに気づけます
  • 処理完了後に結果を通知したい — 「10件を処理しました」「ファイルの保存が完了しました」のように結果を表示することで、マクロが正常に終わったかどうかを確認できます
  • 上書き保存の前に確認を入れたい — 集計結果の上書き保存やファイル出力の前に確認を挟むことで、意図しない上書きを防げます

完成イメージ

実行すると「削除しますか?」の確認ダイアログが表示されます。

  • 「はい」をクリック → 削除処理を実行
  • 「いいえ」をクリック → キャンセルしてマクロ終了

確認ダイアログを1行入れるだけで、うっかり実行による事故を防げます。

導入

自分も以前、削除マクロをうっかり実行してデータを丸ごと消してしまったことがあります。バックアップもなく、正直あのときは血の気が引きました。

MsgBoxで確認ダイアログを入れるようになってからは、同じ事故はゼロ。マクロを他の人に渡すときも「勝手に実行されて困る」という心配がなくなりました。

この記事で、削除や上書きなどの操作前に確認を入れる方法を身につけてもらえればうれしいです。

事前準備

以下の環境を前提にしています。

項目 内容
Excel Excel 2016以降 / Microsoft 365
OS Windows 10/11
保存形式 .xlsm(マクロ有効ブック)
コードの貼り付け場所 標準モジュール
実行方法 マクロ実行(Alt + F8 → 実行)またはボタン割り当て

VBE(コードを書く画面)の開き方がわからない場合は、Alt + F11 で開けます。標準モジュールは「挿入」→「標準モジュール」で追加してください。

コード(最小版)– 基本のMsgBox

通知メッセージ(戻り値なし)

まずは一番シンプルな使い方です。OKボタンだけのメッセージを表示します。


Sub メッセージを表示する()
    MsgBox "処理が完了しました。"
End Sub

ポイント: 通知だけの場合は括弧なしで書きます。戻り値を使わないので、これで十分です。

MsgBoxは引数を1つだけ渡すと、OKボタンだけのシンプルなダイアログになります。処理の完了通知やエラー発生時の告知など「ユーザーに読んでもらうだけでいい」場面で使います。VBAでは戻り値を使わないプロシージャ呼び出しは括弧なしで書くのがルールなので、MsgBox("...") ではなく MsgBox "..." と書きます。括弧を付けても動作はしますが、VBAの文法としては括弧なしが正式です。

確認ダイアログ(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 と書くとエラーになります。

このコードの処理の流れをもう少し詳しく説明します。

まず Dim answer As VbMsgBoxResult で戻り値を受け取る変数を宣言しています。VbMsgBoxResult はVBA組み込みの列挙型で、vbYes(6)やvbNo(7)などの定数を格納できます。Integer型でも受け取れますが、VbMsgBoxResult と書いた方がコードの意図が明確になります。

次に MsgBox("...", vbYesNo + vbQuestion) で「はい/いいえ」のボタン構成と疑問アイコンを組み合わせたダイアログを表示しています。vbYesNovbQuestion は内部的にはそれぞれ4と32という数値で、足し算で組み合わせる仕組みになっています。メッセージ内の vbCrLf は改行コード(キャリッジリターン+ラインフィード)で、Windowsの標準的な改行文字です。

最後に If answer = vbYes Then でユーザーの応答を判定しています。「はい」が押されたら vbYes(数値の6)、「いいえ」なら vbNo(数値の7)が返ります。この分岐により、ユーザーが明示的に「はい」を選んだ場合だけ処理を実行できます。

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の動作が変わることを、そのとき初めて知りました。

追加の落とし穴:

# 症状 原因 対策
6 MsgBoxが表示されたままマクロが止まり、自動処理が進まない ループの中にMsgBoxを入れている ループ内の確認は最初の1回だけにするか、処理後にまとめて結果を表示する。1件ごとにMsgBoxが出ると、100件のデータ処理で100回OKを押すことになる
7 vbYesNoCancelでキャンセルを押したときの処理が抜けている vbYesとvbNo以外の戻り値(vbCancel)を想定していない Select Case answer で3つの分岐すべてを明示的に書く。または If answer <> vbYes Then で「はい以外は全部キャンセル扱い」にする方法が安全

VBAのMsgBoxではいいいえの戻り値が取得できないときの対処法

「MsgBoxでYes/Noボタンを表示したのに、変数に戻り値が入らない」という場合、原因はMsgBoxの呼び出しで括弧を付けていないことだ。VBAでは戻り値を変数に格納する場合は括弧が必須で、answer = MsgBox("メッセージ", vbYesNo) と書く必要がある。answer = MsgBox "メッセージ", vbYesNo と括弧なしで書くとコンパイルエラーになる。自分もこのルールを知らずに30分ハマった。対処法はシンプルで、MsgBoxの引数を括弧で囲むだけ。逆に、戻り値を使わない通知だけの場合は括弧なし MsgBox "完了しました。" と書くのがVBAの文法だ。

VBAのMsgBoxで戻り値の判定がうまくいかないときの対処法

「If文でvbYesを判定しているのに、はいを押しても処理が実行されない」という場合、原因は If answer = "Yes" のように文字列で比較していることが多い。vbYes は文字列ではなく数値の 6 を表す定数なので、文字列 “Yes” とは一致しない。対処法は、必ず定数名 vbYes(= 6)で比較すること。If answer = vbYes Then が正しい書き方だ。また、安全な設計としては If answer <> vbYes Then Exit Sub のように「はい以外は全部キャンセル」にする書き方がおすすめ。vbYesNoCancelの3択でも漏れなく対応できる。

落とし穴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行追加するだけで事故を防げます。

関連記事

次にやりたくなること

MsgBoxの使い方が分かったら、次はこのあたりに進むと実務のマクロがぐっと安全になります。

  • 行・列の挿入・削除をVBAで自動化する方法 — 削除系マクロにMsgBoxの確認ダイアログを組み込む実践例。実務版コードにはYes/No分岐が入っています
  • エラー処理(On Error)で止まらないマクロを作る方法 — 確認ダイアログで「はい」を選んだ後にエラーが起きても安全に止める方法
  • Excelファイルを自動で開いて処理して閉じる方法 — ファイル処理の前に確認ダイアログを入れると、対象フォルダの間違いに気づけます
  • Select Caseで複数条件の分岐を書く方法 — vbYesNoCancelのように3択以上の分岐が必要な場合、If文よりSelect Caseの方がスッキリ書けます
  • 実行ログを記録する方法 — 確認ダイアログで「はい」を選んで実行した操作の履歴をログに残しておくと、後から「いつ誰が実行したか」が追えます

コメント

タイトルとURLをコピーしました