即効テクニック

ユーザーフォーム関連のテクニック

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

(Excel 97/2000/2002/2003/2007)

UserFormでよく使われるコントロールといえば、コマンドボタン(CommandButton)とテキストボックス(TextBox)、それとリストボックス(ListBox)でしょう。 コマンドボタンはクリックしたときの動作をClickイベントに記述する使い方が多く、テキストボックスは、ユーザーから文字列を受け取ったり、ユーザーに情報を提供するときなどに使われます。どちらも使いこなすには多少のコツとテクニックが必要ですが、今回は、もう少し複雑なリストボックスの使い方を解説します。

リストボックス操作の基本は、 (1)リストボックスに表示するデータを登録する (2)リストボックスで何が選択されているかを調べる の二つです。 以下は、UserForm1にリストボックス(ListBox1)を配置している前提で解説します。 ・データを登録する リストボックスにデータを登録するに三つの方法があります。 一つ目はRowSourceプロパティにセルのアドレスを指定する方法です。 これは、登録したいデータがワークシート上に入力されているケースで有効です。 次のコードは、Sheet1のセル範囲A1:A3に入力されているデータを、リストボックスに登録します。
Private Sub UserForm_Initialize()
    ListBox1.RowSource = "Sheet1!A1:A3"
End Sub
このRowSourceプロパティに指定する値は「Worksheets("Sheet1").Range("A1:A3")」のようなオブジェクト式ではなく、上記のような文字列ですので留意してください。 RowSourceプロパティにセルのアドレスを指定すると、セルとリストボックスが"リンクされた状態"になります。UserFormを表示している状態でも、セルの値が変化すれば、リストボックスのデータも同じように変化します。 二つめの方法はAddItemメソッドです。登録するデータがシート上に存在しない場合でも、AddItemメソッドでデータを1つずつ登録できます。 次のコードは「田中」「鈴木」「山田」の3データをリストボックスに登録します。
Private Sub UserForm_Initialize()
    ListBox1.AddItem "田中"
    ListBox1.AddItem "鈴木"
    ListBox1.AddItem "山田"
End Sub
RowSourceプロパティとAddItemメソッドは、どちらも同じようにデータを登録しますが、RowSourceプロパティは「セルとリストボックスをリンクさせる」プロパティですので、UserForm表示中にリストボックスのデータを変更するときは、セルの値を変更しなければなりません。 次のように、RowSourceプロパティを設定したリストボックスに対して、AddItemメソッドを実行するとエラーになります。
Private Sub UserForm_Initialize()
    ListBox1.RowSource = "Sheet1!A1:A3"
    ListBox1.AddItem "長谷部"
End Sub
三つ目は配列データを登録する方法です。 リストボックスに表示されるデータは、Listプロパティに配列として格納されます。 登楼したいデータが配列変数に格納されている場合、その配列変数をListプロパティに設定することで、データの登録が可能です。 次のコードは、配列に格納されている「田中」「鈴木」「山田」の3データをリストボックスに登録します。
Private Sub UserForm_Initialize()
    Dim myData(2) As String
    myData(0) = "田中"
    myData(1) = "鈴木"
    myData(2) = "山田"
    ListBox1.List = myData
End Sub
・選択されたデータを調べる リストボックスで選択されたデータはTextプロパティまたはValueプロパティで 取得できます。次のコードは、リストボックスで選択されている項目を表示します。 UserFormにリストボックス(ListBox1)とコマンドボタン(CommandButton1)を配置して、実行してください。
Private Sub CommandButton1_Click()
    MsgBox ListBox1.Text
End Sub

Private Sub UserForm_Initialize()
    ListBox1.AddItem "田中"
    ListBox1.AddItem "鈴木"
    ListBox1.AddItem "山田"
End Sub
一般的なケースでは、TextプロパティとValueプロパティは同じ値を返します。 ただし、リストボックスにデータが1件も登録されていない場合、またはリストボックス上でデータが何も選択されていない状態では、Textプロパティが空欄("")を返すのに対して、ValueプロパティはNull値を返します。 リストボックスに登録されているデータはListプロパティに配列として格納されていますので、配列の○番目という指定で特定のデータを取得できます。 また、リストボックスで現在選択されているデータの位置はListIndexプロパティで表されますので、両者を使って選択されているデータを取得することも可能です。
Private Sub CommandButton1_Click()
    MsgBox ListBox1.List(ListBox1.ListIndex)
End Sub

Private Sub UserForm_Initialize()
    ListBox1.AddItem "田中"
    ListBox1.AddItem "鈴木"
    ListBox1.AddItem "山田"
End Sub
ListIndexプロパティは、先頭のデータが「0」から始まります。また、データが選択されていない状態では、ListIndexプロパティが「-1」を返します。