InputBoxとMsgBox

にメンテナンス済み

VBA でマクロを作成する際、ユーザーからの入力を受け取ったり、処理結果をメッセージで表示したりする機能は必須です。VBA には、これらを簡単に実現するInputBoxMsgBoxという 2 つの関数が用意されています。

この記事では、InputBox と MsgBox の基本的な使い方から応用テクニックまで、実践的なサンプルコードと共に詳しく解説します。

InputBox と MsgBox が必要となるシチュエーション

実務では、以下のような場面で InputBox と MsgBox を使用します:

InputBox の用途

  • ユーザー名の入力: ログイン機能や記録の際に名前を取得
  • 検索キーワードの入力: データから特定の値を検索
  • 数値の入力: 計算に必要なパラメータを取得
  • ファイル名の入力: 保存するファイル名をユーザーに指定させる
  • 日付の入力: 期間指定やフィルタ条件の設定

MsgBox の用途

  • 処理完了の通知: 「処理が完了しました」などの通知
  • エラーメッセージの表示: 問題発生時の警告
  • 確認ダイアログ: 「削除してもよろしいですか?」などの確認
  • 選択肢の提示: 「はい/いいえ」などの選択を求める
  • 情報の表示: 計算結果や統計情報の提示

MsgBox:メッセージを表示する

基本構文

MsgBox(メッセージ, [ボタン], [タイトル], [ヘルプファイル], [コンテキスト])

最もシンプルな形式:

MsgBox "メッセージ"

基本的な使い方

msgbox_basic.bas
Sub MsgBoxBasic()
    ' シンプルなメッセージ表示
    MsgBox "こんにちは、世界!"

    ' タイトル付き
    MsgBox "処理が完了しました。", , "完了通知"

    ' 複数行のメッセージ
    MsgBox "1行目" & vbCrLf & "2行目" & vbCrLf & "3行目"
End Sub
チェック

vbCrLfは改行コードです。他にもvbLf(ラインフィード)やvbCr(キャリッジリターン)が使えます。

ボタンの種類

MsgBox には様々なボタンの組み合わせを指定できます:

定数説明
vbOKOnly0OK ボタンのみ(デフォルト)
vbOKCancel1OK とキャンセルボタン
vbAbortRetryIgnore2中止、再試行、無視ボタン
vbYesNoCancel3はい、いいえ、キャンセルボタン
vbYesNo4はい、いいえボタン
vbRetryCancel5再試行、キャンセルボタン
msgbox_buttons.bas
Sub MsgBoxButtons()
    ' OKとキャンセルボタン
    MsgBox "続行しますか?", vbOKCancel, "確認"

    ' はい/いいえボタン
    MsgBox "削除してもよろしいですか?", vbYesNo, "削除確認"

    ' はい/いいえ/キャンセルボタン
    MsgBox "変更を保存しますか?", vbYesNoCancel, "保存確認"
End Sub

アイコンの種類

メッセージの重要度に応じてアイコンを表示できます:

定数説明アイコン
vbCritical16重大エラー
vbQuestion32質問
vbExclamation48警告⚠️
vbInformation64情報ℹ️
msgbox_icons.bas
Sub MsgBoxIcons()
    ' エラーメッセージ
    MsgBox "エラーが発生しました!", vbCritical, "エラー"

    ' 警告メッセージ
    MsgBox "入力値を確認してください。", vbExclamation, "警告"

    ' 情報メッセージ
    MsgBox "処理が完了しました。", vbInformation, "完了"

    ' 質問メッセージ
    MsgBox "削除しますか?", vbQuestion + vbYesNo, "確認"
End Sub
チェック
ボタンとアイコンは加算して組み合わせることができます。例:vbYesNo + vbQuestion

戻り値の処理

MsgBox は、ユーザーがクリックしたボタンに応じて戻り値を返します:

定数クリックされたボタン
vbOK1OK
vbCancel2キャンセル
vbAbort3中止
vbRetry4再試行
vbIgnore5無視
vbYes6はい
vbNo7いいえ
msgbox_return_value.bas
Sub MsgBoxReturnValue()
    Dim result As VbMsgBoxResult

    ' ユーザーの選択を取得
    result = MsgBox("このファイルを削除しますか?", vbYesNo + vbQuestion, "削除確認")

    ' 戻り値に応じて処理を分岐
    If result = vbYes Then
        MsgBox "ファイルを削除しました。", vbInformation
        ' 実際の削除処理をここに記述
    Else
        MsgBox "削除をキャンセルしました。", vbInformation
    End If
