
動画でExcel フォームでリストを複数列表示する方法
動画版「ユーザーフォーム講座」です。
今回は5回で説明したリストの選択した値の取得方法についての解説とコードです。
方法は複数ありますが、それぞれの使い方と解説と、それからリストを複数列取得するという方法について
お話ししたいと思います。
最初にリストの選択値を取得する方法についてお話しします。
リストで選択した項目を取得するには
3つの方法があります。
1つ目はテキストプロパティから取得する
2つ目はバリュープロパティから取得する
3つ目はリストプロパティから取得するというものです。

こちらがサンプルのユーザーフォームです。
5回から引き継いでいるのですが
ボタンを1つ追加しました。
選択した項目を取得するための、取得ボタンです。
アイテムを取得するボタンで、
btn_itemというオブジェクト名にしています。
そしてボタンをクリックした時に
商品名を返すようにコードを書いています。

その中のコードで テキストプロパティとバリュープロパティ そしてテキストプロパティ この3種類で同じものを受け取ろう どういう風に返されるだろうかというコードがこちらです。

Private Sub btn_item_Click()
With List_商品名
If .ListIndex = -1 Then Exit Sub
MsgBox "List(.ListIndex)は、" & .List(.ListIndex) & vbCrLf _
& "Valueは、" & .Value & vbCrLf & "Textは、" & .Text
End With
End Sub
If .ListIndex = -1 ならばExit Sub
-1というのは選択されていないということです。
このListIndexというのはアイテムのメンバーリストというのは配列です。
ですから必ずindexが付いています。
配列ですから、0番からあるよということで、 8個のアイテムが入っているのですけれども、
0番から7番までindexが付いているということなんですね。
これがListIndexがマイナスだったらば、項目が選択されてないから、値を返せないということで
exitしています。
選択されていたらメッセージボックスを表示して.List(.ListIndex)を表示し、さらに.Valueと.Textも表示するという意味になります。
ユーザーフォームを実行し、ボタンをクリックすると、選択したアイテムの情報を取得して、
MsgBoxに表示します。

上記のようにリストが一列だと、どれも同じ値が返ってきますので、なんで3つも用意されているのかと
どれ使ってもいいのかよーということになってしまいますよね。
このように、配列で 一元配列の時、一列しか使ってないという場合は、返る値は ListIndexでも、ValueでもTextでも、 何を使っても同じです。
二列で表示した時からちょっと違ってきます。
アイテムとか、 アイテムの取得方法、さらに
テキストの場合とバリューの場合が違ってくる ということですね。
では二列にした場合を見ていきたいと思います。
そしてこの二列表示は、
UserForm_Initializeというイベントに書きます。
これは起動する時に初期設定で、 こういう形で起動するという
その設定を書くためのプロシージャーです。
その中で使うのは、With List_商品名 ということで
with構文の中にコードを入れていきたいと思います。
今回は RowSource ローソースで取得しましょう。
.RowSource = "Sheet1!A2:B9"
シート1から取得します。
シート1の範囲A2:B9を指定してやります。

Private Sub UserForm_Initialize()
With List_商品名
.RowSource = "Sheet1!A2:B9"
.ColumnCount = 2
.TextColumn = 1
.BoundColumn = 2
.ListIndex = 0
End With
End Sub
そして次に列数、カラムカウント
.ColumnCount = 2
これでカラムの数をいくつ指定するか、
という意味です。
2列指定してやります。
3列の表を指定したら3とかですね。
4列だったら4、列全部読み込みたければ4にしてやってください。

そしてテキストカラムです。
値を取得するのにテキスト カラムを
.TextColumn = 1
テキストの列っていうのをここで指定できるんですね。
それから バリューカラム、
バリューカラムをここで指定するんです。
バリューカラムって言わないんです。
バリューはバウンドカラム
.BoundColumn = 2
ここでは、1列と2列しかないのでバウンドカラムは2です。
テキストを指定したら1を返して、 バウンドカラムって言ったら2を返すというコードです。
こうやって使い分けます。

リストの範囲をRowSourceから取得する場合は、見出し行を表示することができます。
.ColumnHeads = True
見出しがあるとさらに見やすくなりますね。

Private Sub UserForm_Initialize()
With List_商品名
.RowSource = "Sheet1!A2:B9"
.ColumnCount = 2
.ColumnHeads = True
.TextColumn = 1
.BoundColumn = 2
.ListIndex = 0
End With
End Sub
ところで前回は、このリストのアイテムを 配列で範囲から取得しました。
とっても簡単だったのに、今回はローソースを使って取得しました。
この方法をなぜ取ったかというと、 配列でリストのデータを入れると、
この見出しが表示できなくなってしまうからです。
でも配列で取得する方が簡単です。
だから見出しを取るか配列を取るかという、
二者択一になってしまいますが、 もし見出しを表示したければ、
このオーソドックスなローソースのリスト取得方法で コードを書きましょうということになります。
そして配列で取得したければ、見出しのことは諦めてリストを効率よく 取得しましょうということになります。
ではそのコードを書いていきます。
このコードを変更していきます。

Private Sub UserForm_Initialize()
Dim dataarr As Variant
dataarr = Worksheets("Sheet1").Range("A2:B9").Value
With List_商品名
.List = dataarr
.ColumnCount = 2
.TextColumn = 1
.BoundColumn = 2
.ListIndex = 0
End With
End Sub
それで見出しが欲しいなという場合は、 見出しをラベルで作りましょう。
それが一番簡単です。
