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

VBA
スポンサーリンク
スポンサーリンク

この記事でできること

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

関連記事

次にやりたくなること

コメント

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