End Sub

Select Case で分岐処理

複数の選択肢がある場合は、Select Case が便利です:

msgbox_select_case.bas
Sub MsgBoxSelectCase()
    Dim result As VbMsgBoxResult

    result = MsgBox("変更を保存しますか?", vbYesNoCancel + vbQuestion, "終了確認")

    Select Case result
        Case vbYes
            MsgBox "保存して終了します。", vbInformation
            ' 保存処理

        Case vbNo
            MsgBox "保存せずに終了します。", vbInformation
            ' 終了処理

        Case vbCancel
            MsgBox "キャンセルしました。", vbInformation
            ' 何もしない

    End Select
End Sub

デフォルトボタンの指定

どのボタンをデフォルト(Enter キーで選択)にするか指定できます:

定数説明
vbDefaultButton10第 1 ボタン(デフォルト)
vbDefaultButton2256第 2 ボタン
vbDefaultButton3512第 3 ボタン
vbDefaultButton4768第 4 ボタン
msgbox_default_button.bas
Sub MsgBoxDefaultButton()
    Dim result As VbMsgBoxResult

    ' 危険な操作なので、デフォルトを「いいえ」に設定
    result = MsgBox("すべてのデータを削除しますか?", _
                    vbYesNo + vbCritical + vbDefaultButton2, _
                    "危険な操作")

    If result = vbYes Then
        MsgBox "データを削除しました。", vbInformation
    End If
End Sub
チェック

削除などの破壊的な操作では、誤操作を防ぐために安全な選択肢をデフォルトボタンに設定しましょう。

モーダルとモードレス

MsgBox はモーダル(他の操作ができない)ですが、設定で変更できます:

定数説明
vbApplicationModal0アプリケーションモーダル(デフォルト)
vbSystemModal4096システムモーダル
msgbox_modal.bas
Sub MsgBoxModal()
    ' アプリケーションモーダル(Excelのみブロック)
    MsgBox "アプリケーションモーダル", vbApplicationModal

    ' システムモーダル(すべてのアプリをブロック)
    MsgBox "システムモーダル", vbSystemModal
End Sub
チェック

vbSystemModalは非常に強力で、すべてのアプリケーションをブロックします。使用は慎重に行ってください。

InputBox:ユーザー入力を受け取る

基本構文

InputBox(メッセージ, [タイトル], [既定値], [X座標], [Y座標], [ヘルプファイル], [コンテキスト])

基本的な使い方

inputbox_basic.bas
Sub InputBoxBasic()
    Dim userName As String

    ' シンプルな入力
    userName = InputBox("お名前を入力してください")

    MsgBox "こんにちは、" & userName & "さん!"
End Sub

タイトルと既定値

inputbox_title_default.bas
Sub InputBoxTitleDefault()
    Dim userName As String

    ' タイトルと既定値を指定
    userName = InputBox("お名前を入力してください", "ユーザー名入力", "山田太郎")

    If userName <> "" Then
        MsgBox "こんにちは、" & userName & "さん!"
    End If
End Sub

キャンセル処理

inputbox_cancel.bas
Sub InputBoxCancel()
    Dim userInput As String

    userInput = InputBox("数値を入力してください", "数値入力")

    ' キャンセルボタンが押された場合は空文字列が返る
    If userInput = "" Then
        MsgBox "入力がキャンセルされました。", vbInformation
        Exit Sub
    End If

    ' 入力値を使用
    MsgBox "入力された値: " & userInput
End Sub
チェック

InputBoxでキャンセルボタンが押された場合、空文字列("")が返されます。ユーザーが実際に空文字列を入力した場合と区別できないため、注意が必要です。

数値の入力と検証

inputbox_number_validation.bas
Sub InputBoxNumberValidation()
    Dim userInput As String
    Dim num As Double

    userInput = InputBox("数値を入力してください(1〜100)", "数値入力")

    ' キャンセルチェック
    If userInput = "" Then
        MsgBox "キャンセルされました。", vbInformation
        Exit Sub
    End If

    ' 数値かどうかチェック
    If Not IsNumeric(userInput) Then
        MsgBox "数値を入力してください。", vbExclamation
        Exit Sub
    End If

    ' 数値に変換
    num = CDbl(userInput)

    ' 範囲チェック
    If num < 1 Or num > 100 Then
        MsgBox "1〜100の範囲で入力してください。", vbExclamation
        Exit Sub
    End If

    MsgBox "入力された数値: " & num, vbInformation
