この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:5
ページ更新者:T
更新日時:2026-06-11 07:07:02

タイトル: 「はい」、「いいえ」、「キャンセル」ボタンの設置と処理分岐
SEOタイトル: Excel VBA の MsgBox で「はい/いいえ/キャンセル」を分岐する完全ガイド

この記事の要点
  • Excel VBA の MsgBox で 3 択ボタンを出すには vbYesNoCancel 定数を指定
  • 構文: MsgBox("メッセージ", vbYesNoCancel + vbQuestion, "タイトル")
  • 戻り値は vbYes / vbNo / vbCancel変数で受けて Select Case で分岐するのが定石
  • アイコンは vbQuestion(?)/ vbExclamation(!)/ vbCritical(×)/ vbInformation(i)を加算
  • 3 ボタンでは足りない場合は UserForm でカスタムダイアログを自作する

基本構文

Excel VBA の MsgBox 関数で「はい / いいえ / キャンセル」3 ボタンを表示し、ユーザーの選択に応じて処理を分岐する基本パターンです。

Sub Confirm3Buttons()
    Dim ret As VbMsgBoxResult
    ret = MsgBox("保存しますか?", vbYesNoCancel + vbQuestion, "確認")

    Select Case ret
        Case vbYes
            MsgBox "「はい」が押されました(保存処理を実行)", vbInformation
            ' ここに保存処理を書く
            ThisWorkbook.Save
        Case vbNo
            MsgBox "「いいえ」が押されました(保存せず続行)", vbInformation
            ' 保存しないで続行
        Case vbCancel
            MsgBox "「キャンセル」が押されました(処理中断)", vbInformation
            Exit Sub
    End Select
End Sub

MsgBox のボタン定数一覧

定数表示されるボタン
vbOKOnly0OK
vbOKCancel1OK / キャンセル
vbAbortRetryIgnore2中止 / 再試行 / 無視
vbYesNoCancel3はい / いいえ / キャンセル
vbYesNo4はい / いいえ
vbRetryCancel5再試行 / キャンセル

戻り値の一覧

定数ユーザーの選択
vbOK1OK
vbCancel2キャンセル
vbAbort3中止
vbRetry4再試行
vbIgnore5無視
vbYes6はい
vbNo7いいえ

アイコンの指定

ボタン定数にアイコン定数を加算することで、メッセージの種類を視覚的に伝えられます:

' クエスチョン(質問)
MsgBox "削除してよろしいですか?", vbYesNo + vbQuestion, "確認"

' 警告(黄色三角)
MsgBox "ファイルが大きすぎます", vbOKOnly + vbExclamation, "警告"

' エラー(赤丸×)
MsgBox "保存に失敗しました", vbOKOnly + vbCritical, "エラー"

' 情報(青 i)
MsgBox "処理が完了しました", vbOKOnly + vbInformation, "情報"

' デフォルトボタンを指定(vbDefaultButton2 = 第 2 ボタンが既定)
MsgBox "本当に削除?", vbYesNo + vbQuestion + vbDefaultButton2, "確認"

If / ElseIf による分岐(簡易版)

分岐が 2 通りだけなら If でも十分です:

Sub ConfirmYesNo()
    If MsgBox("削除しますか?", vbYesNo + vbQuestion, "確認") = vbYes Then
        ' 削除処理
        Range("A1:A10").ClearContents
        MsgBox "削除しました", vbInformation
    Else
        MsgBox "キャンセルされました", vbInformation
    End If
End Sub

実用例: ファイル上書き確認

Sub SaveWithConfirm()
    Dim filePath As String
    filePath = "C:\Work\report.xlsx"

    If Dir(filePath) <> "" Then
        Dim ret As VbMsgBoxResult
        ret = MsgBox(filePath & " は既に存在します。" & vbCrLf & _
                     "上書きしますか?", _
                     vbYesNoCancel + vbExclamation, _
                     "上書き確認")
        Select Case ret
            Case vbYes
                Application.DisplayAlerts = False
                ThisWorkbook.SaveAs filePath
                Application.DisplayAlerts = True
                MsgBox "上書き保存しました", vbInformation
            Case vbNo
                ' 別名で保存
                Dim newPath As Variant
                newPath = Application.GetSaveAsFilename( _
                    InitialFileName:="report_new.xlsx", _
                    FileFilter:="Excel ファイル (*.xlsx), *.xlsx")
                If newPath <> False Then
                    ThisWorkbook.SaveAs newPath
                End If
            Case vbCancel
                Exit Sub
        End Select
    Else
        ThisWorkbook.SaveAs filePath
    End If
End Sub

UserForm でカスタムダイアログ

MsgBox の 3 ボタンでは足りない(ボタンを 4 個以上、ラベルを自由に変えたい)場合は、UserForm を作って自前のダイアログを構築します:

  1. VBE で「挿入」→「ユーザーフォーム」
  2. ツールボックスから CommandButton を必要数配置し、Caption を「保存」「保存せず終了」「キャンセル」等に変更
  3. 各ボタンの Click イベントに分岐コードを記述
  4. UserForm1.Show で表示
' UserForm1 のコード
Public UserChoice As String

Private Sub CommandButton1_Click()  ' 保存
    UserChoice = "save"
    Me.Hide
End Sub

Private Sub CommandButton2_Click()  ' 保存せず終了
    UserChoice = "discard"
    Me.Hide
End Sub

Private Sub CommandButton3_Click()  ' キャンセル
    UserChoice = "cancel"
    Me.Hide
End Sub

' 標準モジュール側
Sub ShowCustomDialog()
    UserForm1.Show
    Select Case UserForm1.UserChoice
        Case "save":    ThisWorkbook.Save
        Case "discard": ThisWorkbook.Close SaveChanges:=False
        Case "cancel":  Exit Sub
    End Select
    Unload UserForm1
End Sub

よくあるトラブル

症状原因対処
常に vbYes 判定になる戻り値を受けていないret = MsgBox(...) と変数に代入
×ボタンで閉じられると意図せぬ分岐×は vbCancel と同じvbCancel の Case で適切に処理
改行が入らない"\n" は VBA では使えないvbCrLf / vbNewLine を使う
長い文字列で行継続できない1 行が長すぎる末尾に _(半角スペース + アンダースコア)

FAQ

Q: MsgBox の×ボタンを無効化したい
A: MsgBox では不可能。UserForm で QueryClose イベントを使って閉じる操作を抑制してください。

Q: ボタンのラベルを「保存」「破棄」のように日本語にしたい
A: MsgBox では固定。UserForm で CommandButton を配置し Caption を変更してください。

Q: 一定時間で自動的に閉じたい
A: WScript.ShellPopup メソッドにタイムアウト引数を渡せます。例: CreateObject("WScript.Shell").Popup "msg", 5, "title", vbYesNoCancel

📸 参考画像

※ 旧バージョンから引き継いだ参考画像です。手順・図解の補助としてご覧ください。

参考画像