タイトル: 「はい」、「いいえ」、「キャンセル」ボタンの設置と処理分岐
SEOタイトル: Excel VBA の MsgBox で「はい/いいえ/キャンセル」を分岐する完全ガイド
| この記事の要点 |
|
基本構文
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 のボタン定数一覧
| 定数 | 値 | 表示されるボタン |
|---|---|---|
vbOKOnly | 0 | OK |
vbOKCancel | 1 | OK / キャンセル |
vbAbortRetryIgnore | 2 | 中止 / 再試行 / 無視 |
vbYesNoCancel | 3 | はい / いいえ / キャンセル |
vbYesNo | 4 | はい / いいえ |
vbRetryCancel | 5 | 再試行 / キャンセル |
戻り値の一覧
| 定数 | 値 | ユーザーの選択 |
|---|---|---|
vbOK | 1 | OK |
vbCancel | 2 | キャンセル |
vbAbort | 3 | 中止 |
vbRetry | 4 | 再試行 |
vbIgnore | 5 | 無視 |
vbYes | 6 | はい |
vbNo | 7 | いいえ |
アイコンの指定
ボタン定数にアイコン定数を加算することで、メッセージの種類を視覚的に伝えられます:
' クエスチョン(質問)
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 を作って自前のダイアログを構築します:
- VBE で「挿入」→「ユーザーフォーム」
- ツールボックスから CommandButton を必要数配置し、Caption を「保存」「保存せず終了」「キャンセル」等に変更
- 各ボタンの Click イベントに分岐コードを記述
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.Shell の Popup メソッドにタイムアウト引数を渡せます。例: CreateObject("WScript.Shell").Popup "msg", 5, "title", vbYesNoCancel