End Sub

再入力を促す

inputbox_retry.bas
Sub InputBoxRetry()
    Dim userInput As String
    Dim num As Double
    Dim isValid As Boolean

    Do
        userInput = InputBox("1〜10の数値を入力してください", "数値入力")

        ' キャンセルチェック
        If userInput = "" Then
            Exit Sub
        End If

        ' 数値チェック
        If IsNumeric(userInput) Then
            num = CDbl(userInput)

            ' 範囲チェック
            If num >= 1 And num <= 10 Then
                isValid = True
            Else
                MsgBox "1〜10の範囲で入力してください。", vbExclamation
            End If
        Else
            MsgBox "数値を入力してください。", vbExclamation
        End If

    Loop Until isValid

    MsgBox "入力が完了しました: " & num, vbInformation
End Sub
チェック

Do…Loopを使用すると、正しい入力があるまで繰り返し入力を促すことができます。ただし、無限ループにならないよう、キャンセル時の脱出口を必ず設けましょう。

日付の入力

inputbox_date.bas
Sub InputBoxDate()
    Dim userInput As String
    Dim inputDate As Date

    userInput = InputBox("日付を入力してください(例:2025-10-20)", "日付入力", Format(Date, "yyyy-mm-dd"))

    If userInput = "" Then
        Exit Sub
    End If

    ' 日付かどうかチェック
    If IsDate(userInput) Then
        inputDate = CDate(userInput)
        MsgBox "入力された日付: " & Format(inputDate, "yyyy年mm月dd日"), vbInformation
    Else
        MsgBox "正しい日付形式で入力してください。", vbExclamation
    End If
End Sub

Application.InputBox:型指定付き入力

Application.InputBoxは、入力時に型を指定できる強力なバージョンです。

基本構文

Application.InputBox(メッセージ, [タイトル], [既定値], [Left], [Top], [ヘルプファイル], [ヘルプコンテキストID], [Type])

Type 引数の値

意味
0数式
1数値
2文字列
4論理値
8セル参照(Range オブジェクト)
16エラー値
64数値の配列

数値入力(自動検証付き)

application_inputbox_number.bas
Sub ApplicationInputBoxNumber()
    Dim num As Double

    ' Type:=1で数値のみ受け付ける
    On Error Resume Next
    num = Application.InputBox("数値を入力してください", "数値入力", Type:=1)

    ' キャンセルの場合はFalseが返る
    If Err.Number <> 0 Then
        MsgBox "キャンセルされました。", vbInformation
        Err.Clear
        Exit Sub
    End If
    On Error GoTo 0

    MsgBox "入力された数値: " & num, vbInformation
End Sub
チェック

Application.InputBoxでキャンセルが押されると、Falseが返され、エラーが発生します。On Error Resume Nextでエラーをキャッチしましょう。

セル範囲の選択

application_inputbox_range.bas
Sub ApplicationInputBoxRange()
    Dim selectedRange As Range

    On Error Resume Next
    Set selectedRange = Application.InputBox("セル範囲を選択してください", "範囲選択", Type:=8)

    If selectedRange Is Nothing Then
        MsgBox "キャンセルされました。", vbInformation
        Exit Sub
    End If
    On Error GoTo 0

    MsgBox "選択された範囲: " & selectedRange.Address & vbCrLf & _
           "セル数: " & selectedRange.Count, vbInformation

    ' 選択範囲を処理
    selectedRange.Interior.Color = RGB(255, 255, 200)
End Sub

InputBox と Application.InputBox の比較

inputbox_comparison.bas
Sub InputBoxComparison()
    Dim result1 As String
    Dim result2 As Variant

    ' 通常のInputBox
    result1 = InputBox("文字列を入力してください", "通常のInputBox")
    Debug.Print "通常のInputBox: " & result1 & ", 型: " & TypeName(result1)

    ' Application.InputBox(文字列)
    On Error Resume Next
    result2 = Application.InputBox("文字列を入力してください", "Application.InputBox", Type:=2)
    If Err.Number = 0 Then
        Debug.Print "Application.InputBox: " & result2 & ", 型: " & TypeName(result2)
    Else
        Debug.Print "キャンセルされました"
        Err.Clear
    End If
    On Error GoTo 0
