VBAで、ユーザーフォームの呼び出し、リストボックスに配列を代入し、ユーザーが選択した値を取得する簡単な事例の備忘録。
なお、個人的な考えとして、VBAの引継や属人化防止を考慮し、Excelであれば設定情報をシートに記載するなどで、可能な限りユーザーフォームの利用は避けています。確認はMsgBox 関数、テキスト入力であればInputBox 関数で実施します。
Wordの場合、簡易なユーザーフォームがないと操作性が悪い時があるので、リストボックスを利用した必要最小限のサンプルです。Wordの事例ですが、ExcelのVBAでも基本は同じです。
内容:
VBAサンプルの概要
実施する処理内容は次のとおりです。
- 一次元配列の値をユーザーフォームのリストボックスに表示する。
- ユーザーはリストボックスから回答を選択、値は変数に格納する。
- 格納された変数で処理をする(今回は、MsgBox 関数で表示するだけ)。
ユーザーフォームの設定の流れ
設定の基本
ユーザーフォームの設定の基本は次のとおりです。
- ユーザーフォームの作成は、Visual Basic Editorのメニューにある「挿入」-「ユーザーフォーム」で実行する。
- 「表示」メニューにある「ツールボックス」を表示し、「リストボックス」、「コマンドボタン」、「ラベル」などを配置する。
- ユーザーフォームのコードを記載する。
(フォームを右クリックして「コードの表示」、コードの記載) - 作成したフォームを標準モジュール等から呼び出す。
(2. の詳細)リストボックス、コマンドボタンの配置後、確認しておくこと
「リストボックス」、「コマンドボタン」を配置したらオブジェクト名を確認する(コードで使用する)。
配置したコントロールをクリックすると、オブジェクト名を確認できる(必要に応じて、分かりやすい名前に修正する)。
(3. の詳細)ユーザーフォームのコード事例
UserFormのコード内容は次のとおり。
Private Sub UserForm_Initialize() ListBox1.List = リスト '「リスト」は標準モジュール側で作成した配列' End Sub Private Sub OKButton_Click() If ListBox1.ListIndex = -1 Then Exit Sub 回答結果 = ListBox1.Value Unload Me End Sub Private Sub CancelButton_Click() MsgBox "実行を停止します" End End Sub
(4. の詳細)標準モジュールからの呼び出し事例
Module1のコードのサンプルは次のとおり。
'標準モジュールとフォームで利用する変数はグローバル変数を設定' Public リスト() As Variant Public 回答結果 As String Sub フォームでリストボックスの利用例() リスト = Array("選択肢1", "選択肢2", "選択肢3", "選択肢4", "選択肢5") UserForm1.Show MsgBox 回答結果 & " が回答されました" End Subほ
補足説明
- 標準モジュールとフォームで利用する変数(リスト、回答結果)は、データ受け渡しをグローバル変数で実施しています。
- UserFormに記載しているコードで、「ListBox1」はリストボックスのオブジェクト名、「OKButton_Click」、「CancelButton_Click」の”赤字部分”はコマンドボタンのオブジェクト名です。
実際のオブジェクト名にあわせて修正が必要です。 - 「OKButton」のクリック時、選択肢が選択されていない場合はExit Subでフォームに戻り、選択肢が選択されている場合は「回答結果」に値を代入し、Unload Meでフォームを閉じて呼び出した標準モジュールに戻ります。
- フォームのタイトルや、コマンドボタンの表示名は、各コントロールをクリックし、Captionで変更します。
- ラベルのフォントの大きさ等の詳細は、Fontをクリックして表示される「...」をクリックすると、設定画面が表示されて変更可能です。
UserForm_Initializeを記載しない方法
上記の事例は、UserForm_Initializeを記載したが、''呼び出し時に、次のようにUserFormのListBox1の初期設定を実施し、Initializeを記載しない方法も可能です。
一つのユーザーフォームに対して、標準モジュール側で初期設定して流用したい場面などで便利です。
Sub フォームでリストボックスの利用例()
リスト = Array("選択肢1", "選択肢2", "選択肢3", "選択肢4", "選択肢5")
UserForm1.ListBox1.List = リスト
UserForm1.Show
MsgBox 回答結果 & " が回答されました"
End Sub
以上、VBAでユーザーフォームの呼び出し、リストボックスに配列を代入し、ユーザーが選択した値を取得する簡単な事例でした。