リストボックスの利用

複数の項目を並べて表示しユーザーに選択してもらうのに使用するリストボックスの利用方法について解説します。

(2022 年 06 月 17 日公開 / 2022 年 06 月 17 日更新)

リストボックスを作成する

リストボックスを作成する方法を見ていきます。リストボックスを作成するにはツールボックス上で下記のアイコンをクリックします。

リストボックスを作成する(1)

アイコンをクリックした後でフォーム上でマウスをドラッグしてリストボックスを作成します。

リストボックスを作成する(2)

リストボックスを作成する(3)

オブジェクト名の設定

VBAから操作するにあたってリストボックスのオブジェクト名を設定しておきます。リストボックスのプロパティウィンドウを見てください。

リストボックスを作成する(4)

オブジェクト名はプロパティウィンドウ上で直接編集が出来ます。今回はオブジェクト名を「listFoods」に変更します。

リストボックスを作成する(5)

リストボックスに項目を追加する

リストボックスに表示する項目を追加する方法を確認します。項目を追加するには「AddItem」メソッドを使います。

Variant = object.AddItem [ item [, varIndex]]

リストに項目を追加します。 object には設定するオブジェクトを指定します。 1 番目の引数の item には追加する項目または行を指定します。1 目の項目または行には 0 を、2 番目の項目または行には 1 を指定します。 2 番目の引数の varIndex には新しい項目または行を挿入するオブジェクトの位置を示す整数値を指定します。

リストに追加したい項目及び必要であれば項目の位置を表すインデックスを指定して項目を追加します。位置を指定しない場合は末尾に追加されます。

実際の使い方としては次のようになります。

sampleForm.listFoods.AddItem "項目"

サンプルプログラム

では簡単なサンプルで試してみましょう。

Sub テスト()
    Load sampleForm
    sampleForm.listFoods.AddItem "りんご"
    sampleForm.listFoods.AddItem "オレンジ"
    sampleForm.listFoods.AddItem "メロン"
    sampleForm.Show
End Sub

上記マクロを実行すると次のように表示されます。

リストボックスに項目を追加する(1)

リストボックスで選択された項目を取得する

リストボックスで選択された項目を取得する方法を確認します。まず選択された項目のインデックス番号を取得します。インデックス番号を取得するには「ListIndex」プロパティを使います。

Index = object.ListIndex

現在選択されている項目を返します。値を設定することで選択する項目を指定することも出来ます。 object には設定するオブジェクトを指定します。

項目のインデックス番号は一番上の項目が「0」です。選択されていない場合には「-1」が返ります。

次に指定したインデックス番号の項目を取得します。項目を取得するには「List」プロパティを使います。

object.List( row, column )

指定した行と列のリストの項目を返します。 object 設定するオブジェクトを指定します。 1 番目の引数の row には 0 以上で、リストの項目数から 1 を引いた数以下の整数値を指定します。 2 番目の引数の column には 0 以上で、列の数から 1 を引いた数以下の整数値を指定します。

行と列を指定して項目を取得します、列があるのはリストボックスでは複数列の表示も可能な為です。行及び列の値は先頭が「0」から開始されます。

実際の使い方としては次のようになります。

Dim index As Integer

index = sampleForm.listFoods.ListIndex
If index = -1 Then
    MsgBox "選択されていません"
Else
    MsgBox sampleForm.listFoods.List(index)
End If

サンプルプログラム

では簡単なサンプルで試してみましょう。ボタン(オブジェクト名はgetButton)を1つ追加してClickイベント処理を記述します。

Private Sub getButton_Click()
    Dim index As Integer
    
    index = sampleForm.listFoods.ListIndex
    If index = -1 Then
        MsgBox "選択されていません"
    Else
        MsgBox sampleForm.listFoods.List(index)
    End If
End Sub

また呼びだすマクロは次の通りです。

Sub テスト()
    Load sampleForm
    sampleForm.listFoods.AddItem "りんご"
    sampleForm.listFoods.AddItem "オレンジ"
    sampleForm.listFoods.AddItem "メロン"
    sampleForm.Show
End Sub

上記マクロを実行すると次のように表示されます。