End Sub

実践的な活用例

ログイン機能

login_system.bas
Sub LoginSystem()
    Dim userName As String
    Dim password As String
    Const CORRECT_USER As String = "admin"
    Const CORRECT_PASSWORD As String = "password123"

    ' ユーザー名入力
    userName = InputBox("ユーザー名を入力してください", "ログイン")
    If userName = "" Then Exit Sub

    ' パスワード入力
    password = InputBox("パスワードを入力してください", "ログイン")
    If password = "" Then Exit Sub

    ' 認証チェック
    If userName = CORRECT_USER And password = CORRECT_PASSWORD Then
        MsgBox "ログインに成功しました!", vbInformation, "成功"
        ' メイン処理へ
    Else
        MsgBox "ユーザー名またはパスワードが間違っています。", vbCritical, "エラー"
    End If
End Sub

検索機能

search_function.bas
Sub SearchFunction()
    Dim searchWord As String
    Dim ws As Worksheet
    Dim findRange As Range
    Dim foundCount As Integer

    Set ws = ActiveSheet

    ' 検索キーワード入力
    searchWord = InputBox("検索するキーワードを入力してください", "データ検索")
    If searchWord = "" Then Exit Sub

    ' 検索実行
    Set findRange = ws.Cells.Find(What:=searchWord, LookIn:=xlValues, LookAt:=xlWhole)

    If findRange Is Nothing Then
        MsgBox "「" & searchWord & "」は見つかりませんでした。", vbInformation, "検索結果"
    Else
        findRange.Select
        MsgBox "「" & searchWord & "」が見つかりました!" & vbCrLf & _
               "セル: " & findRange.Address, vbInformation, "検索結果"
    End If
End Sub

データ一括処理の確認

batch_process_confirmation.bas
Sub BatchProcessConfirmation()
    Dim ws As Worksheet
    Dim dataCount As Long
    Dim result As VbMsgBoxResult

    Set ws = ActiveSheet
    dataCount = ws.Cells(Rows.Count, 1).End(xlUp).Row - 1

    ' 処理内容の確認
    result = MsgBox("以下の処理を実行します:" & vbCrLf & _
                    "・対象データ: " & dataCount & "件" & vbCrLf & _
                    "・処理内容: データのクリーンアップ" & vbCrLf & vbCrLf & _
                    "実行してもよろしいですか?", _
                    vbYesNo + vbQuestion, "処理確認")

    If result = vbNo Then
        MsgBox "処理をキャンセルしました。", vbInformation
        Exit Sub
    End If

    ' 処理実行
    ' ...(実際の処理)

    MsgBox "処理が完了しました!" & vbCrLf & _
           "処理件数: " & dataCount & "件", vbInformation, "完了"
End Sub

ファイル保存時の名前指定

save_with_custom_name.bas
Sub SaveWithCustomName()
    Dim fileName As String
    Dim savePath As String

    ' ファイル名入力
    fileName = InputBox("保存するファイル名を入力してください(拡張子不要)", _
                        "ファイル保存", _
                        "レポート_" & Format(Date, "yyyymmdd"))

    If fileName = "" Then
        MsgBox "保存をキャンセルしました。", vbInformation
        Exit Sub
    End If

    ' 保存パス作成
    savePath = ThisWorkbook.Path & "\" & fileName & ".xlsx"

    ' ファイルが既に存在する場合の確認
    Dim result As VbMsgBoxResult
    If Dir(savePath) <> "" Then
        result = MsgBox("同名のファイルが既に存在します。" & vbCrLf & _
                        "上書きしてもよろしいですか?", _
                        vbYesNo + vbExclamation, "上書き確認")

        If result = vbNo Then
            MsgBox "保存をキャンセルしました。", vbInformation
            Exit Sub
        End If
    End If

    ' ファイル保存
    ActiveWorkbook.SaveAs fileName:=savePath

    MsgBox "ファイルを保存しました!" & vbCrLf & _
           "保存先: " & savePath, vbInformation, "保存完了"
End Sub

複数項目の入力

