VBAを使ったリストボックスの作成と項目の追加および削除

Excel のユーザーフォーム上でリストボックス(ListBox)コントロールを設置したあと、 VBA を使ってリストボックスに項目を追加してり削除したりすることができます。ここでは Excel の VBA を使ったリストボックスの作成と項目の追加および削除の方法について解説します。

※ リストボックスで選択されている項目を取得する方法については「VBAを使ってリストボックスで選択された項目を取得する」を参照されてください。

(Last modified: )

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

リストボックスに項目を追加するには AddItem メソッドを使用します。

オブジェクト.AddItem [ item [, varIndex ]]

リストボックスに追加する項目に表示する値を 1 番目の引数に指定します。 2 番目の引数に位置を指定すれば項目がその位置に挿入されます。 2 番目の引数を省略した場合はリストボックスの最後に項目が追加されます。位置を指定する場合、 0 を指定すればリストボックスの先頭、 1 を指定すれば 1 番目と 2 番目の項目の間に挿入されます。

具体的には次のように記述します。下記ではユーザーフォームが表示される前に発生する Initialize イベントに対するイベントプロシージャにコードを記述し、リストボックスに項目を追加しています。

Option Explicit

Private Sub UserForm_Initialize()
    ListBox1.AddItem "キャベツ"
    ListBox1.AddItem "玉ねぎ"
    ListBox1.AddItem "人参", 1
End Sub

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

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

ユーザーフォームを表示すると、表示されたリストボックスに項目が追加されているのか確認できます。最初の 2 つの項目については位置を指定していないのでリストボックスの最後に追加され、 3 つ目の項目については位置を指定しているので指定の位置に挿入されています。

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

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

リストボックスは 1 列だけでなく複数の列を持つことができます。リストボックスで何列表示するのかを設定するには ColumnCount プロパティに値を設定します。

オブジェクト.ColumnCount [= Long ]

リストボックスで表示する列数を代入してください。例えば 2 列のリストボックスを作成する場合は 2 を代入します。

リストボックスでは項目を追加するときに AddItem メソッドを使用しますが、 AddItem メソッドでは 1 列目の値しか指定できません。 2 列目以降の値を指定するには List プロパティを使用します。

オブジェクト.List(row, column) [= Variant ]

1 番目の引数( row )に行数、 2 番目の引数( column )に列数を指定し、該当する項目の値に指定した値を設定します。

新しい値を設定する時だけでなく、既に設定されている値に別の値を設定する場合も同じように設定することができます。

注意点として List プロパティを使って値を設定する場合、対象の項目が既に追加されている必要があります。そこでまず AddItem メソッドを使って項目を追加したあと、 2 列目以降の値について List プロパティを使って設定する形になります。

具体的には次のように記述します。下記ではユーザーフォームが表示される前に発生する Initialize イベントに対するイベントプロシージャにコードを記述し、リストボックスに項目を追加したあとで項目の別の列の値を設定しています。

Option Explicit

Private Sub UserForm_Initialize()
    ListBox1.ColumnCount = 2

    ListBox1.AddItem "キャベツ"
    ListBox1.List(0, 1) = "100円"
    ListBox1.AddItem "玉ねぎ"
    ListBox1.List(1, 1) = "80円"
    ListBox1.AddItem "人参"
    ListBox1.List(2, 1) = "120円"
End Sub

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

複数列のリストボックスを作成する(ColumnCount,List)(2)

ユーザーフォームを表示すると、リストボックスが 2 列表示されるように変更され、 3 つの項目に対してそれぞれ値が設定されます。

複数列のリストボックスを作成する(ColumnCount,List)(3)

配列を使って複数列の項目をまとめて追加する

複数列のリストボックスを作成する場合、リストボックスに追加する値の配列をあらかじめ作成しておき、まとめてリストボックスに設定することもできます。先ほどと同じ List プロパティを使用しますが、行数と列数は省略して配列を代入します。この方法の場合は先に AddItem で項目を追加しておく必要はありません。

具体的には次のように記述します。下記ではユーザーフォームが表示される前に発生する Initialize イベントに対するイベントプロシージャにコードを記述し、配列に設定しておいた値をリストボックスにまとめて追加しています。

Option Explicit

Private Sub UserForm_Initialize()
    Dim foodsArray(2, 1)
    
    foodsArray(0, 0) = "キャベツ"
    foodsArray(0, 1) = "100円"
    foodsArray(1, 0) = "玉ねぎ"
    foodsArray(1, 1) = "80円"
    foodsArray(2, 0) = "人参"
    foodsArray(2, 1) = "120円"

    ListBox1.ColumnCount = 2
    ListBox1.List() = foodsArray
End Sub

配列を使って複数列の項目をまとめて追加する(1)

配列を使って複数列の項目をまとめて追加する(2)

ユーザーフォームを表示すると、表示されたリストボックスに項目が追加されているのか確認できます。

配列を使って複数列の項目をまとめて追加する(3)

リストボックスの列毎の幅を設定する(ColumnWidths)

