VBAのMsgBoxとInputBoxを使い分ける方法|ボタン・アイコン・セル選択ダイアログの実用パターン

VBAでユーザーとやりとりする方法は、大きく「MsgBox(伝える)」と「InputBox(聞く)」の2つです。MsgBoxは完了通知や確認ダイアログ、InputBoxは実行前に値を入力してもらう場面で使います。この2つを使い分けるだけで、同じマクロでも「誰でも使いやすい」対話型の仕組みに変わります。

この記事では、次の内容を順番に解説します。

  • MsgBoxの基本とボタン・アイコンの種類
  • Yes/Noで処理を分岐させる方法
  • InputBoxの基本と入力値の使い方
  • Application.InputBoxでセル選択ダイアログにする方法
  • MsgBoxとInputBoxを組み合わせた実用パターン
  • よくある質問(キャンセル時の処理・数値入力の検証等)

MsgBoxの基本とボタン・アイコンの種類を理解するには?

MsgBoxの基本的な書き方は次の通りです。

' 単純な通知
MsgBox "処理が完了しました。"

' タイトルとアイコンを指定する
MsgBox "処理が完了しました。", vbInformation, "完了"

第2引数でボタンの種類とアイコンを指定できます。よく使う組み合わせは次の通りです。

定数内容
vbOKOnlyOKボタンのみ(デフォルト)
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の戻り値は vbYesvbNo で判定する
  • 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

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

上部へスクロール