リストボックスで選択された項目を取得する(1)

項目を選択しない状態で「値の取得」ボタンをクリックすると次のように表示されます。

リストボックスで選択された項目を取得する(2)

項目を選択して「値の取得」ボタンをクリックすると次のように表示されます。

リストボックスで選択された項目を取得する(3)

リストボックスの項目を削除する

リストボックスで指定した項目を削除する方法を確認します。項目を削除するには「RemoveItem」メソッドを使います。

Boolean = object.RemoveItem index

リストから行を削除します。 object には設定するオブジェクトを指定します。引数の index には削除する行を表す数値を指定します。

削除したい項目のインデックス番号を指定します。

実際の使い方としては次のようになります。

Dim index As Integer

index = sampleForm.listFoods.ListIndex
If index = -1 Then
    MsgBox "選択されていません"
Else
    sampleForm.listFoods.RemoveItem index
End If

また全ての項目を削除する場合には「Clear」メソッドを利用できます。

object.Clear

すべてのオブジェクトを削除します。 object には設定するオブジェクトを指定します。

サンプルプログラム

では簡単なサンプルで試してみましょう。ボタン(オブジェクト名はdeleteButton)を1つ追加してClickイベント処理を記述します。

Private Sub deleteButton_Click()
    Dim index As Integer
    
    index = sampleForm.listFoods.ListIndex
    If index = -1 Then
        MsgBox "選択されていません"
    Else
        sampleForm.listFoods.RemoveItem index
    End If
End Sub

また呼びだすマクロは次の通りです。

Sub テスト()
    Load sampleForm
    sampleForm.listFoods.AddItem "りんご"
    sampleForm.listFoods.AddItem "オレンジ"
    sampleForm.listFoods.AddItem "メロン"
    sampleForm.Show
End Sub

上記マクロを実行すると次のように表示されます。項目を1つ選択して「項目の削除」ボタンをクリックします。

リストボックスの項目を削除する(1)

すると次のように項目が削除されます。

リストボックスの項目を削除する(2)

リストボックスで複数の項目を選択できるようにする

リストボックスで複数の項目を選択できるようにする方法を確認します。選択方式を設定するには「MultiSelect」プロパティを使います。

object.MultiSelect [= fmMultiSelect]

オブジェクトに複数選択を許可するかどうかを設定します。 object には設定するオブジェクトを指定します。設定する値の fmMultiSelect にはコントロールの選択モードを指定します。

設定できる値は以下の通りです。

定数選択方式
fmMultiSelectSingle0項目は 1 つだけ選択できます
fmMultiSelectMult1複数選択を許可します。項目の選択/選択解除を行うには、Space キーを押すか、またはクリックします
fmMultiSelectExtended2複数選択を許可します。Shift キーを押しながらクリックするか、または Shift キーを押しながら方向キーを押すと、現在選択されている項目を始点として一連の項目を連続的に選択できます。項目の選択/選択解除を個別に行うには、Ctrl キーを押しながらクリックします。

デフォルトの値は「fmMultiSelectSingle」となっています。複数項目を選択する一般的な方式は「fmMultiSelectExtended」の方法です。

実際の使い方としては次のようになります。

Sub テスト()
    Load sampleForm
    sampleForm.listFoods.MultiSelect = fmMultiSelectExtended
    sampleForm.Show
End Sub

サンプルプログラム

では簡単なサンプルで試してみましょう。

Sub テスト()
    Load sampleForm
    sampleForm.listFoods.AddItem "りんご"
    sampleForm.listFoods.AddItem "オレンジ"
    sampleForm.listFoods.AddItem "メロン"
    sampleForm.listFoods.MultiSelect = fmMultiSelectExtended
    sampleForm.Show
End Sub

上記マクロを実行すると次のように表示されます。項目を1つ選択して下さい。

リストボックスで複数の項目を選択できるようにする(1)

「Ctrl」キーを押しながら別の項目をクリックします。すると複数の項目が同時に選択できます。

リストボックスで複数の項目を選択できるようにする(2)

複数選択許可の時に選択された項目を取得する