multiple_inputs.bas
Sub MultipleInputs()
    Dim name As String
    Dim age As String
    Dim email As String

    ' 名前入力
    name = InputBox("お名前を入力してください", "ユーザー登録 (1/3)")
    If name = "" Then Exit Sub

    ' 年齢入力
    age = InputBox("年齢を入力してください", "ユーザー登録 (2/3)")
    If age = "" Then Exit Sub

    ' 年齢の数値チェック
    If Not IsNumeric(age) Then
        MsgBox "年齢は数値で入力してください。", vbExclamation
        Exit Sub
    End If

    ' メールアドレス入力
    email = InputBox("メールアドレスを入力してください", "ユーザー登録 (3/3)")
    If email = "" Then Exit Sub

    ' メールアドレスの簡易チェック
    If InStr(email, "@") = 0 Then
        MsgBox "有効なメールアドレスを入力してください。", vbExclamation
        Exit Sub
    End If

    ' 確認表示
    Dim message As String
    message = "以下の内容で登録します:" & vbCrLf & vbCrLf & _
              "名前: " & name & vbCrLf & _
              "年齢: " & age & "歳" & vbCrLf & _
              "メール: " & email & vbCrLf & vbCrLf & _
              "よろしいですか?"

    Dim result As VbMsgBoxResult
    result = MsgBox(message, vbYesNo + vbQuestion, "登録確認")

    If result = vbYes Then
        ' データ登録処理
        MsgBox "登録が完了しました!", vbInformation, "完了"
    Else
        MsgBox "登録をキャンセルしました。", vbInformation
    End If
End Sub

ベストプラクティス

1. 明確なメッセージ

clear_messages.bas
Sub ClearMessages()
    ' 悪い例
    MsgBox "エラー"

    ' 良い例
    MsgBox "セルA1に数値が入力されていません。" & vbCrLf & _
           "1以上の数値を入力してください。", _
           vbExclamation, "入力エラー"
End Sub

2. 適切なアイコンとボタン

appropriate_icons.bas
Sub AppropriateIcons()
    ' 情報通知
    MsgBox "処理が完了しました。", vbInformation, "完了"

    ' 警告
    MsgBox "一部のデータをスキップしました。", vbExclamation, "警告"

    ' エラー
    MsgBox "ファイルが見つかりません。", vbCritical, "エラー"

    ' 確認
    MsgBox "削除しますか?", vbQuestion + vbYesNo, "確認"
End Sub

3. 入力検証

input_validation_best_practice.bas
Sub InputValidationBestPractice()
    Dim userInput As String

    userInput = InputBox("メールアドレスを入力してください", "メール入力")

    ' 空文字列チェック
    If Trim(userInput) = "" Then
        MsgBox "メールアドレスを入力してください。", vbExclamation
        Exit Sub
    End If

    ' フォーマットチェック
    If InStr(userInput, "@") = 0 Or InStr(userInput, ".") = 0 Then
        MsgBox "正しいメールアドレスを入力してください。", vbExclamation
        Exit Sub
    End If

    MsgBox "メールアドレスを登録しました: " & userInput, vbInformation
End Sub

4. ユーザーフレンドリーな既定値

user_friendly_defaults.bas
Sub UserFriendlyDefaults()
    Dim fileName As String

    ' 日付を含む既定値を提供
    fileName = InputBox("ファイル名を入力してください", _
                        "保存", _
                        "レポート_" & Format(Date, "yyyymmdd"))

    If fileName <> "" Then
        ' 保存処理
    End If
End Sub
チェック
既定値に日付やユーザー名を含めると、ユーザーは手入力の手間が省けます。

まとめ

InputBox と MsgBox の使い方について解説しました。これらを適切に使用することで、ユーザーフレンドリーなマクロを作成できます。

重要なポイント

  1. MsgBox: メッセージ表示、確認ダイアログに最適

    • ボタンとアイコンを組み合わせてカスタマイズ
    • 戻り値を使って条件分岐
    • 適切なデフォルトボタンを設定
  2. InputBox: ユーザーからの文字列入力に使用

    • キャンセル処理を忘れずに実装
    • 入力検証を行う
    • 再入力を促す仕組みを用意
  3. Application.InputBox: 型指定が必要な場合に使用

    • 数値入力の自動検証
    • セル範囲の選択
    • キャンセル時のエラー処理

実践のヒント

  • 明確で具体的なメッセージを表示する
  • 適切なアイコンとボタンを選択する
  • 入力値の検証を必ず行う
  • ユーザーに優しい既定値を提供する
  • エラー処理を忘れずに実装する

これらの関数をマスターすることで、ユーザーとのインタラクションが豊かで使いやすい VBA マクロを作成できます。

#VBA #InputBox #MsgBox #ユーザーインターフェース #ダイアログ