はじめに
VBAのユーザーフォームで、商品一覧や顧客名簿といった、Excelシート上の表(テーブル)データをそのまま表示したい、という場面は非常に多くあります。
「リストボックス」コントロールは、複数列表示に対応しており、いくつかのプロパティを設定するだけで、ワークシート上の表をそっくりそのままフォーム上に再現することができます。
この記事では、複数列からなるシート上の表を、リストボックスに表示するための、基本的で非常に強力な方法を解説します。
シートの表をリストボックスに表示するVBAサンプルコード
この設定は、ユーザーフォームが表示される直前の UserForm_Initialize
イベント内で行うのが最適です。
この例では、「ProductList
」という名前のシートの A1:C10
の範囲にある商品リストを、ProductListForm
というフォームの ProductListBox
に表示します。
ユーザーフォームのコード
' フォームが初期化されるときに実行されるイベント
Private Sub UserForm_Initialize()
Dim dataRange As Range
' 表示したいシートの表の範囲を設定
Set dataRange = ThisWorkbook.Worksheets("ProductList").Range("A1:C10")
With Me.ProductListBox
' .ColumnCount プロパティ: 表示する列数を設定
.ColumnCount = 3
' .ColumnWidths プロパティ: 各列の幅をポイント単位で設定
' セミコロン(;)で区切って指定する
.ColumnWidths = "120;80;50"
' .List プロパティ: セル範囲の値を一括でリストに代入
.List = dataRange.Value
End With
End Sub
実行前の準備
ProductList
という名前のワークシートを作成し、A1
からC10
の範囲に何らかの表データ(例: 商品ID, 商品名, 価格)を入力しておきます。ProductListForm
という名前のユーザーフォームを作成します。- フォーム上に「リストボックス」を配置し、
(Name)
プロパティをProductListBox
に変更します。 - フォームのコードモジュールに上記のコードを貼り付け、フォームを表示すると、リストボックスにシートの表がそのまま表示されます。
コード(プロパティ)の解説
.ColumnCount = 3
リストボックスに表示する列の数を指定します。この数値を、元の表の列数(この例ではA, B, Cの3列)に合わせて設定します。
.ColumnWidths = "120;80;50"
各列の幅を、ポイント単位の文字列で指定します。
"120;80;50"
のように、各列の幅を**セミコロン(;
)**で区切って指定します。- この文字列の個数が、
.ColumnCount
の値と一致している必要があります。 - 全体の幅を調整しながら、最適な数値を設定してください。
.List = dataRange.Value
この一行が、シートのデータをリストボックスに流し込む核心部分です。
dataRange.Value
: セル範囲オブジェクトの.Value
プロパティは、その範囲の全てのセルの値を格納した2次元配列を返します。- リストボックスの
.List
プロパティは、この2次元配列を直接受け取ることができ、配列の内容を表形式で一括設定してくれます。
この方法は、一つずつセルをループして .AddItem
メソッドで追加していくよりも、はるかに高速で効率的です。
まとめ
今回は、Excelシート上の表データを、複数列のリストボックスにそのまま表示する方法を解説しました。
.ColumnCount
で列数を指定する。.ColumnWidths
で各列の幅をセミコロン区切りで指定する。- 表示したいセル範囲の
.Value
を、リストボックスの.List
プロパティに直接代入する。
この3ステップで、シート上のデータをインタラクティブなフォーム上で簡単に扱うことができるようになります。データの選択や表示を行う、多くのVBAツールで活用できる基本的なテクニックです。