UserFormで使用するリストボックス(ListBox)では、複数列のデータを表示することが可能です。
複数列のデータを表示するには、まずリストボックスのColumnCountプロパティに表示したい列の数を指定します。標準では1が設定されています。このColumnCountプロパティは、プロパティウィンドウで指定すればいいでしょう。ここでは、ColumnCountプロパティに"2"を指定したものとします。
さて、これで準備は完了です。
このリストボックスには、複数列のデータを表示できるようになりました。リストボックスに複数列のデータを表示するには、次のようにします。
ListBox1.List(行位置, 列位置) = "データ"
リストボックス内のデータは配列形式で管理されていて、それはListプロパティで操作できるのですが、実は上のように二次元配列になっています。"行位置"というのは、リストボックスの「上から何番目」です。つまり、ListIndexプロパティと同じことですね。先頭行が"0"です。"列位置"は、左から数えて何列目かということです。こちらも、左端列が"0"となります。つまり、リストボックスの先頭行に、
のように表示したいのなら、次のようにします。
ListBox1.List(0, 0) = "tanaka" ListBox1.List(0, 1) = 2012
しかし、何もデータが登録されていないリストボックスに対して、いきなり上のコードを実行してはいけません。複数列のリストボックスにデータを登録するには、まず「空のデータ」を登録し、その空データを編集するという2段階の操作が必要になります。
Private Sub CommandButton1_Click() ListBox1.AddItem "" ListBox1.List(0, 0) = "tanaka" ListBox1.List(0, 1) = 2012 End Sub
ちょっと整理してみましょう。上のコードは、次のような動作です。
アクティブシートに、次のようなデータが入力されていたとします。これらを、複数列のリストボックスに表示するには、たとえば次のようにします。
Private Sub CommandButton1_Click() Dim i As Long With ListBox1 For i = 2 To 11 .AddItem "" .List(.ListCount - 1, 0) = Cells(i, 1) .List(.ListCount - 1, 1) = Cells(i, 2) Next i End With End Sub
あるいは、リストボックスに登録したいデータが、上のように、ワークシートに入力されているのでしたら、もっと簡単な方法もあります。リストボックスは、そこに表示するデータを配列形式で管理しています。ここまでで解説した、一度空のデータを登録してから・・・というのは、その配列データに、1件ずつ登録する考え方です。そうではなく、ワークシートに入力された"ひとかたまりのセル範囲"を、配列として一気に登録することも可能です。
Private Sub CommandButton1_Click() ListBox1.List = Range("A2:B11").Value End Sub
このとき、Valueプロパティを省略してはいけません。複数セル範囲を扱うとき、Valueプロパティを省略すると、配列にならないからです。もし、データの数が不定で、最終行の位置を調べなければならないときは、たとえば次のようにしましょう。
Private Sub CommandButton1_Click() ListBox1.List = Range(Range("A2"), Cells(Rows.Count, 2).End(xlUp)).Value End Sub
もちろん、配列であれば登録できるのですから、次のように、任意のデータを一括登録することも可能です。まぁ、こうした使い方は希でしょうけど。
Private Sub CommandButton1_Click() Dim tmp(2, 2) As String tmp(0, 0) = "大野" tmp(0, 1) = 536 tmp(1, 0) = "栗原" tmp(1, 1) = 914 tmp(2, 0) = "宮下" tmp(2, 1) = 440 ListBox1.List = tmp End Sub
リストボックスに複数列を表示するとき、各列の幅は個別に指定できます。
各列の幅は、ColumnWidthsプロパティに指定します。ColumnWidthsプロパティに、空欄("")または-1を指定すると、各列は、リストボックスの幅を列数で割った幅になります。ColumnWidthsプロパティは、標準では空欄ですから、上記で解説したリストボックスは、2つの列が均等の幅で、それぞれ「リストボックスの幅÷2」になっています。
ColumnWidthsプロパティに指定する各列の幅は、ポイント(pt)・センチメートル(Cm)・インチ(in)の、いずれかの単位で指定します。単位を省略すると、ポイント(pt)とみなされます。ちなみに、1ポイントは1/72インチです。