リストボックスに複数の列を表示するように設定している場合に、列毎の幅を設定するには ColumnWidths プロパティに値を設定します。

オブジェクト.ColumnWidths [= String ]

列毎の幅をセミコロンで区切って記述した文字列を代入します。単位はポイントです。例えば 3 列の幅を指定する場合は "10;20;15" のような値を代入します。幅に 0 を指定した列は表示されなくなります。

具体的には次のように記述します。下記ではユーザーフォームが表示される前に発生する Initialize イベントに対するイベントプロシージャにコードを記述し、リストボックスの列毎の幅を設定しています。

Option Explicit

Private Sub UserForm_Initialize()
    Dim foodsArray(2, 3)
    
    foodsArray(0, 0) = 1
    foodsArray(0, 1) = "キャベツ"
    foodsArray(0, 2) = "100円"
    foodsArray(1, 0) = 2
    foodsArray(1, 1) = "玉ねぎ"
    foodsArray(1, 2) = "80円"

    ListBox1.ColumnCount = 3
    ListBox1.List() = foodsArray
    ListBox1.ColumnWidths = "20;50;30"
End Sub

リストボックスの列毎の幅を設定する(ColumnWidths)(1)

リストボックスの列毎の幅を設定する(ColumnWidths)(2)

ユーザーフォームを表示すると、3 列のリストボックスが表示され、各列の幅が指定した長さに設定されているのが確認できます。

リストボックスの列毎の幅を設定する(ColumnWidths)(3)

もし今回のサンプルで各列の幅を指定していなかった場合は次のように表示されます。各列に同じ長さのデフォルトの幅が設定され、リストボックスに入りきらなかった場合は自動的に水平スクロールバーが表示されるようです。

リストボックスの列毎の幅を設定する(ColumnWidths)(4)

リストボックスの項目数を取得する(ListCount)

リストボックスに追加されている項目数を取得するには ListCount プロパティを使用します。

オブジェクト.ListCount

ListCount プロパティは読み取り専用です。リストボックスに追加されている項目数を取得します。

具体的には次のように記述します。下記ではユーザーフォームが表示される前に発生する Initialize イベントに対するイベントプロシージャにコードを記述し、リストボックスに 5 個の項目を追加しています。そしてコマンドボタンをがクリックされると現在の項目数をメッセージボックスに表示します。

Option Explicit

Private Sub UserForm_Initialize()
    Dim i As Integer
    
    For i = 1 To 5
        ListBox1.AddItem "項目" & i
    Next i
End Sub

Private Sub CommandButton1_Click()
    MsgBox "項目数は " & ListBox1.ListCount & "個です"
End Sub

リストボックスの項目数を取得する(ListCount)(1)

リストボックスの項目数を取得する(ListCount)(2)

ユーザーフォームを表示すると、リストボックスが表示されます。リストボックスには 5 個の項目が追加されています。

リストボックスの項目数を取得する(ListCount)(3)

「Count」ボタンをクリックすると、リストボックスに追加されている項目数をメッセージボックスで表示します。

リストボックスの項目数を取得する(ListCount)(4)

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

リストボックスに追加した項目を削除するには RemoveItem メソッドを使用します。

オブジェクト.RemoveItem index

指定したインデックスの項目をリストボックスから削除します。インデックスは先頭の項目から順に 0, 1, 2... となっています。

またリストボックスのすべての項目を削除するには Clear メソッドを使用します。

オブジェクト.Clear

リストボックスに追加されている項目をすべて削除します。

具体的には次のように記述します。下記ではユーザーフォームが表示される前に発生する Initialize イベントに対するイベントプロシージャにコードを記述し、リストボックスに 5 個の項目を追加しています。そしてコマンドボタンをがクリックされたときに、リストボックスの先頭の項目を削除したりすべての項目を削除したりします。

Option Explicit

Private Sub UserForm_Initialize()
    Dim i As Integer
    
    For i = 1 To 5
        ListBox1.AddItem "項目" & i
    Next i
End Sub

Private Sub CommandButton1_Click()
    If ListBox1.ListCount > 0 Then
        ListBox1.RemoveItem 0
    End If
End Sub

Private Sub CommandButton2_Click()
    ListBox1.Clear
End Sub

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

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

ユーザーフォームを表示すると、リストボックスが表示されます。リストボックスには 5 個の項目が追加されています。

リストボックスの項目を削除する(RemoveItem,Clear)(3)

「Remove」ボタンをクリックすると、リストボックスの先頭の項目が 1 つ削除されます。

リストボックスの項目を削除する(RemoveItem,Clear)(4)

「Clear」ボタンをクリックすると、リストボックスのすべての項目が削除されます。

リストボックスの項目を削除する(RemoveItem,Clear)(5)

-- --

Excel の VBA を使ったリストボックスの作成と項目の追加および削除の方法について解説しました。

( Written by Tatsuo Ikura )

Profile
profile_img

著者 / TATSUO IKURA

プログラミングや開発環境構築の解説サイトを運営しています。