InputBoxとMsgBox
VBA でマクロを作成する際、ユーザーからの入力を受け取ったり、処理結果をメッセージで表示したりする機能は必須です。VBA には、これらを簡単に実現するInputBoxとMsgBoxという 2 つの関数が用意されています。
この記事では、InputBox と MsgBox の基本的な使い方から応用テクニックまで、実践的なサンプルコードと共に詳しく解説します。
InputBox と MsgBox が必要となるシチュエーション
実務では、以下のような場面で InputBox と MsgBox を使用します:
InputBox の用途
- ユーザー名の入力: ログイン機能や記録の際に名前を取得
- 検索キーワードの入力: データから特定の値を検索
- 数値の入力: 計算に必要なパラメータを取得
- ファイル名の入力: 保存するファイル名をユーザーに指定させる
- 日付の入力: 期間指定やフィルタ条件の設定
MsgBox の用途
- 処理完了の通知: 「処理が完了しました」などの通知
- エラーメッセージの表示: 問題発生時の警告
- 確認ダイアログ: 「削除してもよろしいですか?」などの確認
- 選択肢の提示: 「はい/いいえ」などの選択を求める
- 情報の表示: 計算結果や統計情報の提示
MsgBox:メッセージを表示する
基本構文
MsgBox(メッセージ, [ボタン], [タイトル], [ヘルプファイル], [コンテキスト])
最もシンプルな形式:
MsgBox "メッセージ"
基本的な使い方
Sub MsgBoxBasic()
' シンプルなメッセージ表示
MsgBox "こんにちは、世界!"
' タイトル付き
MsgBox "処理が完了しました。", , "完了通知"
' 複数行のメッセージ
MsgBox "1行目" & vbCrLf & "2行目" & vbCrLf & "3行目"
End Sub
vbCrLfは改行コードです。他にもvbLf(ラインフィード)やvbCr(キャリッジリターン)が使えます。
ボタンの種類
MsgBox には様々なボタンの組み合わせを指定できます:
| 定数 | 値 | 説明 |
|---|---|---|
| vbOKOnly | 0 | OK ボタンのみ(デフォルト) |
| vbOKCancel | 1 | OK とキャンセルボタン |
| vbAbortRetryIgnore | 2 | 中止、再試行、無視ボタン |
| vbYesNoCancel | 3 | はい、いいえ、キャンセルボタン |
| vbYesNo | 4 | はい、いいえボタン |
| vbRetryCancel | 5 | 再試行、キャンセルボタン |
Sub MsgBoxButtons()
' OKとキャンセルボタン
MsgBox "続行しますか?", vbOKCancel, "確認"
' はい/いいえボタン
MsgBox "削除してもよろしいですか?", vbYesNo, "削除確認"
' はい/いいえ/キャンセルボタン
MsgBox "変更を保存しますか?", vbYesNoCancel, "保存確認"
End Sub
アイコンの種類
メッセージの重要度に応じてアイコンを表示できます:
| 定数 | 値 | 説明 | アイコン |
|---|---|---|---|
| vbCritical | 16 | 重大エラー | ❌ |
| vbQuestion | 32 | 質問 | ❓ |
| vbExclamation | 48 | 警告 | ⚠️ |
| vbInformation | 64 | 情報 | ℹ️ |
Sub MsgBoxIcons()
' エラーメッセージ
MsgBox "エラーが発生しました!", vbCritical, "エラー"
' 警告メッセージ
MsgBox "入力値を確認してください。", vbExclamation, "警告"
' 情報メッセージ
MsgBox "処理が完了しました。", vbInformation, "完了"
' 質問メッセージ
MsgBox "削除しますか?", vbQuestion + vbYesNo, "確認"
End Sub
vbYesNo + vbQuestion 戻り値の処理
MsgBox は、ユーザーがクリックしたボタンに応じて戻り値を返します:
| 定数 | 値 | クリックされたボタン |
|---|---|---|
| vbOK | 1 | OK |
| vbCancel | 2 | キャンセル |
| vbAbort | 3 | 中止 |
| vbRetry | 4 | 再試行 |
| vbIgnore | 5 | 無視 |
| vbYes | 6 | はい |
| vbNo | 7 | いいえ |
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 が便利です:
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 キーで選択)にするか指定できます:
| 定数 | 値 | 説明 |
|---|---|---|
| vbDefaultButton1 | 0 | 第 1 ボタン(デフォルト) |
| vbDefaultButton2 | 256 | 第 2 ボタン |
| vbDefaultButton3 | 512 | 第 3 ボタン |
| vbDefaultButton4 | 768 | 第 4 ボタン |
Sub MsgBoxDefaultButton()
Dim result As VbMsgBoxResult
' 危険な操作なので、デフォルトを「いいえ」に設定
result = MsgBox("すべてのデータを削除しますか?", _
vbYesNo + vbCritical + vbDefaultButton2, _
"危険な操作")
If result = vbYes Then
MsgBox "データを削除しました。", vbInformation
End If
End Sub
削除などの破壊的な操作では、誤操作を防ぐために安全な選択肢をデフォルトボタンに設定しましょう。
モーダルとモードレス
MsgBox はモーダル(他の操作ができない)ですが、設定で変更できます:
| 定数 | 値 | 説明 |
|---|---|---|
| vbApplicationModal | 0 | アプリケーションモーダル(デフォルト) |
| vbSystemModal | 4096 | システムモーダル |
Sub MsgBoxModal()
' アプリケーションモーダル(Excelのみブロック)
MsgBox "アプリケーションモーダル", vbApplicationModal
' システムモーダル(すべてのアプリをブロック)
MsgBox "システムモーダル", vbSystemModal
End Sub
vbSystemModalは非常に強力で、すべてのアプリケーションをブロックします。使用は慎重に行ってください。
InputBox:ユーザー入力を受け取る
基本構文
InputBox(メッセージ, [タイトル], [既定値], [X座標], [Y座標], [ヘルプファイル], [コンテキスト])
基本的な使い方
Sub InputBoxBasic()
Dim userName As String
' シンプルな入力
userName = InputBox("お名前を入力してください")
MsgBox "こんにちは、" & userName & "さん!"
End Sub
タイトルと既定値
Sub InputBoxTitleDefault()
Dim userName As String
' タイトルと既定値を指定
userName = InputBox("お名前を入力してください", "ユーザー名入力", "山田太郎")
If userName <> "" Then
MsgBox "こんにちは、" & userName & "さん!"
End If
End Sub
キャンセル処理
Sub InputBoxCancel()
Dim userInput As String
userInput = InputBox("数値を入力してください", "数値入力")
' キャンセルボタンが押された場合は空文字列が返る
If userInput = "" Then
MsgBox "入力がキャンセルされました。", vbInformation
Exit Sub
End If
' 入力値を使用
MsgBox "入力された値: " & userInput
End Sub
InputBoxでキャンセルボタンが押された場合、空文字列("")が返されます。ユーザーが実際に空文字列を入力した場合と区別できないため、注意が必要です。
数値の入力と検証
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
再入力を促す
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を使用すると、正しい入力があるまで繰り返し入力を促すことができます。ただし、無限ループにならないよう、キャンセル時の脱出口を必ず設けましょう。
日付の入力
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 | 数値の配列 |
数値入力(自動検証付き)
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でエラーをキャッチしましょう。
セル範囲の選択
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 の比較
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
実践的な活用例
ログイン機能
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
検索機能
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
データ一括処理の確認
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
ファイル保存時の名前指定
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
複数項目の入力
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. 明確なメッセージ
Sub ClearMessages()
' 悪い例
MsgBox "エラー"
' 良い例
MsgBox "セルA1に数値が入力されていません。" & vbCrLf & _
"1以上の数値を入力してください。", _
vbExclamation, "入力エラー"
End Sub
2. 適切なアイコンとボタン
Sub AppropriateIcons()
' 情報通知
MsgBox "処理が完了しました。", vbInformation, "完了"
' 警告
MsgBox "一部のデータをスキップしました。", vbExclamation, "警告"
' エラー
MsgBox "ファイルが見つかりません。", vbCritical, "エラー"
' 確認
MsgBox "削除しますか?", vbQuestion + vbYesNo, "確認"
End Sub
3. 入力検証
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. ユーザーフレンドリーな既定値
Sub UserFriendlyDefaults()
Dim fileName As String
' 日付を含む既定値を提供
fileName = InputBox("ファイル名を入力してください", _
"保存", _
"レポート_" & Format(Date, "yyyymmdd"))
If fileName <> "" Then
' 保存処理
End If
End Sub
まとめ
InputBox と MsgBox の使い方について解説しました。これらを適切に使用することで、ユーザーフレンドリーなマクロを作成できます。
重要なポイント:
-
MsgBox: メッセージ表示、確認ダイアログに最適
- ボタンとアイコンを組み合わせてカスタマイズ
- 戻り値を使って条件分岐
- 適切なデフォルトボタンを設定
-
InputBox: ユーザーからの文字列入力に使用
- キャンセル処理を忘れずに実装
- 入力検証を行う
- 再入力を促す仕組みを用意
-
Application.InputBox: 型指定が必要な場合に使用
- 数値入力の自動検証
- セル範囲の選択
- キャンセル時のエラー処理
実践のヒント:
- 明確で具体的なメッセージを表示する
- 適切なアイコンとボタンを選択する
- 入力値の検証を必ず行う
- ユーザーに優しい既定値を提供する
- エラー処理を忘れずに実装する
これらの関数をマスターすることで、ユーザーとのインタラクションが豊かで使いやすい VBA マクロを作成できます。