11.

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

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. RevitAPI.dll と RevitAPIUI.dll の参照
  2. マニフェストファイルの書き方
  3. アドインの追加/設置方法
  4. アドインの作成サンプル(外部ツール編)
  5. アドインの作成サンプル(外部アプリケーション編)
  6. 要素の取得と情報の表示
  7. 要素のカテゴリとマテリアルの取得と表示
  8. よく使うBuiltInCategoryの一覧
  9. 外部ツールでAutodesk.Revit.Documentを取得する方法
  10. エラーメッセージの設定方法
  11. 「はい」、「いいえ」、「キャンセル」ボタンの設置と処理分岐
  12. 要素(カテゴリ、ファミリ、タイプ)とは
  13. ElementIdとUniqueIdの違い
  14. 要素フィルターの使い方
  15. 要素のパラメータ一覧の取得
  16. pyRevitの導入と簡単なアプリケーションの作成
  17. Revit SDKのサンプルの場所とビルド方法
  18. FamilySymbol(タイプ)の取得とパラメータの変更
  19. 相対パスでdllにアイコン画像を埋め込む方法
  20. 「グループ」について