VBAでユーザーとやりとりする方法は、大きく「MsgBox(伝える)」と「InputBox(聞く)」の2つです。MsgBoxは完了通知や確認ダイアログ、InputBoxは実行前に値を入力してもらう場面で使います。この2つを使い分けるだけで、同じマクロでも「誰でも使いやすい」対話型の仕組みに変わります。
この記事では、次の内容を順番に解説します。
- MsgBoxの基本とボタン・アイコンの種類
- Yes/Noで処理を分岐させる方法
- InputBoxの基本と入力値の使い方
- Application.InputBoxでセル選択ダイアログにする方法
- MsgBoxとInputBoxを組み合わせた実用パターン
- よくある質問(キャンセル時の処理・数値入力の検証等)
MsgBoxの基本とボタン・アイコンの種類を理解するには?
MsgBoxの基本的な書き方は次の通りです。
' 単純な通知
MsgBox "処理が完了しました。"
' タイトルとアイコンを指定する
MsgBox "処理が完了しました。", vbInformation, "完了"
第2引数でボタンの種類とアイコンを指定できます。よく使う組み合わせは次の通りです。
| 定数 | 内容 |
|---|---|
vbOKOnly | OKボタンのみ(デフォルト) |
vbYesNo | はい/いいえボタン |
vbYesNoCancel | はい/いいえ/キャンセルボタン |
vbInformation | 情報アイコン(青い「i」) |
vbExclamation | 警告アイコン(黄色い「!」) |
vbCritical | エラーアイコン(赤い「×」) |
vbQuestion | 質問アイコン(「?」) |
ボタンとアイコンは + で組み合わせて使います。
MsgBox "削除してもよいですか?", vbYesNo + vbExclamation, "確認"
Yes/Noで処理を分岐させるには?
MsgBoxは戻り値を変数に受け取ることで、ユーザーの選択に応じて処理を分岐できます。
Sub ConfirmAndRun()
Dim res As VbMsgBoxResult
res = MsgBox("前月分のデータを削除して処理を実行しますか?", vbYesNo + vbExclamation, "確認")
If res = vbYes Then
' はいが選ばれた場合の処理
MsgBox "処理を実行します。", vbInformation
Else
' いいえが選ばれた場合
MsgBox "キャンセルしました。", vbInformation
Exit Sub
End If
End Sub
このパターンは「間違えて実行してしまう」ミスを防ぐのに非常に有効です。削除処理や上書き保存など、取り消せない操作の前に入れておく習慣をつけましょう。
よく使う戻り値の定数は次の通りです。
| 定数 | 意味 |
|---|---|
vbYes | 「はい」が押された |
vbNo | 「いいえ」が押された |
vbCancel | 「キャンセル」が押された |
vbOK | 「OK」が押された |
InputBoxの基本と入力値の使い方を理解するには?
InputBoxは、マクロの実行中にユーザーに値を入力してもらうダイアログです。
Sub AskAndProcess()
Dim city As String
city = InputBox("出張先の都市を入力してください", "出張旅費申請")
' キャンセルまたは空白の場合は処理を中断
If city = "" Then
MsgBox "入力がキャンセルされました。", vbInformation
Exit Sub
End If
MsgBox city & " の旅費申請を開始します。", vbInformation
End Sub
InputBoxのポイントは次の通りです。
- 戻り値は常に 文字列(String型) で返ってくる
- キャンセルした場合も 空文字列(””) が返る
- 入力なしでOKを押した場合も空文字列が返るため、キャンセルと区別できない
第3引数にデフォルト値を指定することもできます。
' デフォルト値として「東京」を表示しておく
city = InputBox("出張先の都市を入力してください", "出張旅費申請", "東京")
Application.InputBoxでセル選択ダイアログにするには?
通常の InputBox は文字列の入力しかできませんが、Application.InputBox を使うと、ユーザーにセルを選ばせるダイアログにすることができます。
Sub SelectTargetCell()
Dim targetCell As Range
On Error Resume Next
Set targetCell = Application.InputBox("データを入力するセルを選択してください", "セル選択", Type:=8)
On Error GoTo 0
' キャンセルした場合はNothingになる
If targetCell Is Nothing Then
MsgBox "キャンセルされました。", vbInformation
Exit Sub
End If
targetCell.Value = "入力済み"
End Sub
Type:=8 を指定するとセル参照の選択ダイアログになります。キャンセルした場合は Nothing が返るため、If targetCell Is Nothing Then で確認します。
| Type値 | 受け取れる値の種類 |
|---|---|
1 | 数値 |
2 | 文字列 |
8 | セル参照(Rangeオブジェクト) |
MsgBoxとInputBoxを組み合わせた実用パターンを作るには?
「対象月を入力してもらい、確認後に処理を実行する」という実務でよくある流れです。
Sub MonthlyProcess()
Dim targetMonth As String
Dim res As VbMsgBoxResult
' ① 対象月を入力してもらう
targetMonth = InputBox("処理対象の月を入力してください(例:2026/07)", "月次処理", Format(Date, "yyyy/mm"))
If targetMonth = "" Then
MsgBox "キャンセルされました。", vbInformation
Exit Sub
End If
' ② 確認ダイアログを表示
res = MsgBox(targetMonth & " の月次処理を実行しますか?", vbYesNo + vbQuestion, "確認")
If res = vbNo Then
MsgBox "キャンセルしました。", vbInformation
Exit Sub
End If
' ③ 処理本体(ここに実際の処理を書く)
MsgBox targetMonth & " の処理が完了しました。", vbInformation, "完了"
End Sub
「入力 → 確認 → 実行」の3ステップにするだけで、誤操作を大幅に減らせます。毎月繰り返す処理に組み込むと特に効果的です。
まとめ
- MsgBoxは 「伝える・確認する」、InputBoxは 「入力してもらう」 のが基本の使い分け
- MsgBoxの第2引数でボタン(
vbYesNo等)とアイコン(vbExclamation等)を+で組み合わせる - Yes/Noの戻り値は
vbYes・vbNoで判定する - InputBoxのキャンセルは 空文字列(
"") で判定する - セル選択をさせたい場合は
Application.InputBox(Type:=8)を使う - 「入力 → 確認 → 実行」の3ステップで 誤操作を防ぐ 対話型マクロになる
よくある質問
InputBoxでキャンセルと空白入力を区別する方法は?
通常の InputBox ではキャンセルも空白入力も同じ "" が返るため区別できません。区別が必要な場合は Application.InputBox(Type:=2) を使います。こちらはキャンセル時に False(Boolean)が返るため、If input = False Then でキャンセルを検知できます。
InputBoxで数値だけを受け付けたい場合は?
InputBoxの戻り値は文字列なので、数値かどうかを IsNumeric で確認してから使います。
Dim input As String
Dim num As Long
input = InputBox("件数を入力してください")
If Not IsNumeric(input) Or input = "" Then
MsgBox "数値を入力してください。", vbExclamation
Exit Sub
End If
num = CLng(input)
MsgBoxのタイトルバーに会社名やシステム名を入れたい場合は?
MsgBoxの第3引数にタイトル文字列を指定します。省略するとExcelのバージョン名が表示されます。毎回同じタイトルを使う場合は定数に入れておくと管理が楽です。
Const APP_TITLE As String = "月次処理システム"
MsgBox "処理が完了しました。", vbInformation, APP_TITLE
MsgBoxを使わずにステータスバーでメッセージを表示する方法は?
処理中の進捗など、ダイアログを出さずに状況を伝えたい場合は Application.StatusBar が使えます。
Application.StatusBar = "処理中です…しばらくお待ちください"
' (処理)
Application.StatusBar = False ' 元に戻す
ダイアログと違って処理を止めないため、ループ処理の進捗表示に向いています。
InputBoxで入力された値をセルに直接書き込むには?
戻り値をそのままセルの .Value に代入するだけです。
Dim input As String
input = InputBox("担当者名を入力してください")
If input <> "" Then
Range("B2").Value = input
End If