リストボックスが複数の項目を選択できる設定になっている時に、選択されている項目を取得する方法を確認します。選択されている項目を調べるには「Selected」プロパティを使います。

object.Selected( index ) [= Boolean]

各項目の選択状況を設定します。 object には設定するオブジェクトを指定します。引数の index には 0 以上で、リスト内の項目数から 1 を引いた数以下の範囲の整数値を指定します。設定する値の Boolean には項目が選択されているかどうかを示します。

指定したインデックス番号の項目について、選択されているかどうかを取得したり、選択状態に設定したりします。

リストに含まれる項目全てについて順に調べていきます。リストに含まれる項目数は「ListCount」プロパティで取得できます。

object.ListCount

コントロールのリストの項目数を返します。 object には設定するオブジェクトを指定します。

実際の使い方としては次のようになります。

Private Sub getButton_Click()
    Dim i As Integer
    Dim val As String
    
    val = ""
    
    For i = 0 To listFoods.ListCount - 1
        If listFoods.Selected(i) = True Then
            val = val & listFoods.List(i) & " "
        End If
    Next i
    
    dispLabel.Caption = val
End Sub

サンプルプログラム

では簡単なサンプルで試してみましょう。ボタン(オブジェクト名はgetButton)とラベル(オブジェクト名はdispLabel)を追加し、ボタンに対するClickイベント処理を記述します。

Private Sub getButton_Click()
    Dim i As Integer
    Dim val As String
    
    val = ""
    
    For i = 0 To listFoods.ListCount - 1
        If listFoods.Selected(i) = True Then
            val = val & listFoods.List(i) & " "
        End If
    Next i
    
    dispLabel.Caption = val
End Sub

また呼びだすマクロは次の通りです。

Sub テスト()
    Load sampleForm
    sampleForm.listFoods.AddItem "りんご"
    sampleForm.listFoods.AddItem "オレンジ"
    sampleForm.listFoods.AddItem "メロン"
    sampleForm.listFoods.MultiSelect = fmMultiSelectExtended
    sampleForm.Show
End Sub

上記マクロを実行すると次のように表示されます。

複数選択許可の時に選択された項目を取得する(1)

「Ctrl」キーを押しながら2つも項目をクリックして選択状態にします。

複数選択許可の時に選択された項目を取得する(2)

「値の取得」ボタンをクリックすると現在選択されている項目を取得してラベルに表示します。

複数選択許可の時に選択された項目を取得する(3)

複数列のリストボックスを作成する

列が複数あるリストボックスを作成する方法を確認します。表示したい値の配列を作成し、その配列を「List」プロパティを使って設定します。具体的な記述は次のようになります。

Sub テスト()
    Dim foodsArray(2, 2)
    
    foodsArray(0, 0) = "りんご"
    foodsArray(0, 1) = "100円"
    foodsArray(1, 0) = "オレンジ"
    foodsArray(1, 1) = "80円"
    
    Load sampleForm
    sampleForm.listFoods.ColumnCount = 2
    sampleForm.listFoods.List() = foodsArray
    sampleForm.Show
End Sub

リストボックスに何列表示するかについて「ColumnCount」プロパティを使って指定しています。

object.ColumnCount [= Long]

表示する列の数を設定します。 object には設定するオブジェクトを指定します。設定する値の Long には表示する列の数を指定します。

作成した後で各項目の値を変更するには同じく「List」プロパティを使います。

object.List( row, column ) [= Variant]

指定した行と列のリストの項目を返します。 object には設定するオブジェクトを指定します。 1 番目の引数である row には 0 以上で、リストの項目数から 1 を引いた数以下の整数値を指定します。 2 番目の引数である column には 0 以上で、列の数から 1 を引いた数以下の整数値を指定します。設定する値の Variant には項目の内容を指定します。

「List」プロパティは値を取得する時にも利用しましたが、設定したい行及び列を引数に指定して値を指定します。

具体的には次のように記述します。

Sub テスト()
    Dim foodsArray(2, 2)
    
    foodsArray(0, 0) = "りんご"
    foodsArray(0, 1) = "100円"
    foodsArray(1, 0) = "オレンジ"
    foodsArray(1, 1) = "80円"
    
    Load sampleForm
    sampleForm.listFoods.ColumnCount = 2
    sampleForm.listFoods.List() = foodsArray
    sampleForm.listFoods.List(0, 0) = "メロン"
    sampleForm.Show
