メッセージボックスと入力ボックス
メニューを表示するにはスワイプしてください
完全なフォームを作成する前に、VBAがユーザーと対話する最も簡単な2つの方法を習得する価値があります。MsgBoxは情報を表示し、必要に応じて質問を行い、InputBoxは短いテキストの入力を求めます。
MsgBox
最も基本的な形では、MsgBoxはメッセージを表示し、ユーザーがOKをクリックするのを待ちます:
MsgBox "Customer saved successfully."
このように使用すると(ステートメントとして、かっこなしで結果を受け取らない場合)、MsgBoxは単なる終端処理です。メッセージを表示し、ユーザーの操作に関係なくコードは進行します。どのボタンがクリックされたかを知る必要がある場合、MsgBoxはステートメントではなく関数となり、かっこと結果を格納する変数が必要になります:
result = MsgBox("Delete customer Urban Retail?", _
vbYesNo + vbQuestion, "Confirm Delete")
vbYesNo と vbQuestion は単純な + で加算されます。これは最初は違和感がありますが、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")
3番目の引数(ここでは"Chicago")はテキストボックスに初期値を設定するもので、ユーザーがそのまま受け入れるか上書きするかを選べるため、推奨される回答を示すのに便利。最初に間違えやすい点が2つある:ユーザーが入力した内容は見た目に関わらず必ず文字列(String)として返されるため、25と入力しても数値25ではなく文字列"25"が返る。計算に使う場合はCIntやCDblで型変換が必要。また、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
confirmMsgはAs VbMsgBoxResultとして宣言されている点に注目。これはMsgBoxの戻り値としてVBAが実際に使う型であり、明示的に宣言することで(Variantのままにせず)VBEがvbYesやvbNoなどの入力補完を提供する。InputBoxの後の空文字列チェックとMsgBoxの後のvbNoチェックはどちらも同じエスケープパターンExit Subを使っており、これは有効な入力が存在する前提で進むコードに処理が流れ込むのを防ぐため、手続きを即座に終了させる。
課題
Subを使って顧客IDを入力させ、その後 MsgBox で「顧客 [ID] を削除しますか?」と Yes/No ボタンと質問アイコン付きで確認するInputBoxを作成。- 空文字(InputBox でキャンセルが押された場合)と
vbNo(確認で拒否された場合)の両方を処理し、どちらも何も起きなかったことを説明するメッセージを表示して早期に Sub を終了。 - 両方のチェックを通過した場合のみ、「ここで顧客が削除されます。」という最終的な MsgBox を表示。
1. 顧客IDの取得と確認メッセージの作成
InputBoxにはプロンプトが必要で、タイトルを第2引数として指定可能。戻り値はString変数に格納。- 確認メッセージには実際のIDを
&で連結して挿入すること。固定文字列 "[ID]" のままだと常にそのまま表示されてしまう。 MsgBoxを関数として使う場合(結果を取得する場合)は括弧が必要。vbYesNoとvbQuestionは+で組み合わせる。
2. キャンセルとNoの処理
InputBoxの直後に空文字かどうかをチェック。IDがなければ「顧客を削除しますか?」と聞く意味がない。Exit Subはその場でプロシージャを即終了させる。各Ifブロック内で、直前に「何も起きませんでした」と説明するMsgBoxを表示。vbNoのチェックは確認用MsgBoxの後、取得した結果をvbNo定数と比較。
3. 最終確認
- この行は、ここまで到達した場合のみ実行される。前の2つのチェックで失敗時は
Exit Subしているため、このMsgBoxを両方の後に置くだけで、両方通過した場合のみ表示されることが保証される。
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つのメッセージが表示されることを確認。
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください