shikumika’s diary

日々の事務作業で手間なことを簡単にできる仕組み(自動化、方法など)、困ったことの解決方法を調べた備忘録

【Word VBA】ユーザーフォームの呼び出し、リストボックスの利用サンプル

VBAで、ユーザーフォームの呼び出し、リストボックスに配列を代入し、ユーザーが選択した値を取得する簡単な事例の備忘録。

なお、個人的な考えとして、VBAの引継や属人化防止を考慮し、Excelであれば設定情報をシートに記載するなどで、可能な限りユーザーフォームの利用は避けています。確認はMsgBox 関数、テキスト入力であればInputBox 関数で実施します。

Wordの場合、簡易なユーザーフォームがないと操作性が悪い時があるので、リストボックスを利用した必要最小限のサンプルです。Wordの事例ですが、ExcelのVBAでも基本は同じです。

内容:

VBAサンプルの概要

実施する処理内容は次のとおりです。

  1. 一次元配列の値をユーザーフォームのリストボックスに表示する。
  2. ユーザーはリストボックスから回答を選択、値は変数に格納する。
  3. 格納された変数で処理をする(今回は、MsgBox 関数で表示するだけ)。

リストボックス、コマンドボタン、ラベルを配置している

ユーザーフォームのアウトプット

ユーザーフォームの設定の流れ

設定の基本

ユーザーフォームの設定の基本は次のとおりです。

  1. ユーザーフォームの作成は、Visual Basic Editorのメニューにある「挿入」-「ユーザーフォーム」で実行する。
  2. 「表示」メニューにある「ツールボックス」を表示し、「リストボックス」、「コマンドボタン」、「ラベル」などを配置する。
  3. ユーザーフォームのコードを記載する。
    (フォームを右クリックして「コードの表示」、コードの記載)
  4. 作成したフォームを標準モジュール等から呼び出す。
(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で変更します。

    各コントロールのCaptionで名前を変更

    タイトルの修正例
  • ラベルのフォントの大きさ等の詳細は、Fontをクリックして表示される「...」をクリックすると、設定画面が表示されて変更可能です。

    Fontをクリックして表示される「...」をクリック

    ラベルのフォントの大きさを変更する設定画面の表示方法

UserForm_Initializeを記載しない方法

上記の事例は、UserForm_Initializeを記載したが、''呼び出し時に、次のようにUserFormのListBox1の初期設定を実施し、Initializeを記載しない方法も可能です。

一つのユーザーフォームに対して、標準モジュール側で初期設定して流用したい場面などで便利です。

Sub フォームでリストボックスの利用例()
    リスト = Array("選択肢1", "選択肢2", "選択肢3", "選択肢4", "選択肢5")
    UserForm1.ListBox1.List = リスト
    UserForm1.Show
    MsgBox 回答結果 & " が回答されました"
End Sub

 

以上、VBAでユーザーフォームの呼び出し、リストボックスに配列を代入し、ユーザーが選択した値を取得する簡単な事例でした。