フォームでリストを複数列表示する方法
動画でExcel フォームでリストを複数列表示する方法
【VBAユーザーフォーム】リストを複数列表示する方法。ユーザーフォームのリストボックスで選択した値を取得する、基礎編第7回 マクロ講座中級編(7/29)
動画版「ユーザーフォーム講座」です。
今回は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でも、 何を使っても同じです。
リストが2列の場合
二列で表示した時からちょっと違ってきます。
アイテムとか、 アイテムの取得方法、さらに
テキストの場合とバリューの場合が違ってくる ということですね。
では二列にした場合を見ていきたいと思います。
そしてこの二列表示は、
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
リストが2列の場合
ところで前回は、このリストのアイテムを 配列で範囲から取得しました。
とっても簡単だったのに、今回はローソースを使って取得しました。
この方法をなぜ取ったかというと、 配列でリストのデータを入れると、
この見出しが表示できなくなってしまうからです。
でも配列で取得する方が簡単です。
だから見出しを取るか配列を取るかという、
二者択一になってしまいますが、 もし見出しを表示したければ、
このオーソドックスなローソースのリスト取得方法で コードを書きましょうということになります。
そして配列で取得したければ、見出しのことは諦めてリストを効率よく 取得しましょうということになります。
ではそのコードを書いていきます。
このコードを変更していきます。
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
それで見出しが欲しいなという場合は、 見出しをラベルで作りましょう。
それが一番簡単です。