Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ メッセージボックスと入力ボックス | ユーザーインタラクション
ビジネス自動化のためのExcel VBA

メッセージボックスと入力ボックス

メニューを表示するにはスワイプしてください

完全なフォームを作成する前に、VBAがユーザーと対話する最も簡単な2つの方法を習得する価値があります。MsgBoxは情報を表示し、必要に応じて質問を行い、InputBoxは短いテキストの入力を求めます。

MsgBox

最も基本的な形では、MsgBoxはメッセージを表示し、ユーザーがOKをクリックするのを待ちます:

MsgBox "Customer saved successfully."

このように使用すると(ステートメントとして、かっこなしで結果を受け取らない場合)、MsgBoxは単なる終端処理です。メッセージを表示し、ユーザーの操作に関係なくコードは進行します。どのボタンがクリックされたかを知る必要がある場合、MsgBoxはステートメントではなく関数となり、かっこと結果を格納する変数が必要になります:

result = MsgBox("Delete customer Urban Retail?", _
    vbYesNo + vbQuestion, "Confirm Delete")
図 5.1

vbYesNovbQuestion は単純な + で加算されます。これは最初は違和感がありますが、VBAでは2つの独立した設定(表示するボタンとアイコン)をMsgBoxが期待する2番目の引数として1つにまとめる方法です。resultにはVBAの組み込み定数 vbYes または vbNo のいずれかが返されます。これらは実際には数値(6と7)ですが、リテラル値を書くことはありません。回答に応じて処理を分岐するには、単純なIf文を使用します:

If result = vbYes Then
    ' proceed with deletion
End If

InputBox

MsgBoxが常に決まったボタン定数のみを返すのに対し、InputBoxはユーザーに何かを入力させ、その入力内容をそのまま返す:

city = InputBox("Enter a City to search for:", _
    "Search Customers", "Chicago")
図 5.2

3番目の引数(ここでは"Chicago")はテキストボックスに初期値を設定するもので、ユーザーがそのまま受け入れるか上書きするかを選べるため、推奨される回答を示すのに便利。最初に間違えやすい点が2つある:ユーザーが入力した内容は見た目に関わらず必ず文字列(String)として返されるため、25と入力しても数値25ではなく文字列"25"が返る。計算に使う場合はCIntCDblで型変換が必要。また、Cancelをクリックしてもエラーが発生したりコードが停止したりせず、空文字列"")が返るだけなので、空の回答が無効な場合はコード側で明示的にチェックする必要がある。

ユーザープロンプトと確認

この2つを組み合わせるのが、ユーザー入力を受け取った後にリスクのある処理を実行する前に確認を取る標準的なパターン:

Dim searchCity As String
Dim confirmMsg As VbMsgBoxResult
 
searchCity = InputBox("Enter a City to search for:", "Search Customers")
 
If searchCity = "" Then
    MsgBox "Search cancelled — no city entered."
    Exit Sub
End If

confirmMsg = MsgBox("Search for customers in " & searchCity & "?", vbYesNo)
If confirmMsg = vbNo Then Exit Sub
 
' ... proceed with the search

confirmMsgAs VbMsgBoxResultとして宣言されている点に注目。これはMsgBoxの戻り値としてVBAが実際に使う型であり、明示的に宣言することで(Variantのままにせず)VBEがvbYesvbNoなどの入力補完を提供する。InputBoxの後の空文字列チェックとMsgBoxの後のvbNoチェックはどちらも同じエスケープパターンExit Subを使っており、これは有効な入力が存在する前提で進むコードに処理が流れ込むのを防ぐため、手続きを即座に終了させる。

課題

  1. Sub を使って顧客IDを入力させ、その後 MsgBox で「顧客 [ID] を削除しますか?」と Yes/No ボタンと質問アイコン付きで確認する InputBox を作成。
  2. 空文字(InputBox でキャンセルが押された場合)と vbNo(確認で拒否された場合)の両方を処理し、どちらも何も起きなかったことを説明するメッセージを表示して早期に Sub を終了。
  3. 両方のチェックを通過した場合のみ、「ここで顧客が削除されます。」という最終的な MsgBox を表示。
ヒント
expand arrow

1. 顧客IDの取得と確認メッセージの作成

  • InputBox にはプロンプトが必要で、タイトルを第2引数として指定可能。戻り値は String 変数に格納。
  • 確認メッセージには実際のIDを & で連結して挿入すること。固定文字列 "[ID]" のままだと常にそのまま表示されてしまう。
  • MsgBox を関数として使う場合(結果を取得する場合)は括弧が必要。vbYesNovbQuestion+ で組み合わせる。

2. キャンセルとNoの処理

  • InputBox の直後に空文字かどうかをチェック。IDがなければ「顧客を削除しますか?」と聞く意味がない。
  • Exit Sub はその場でプロシージャを即終了させる。各 If ブロック内で、直前に「何も起きませんでした」と説明する MsgBox を表示。
  • vbNo のチェックは確認用 MsgBox の後、取得した結果を vbNo 定数と比較。

3. 最終確認

  • この行は、ここまで到達した場合のみ実行される。前の2つのチェックで失敗時は Exit Sub しているため、この MsgBox を両方の後に置くだけで、両方通過した場合のみ表示されることが保証される。
解答例
expand arrow
Option Explicit

Sub DeleteCustomerPrompt()
    Dim customerID As String
    Dim confirmResult As VbMsgBoxResult

    ' Step 1 — ask for the Customer ID
    customerID = InputBox("Enter the Customer ID to delete:", "Delete Customer")

    ' Step 2a — handle Cancel / empty input
    If customerID = "" Then
        MsgBox "Cancelled — no Customer ID was entered. Nothing happened."
        Exit Sub
    End If

    ' Step 1 (continued) — confirm with Yes/No
    confirmResult = MsgBox("Delete customer " & customerID & "?", _
        vbYesNo + vbQuestion, "Confirm Delete")

    ' Step 2b — handle No
    If confirmResult = vbNo Then
        MsgBox "Cancelled — deletion was not confirmed. Nothing happened."
        Exit Sub
    End If

    ' Step 3 — both checks passed
    MsgBox "Customer would be deleted here."
End Sub

実行(F5)して、3つのパターンすべてを試す:InputBox でキャンセル、確認でNo、IDを入力してYes。それぞれ異なる3つのメッセージが表示されることを確認。

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 5.  1

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 5.  1
some-alt