End Sub

最初に配列を指定せずに「List」プロパティを使って各項目を指定しても出来るかと思いましたが、その場合何故かエラーとなります。

サンプルプログラム

では簡単なサンプルで試してみましょう。

Sub テスト()
    Dim foodsArray(2, 2)
    
    foodsArray(0, 0) = "りんご"
    foodsArray(0, 1) = "100円"
    foodsArray(1, 0) = "オレンジ"
    foodsArray(1, 1) = "80円"
    
    Load sampleForm
    sampleForm.listFoods.ColumnCount = 2
    sampleForm.listFoods.List() = foodsArray
    sampleForm.listFoods.List(0, 0) = "メロン"
    sampleForm.Show
End Sub

上記マクロを実行すると次のように表示されます。

複数列のリストボックスを作成する(1)

各列の幅の設定

複数の列を利用する場合に列毎の幅を設定するには「ColumnWidths」プロパティを使います。

object.ColumnWidths [= String]

各列の幅を設定します。 object には設定するオブジェクトを指定します。設定する値の String には列の幅をポイント単位で指定します。空白にするか、-1 を指定したときには列幅が算出されます。幅が 0 に設定された列は表示されません。ポイント以外の単位で指定する場合は、単位を明示してください。

複数の列の幅を同時に指定するときは、セミコロン (;) を区切り記号に使います。使用例としては次のようになります。

Sub テスト()
    Dim foodsArray(2, 2)
    
    foodsArray(0, 0) = "りんご"
    foodsArray(0, 1) = "100円"
    foodsArray(1, 0) = "オレンジ"
    foodsArray(1, 1) = "80円"
    
    Load sampleForm
    sampleForm.listFoods.ColumnCount = 2
    sampleForm.listFoods.List() = foodsArray
    sampleForm.listFoods.ColumnWidths  = "90;72;90"
    sampleForm.Show
End Sub

この場合、1 列目は 90 ポイント (1.25 インチ)、2 列目は 72 ポイント (1 インチ)、3 列目は 90 ポイントに設定されます。

列幅の指定をすべて省略すると、各列の幅は、コントロール自体の幅を均等割りした値となります。指定した列幅の合計がコントロール自体の幅より大きいと、リストは左端揃えで表示され、コントロールの表示領域の中に収まりきれない右端の列は表示されません。

リストボックスの表示データにシートのセル範囲を指定する

Excelのシートに入力された値を元にリストボックスを作成することができます。リストのデータとしてシートの値を指定するには「RowSource」プロパティを使用します。

object.RowSource [= String]

リストのソースを設定します。 object には設定するオブジェクトを指定します。設定する値の String にはリストのソースを指定します。

ワークシートのセル範囲を指定できます。例えば「ListSheet」シートにあるセル範囲B2:C5のデータをリストとして表示するには次のように記述します。

Sub テスト()
    Load sampleForm
    sampleForm.listFoods.ColumnCount = 2
    sampleForm.listFoods.RowSource = "ListSheet!B2:C5"
    sampleForm.Show
End Sub

サンプルプログラム

では簡単なサンプルで試してみましょう。

Sub テスト()
    Load sampleForm
    sampleForm.listFoods.ColumnCount = 2
    sampleForm.listFoods.RowSource = "ListSheet!B2:C5"
    sampleForm.Show
End Sub

上記マクロを実行すると次のように表示されます。

リストボックスの表示データにシートのセル範囲を指定する(1)

リストデータの元になっているシートは次のように値が入力されています。

リストボックスの表示データにシートのセル範囲を指定する(2)

-- --

複数の項目を並べて表示しユーザーに選択してもらうのに使用するリストボックスの利用方法について解説しました。

( Written by Tatsuo Ikura )

広告
Profile
profile_img

著者 / TATSUO IKURA

初心者~中級者の方を対象としたプログラミング方法や開発環境の構築の解説を行うサイトの運営を行っています。