フォームでリストを複数列表示する方法

ユーザーフォーム講座 動画編 07回
フォームでリストを複数列表示する方法

動画でExcel フォームでリストを複数列表示する方法

【VBAユーザーフォーム】リストを複数列表示する方法。ユーザーフォームのリストボックスで選択した値を取得する、基礎編第7回 マクロ講座中級編(7/29)

動画版「ユーザーフォーム講座」です。
今回は5回で説明したリストの選択した値の取得方法についての解説とコードです。
方法は複数ありますが、それぞれの使い方と解説と、それからリストを複数列取得するという方法について お話ししたいと思います。 最初にリストの選択値を取得する方法についてお話しします。

マクロ動画 フォームでリストを複数列表示する方法

https://youtu.be/3wOAT-sL4xg

リストで選択した項目を取得する

リストで選択した項目を取得するには 3つの方法があります。 1つ目はテキストプロパティから取得する
2つ目はバリュープロパティから取得する
3つ目はリストプロパティから取得するというものです。

ユーザーフォームでリストを2列以上表示する1

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

ユーザーフォームでリストを2列以上表示する2

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

ユーザーフォームでリストを2列以上表示する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に表示します。

ユーザーフォームでリストを2列以上表示する4

上記のようにリストが一列だと、どれも同じ値が返ってきますので、なんで3つも用意されているのかと どれ使ってもいいのかよーということになってしまいますよね。
このように、配列で 一元配列の時、一列しか使ってないという場合は、返る値は ListIndexでも、ValueでもTextでも、 何を使っても同じです。


リストが2列の場合

二列で表示した時からちょっと違ってきます。
アイテムとか、 アイテムの取得方法、さらに テキストの場合とバリューの場合が違ってくる ということですね。
では二列にした場合を見ていきたいと思います。

ユーザーフォームでリストを2列以上表示する5

そしてこの二列表示は、 UserForm_Initializeというイベントに書きます。
これは起動する時に初期設定で、 こういう形で起動するという その設定を書くためのプロシージャーです。

その中で使うのは、With List_商品名 ということで with構文の中にコードを入れていきたいと思います。
今回は RowSource ローソースで取得しましょう。
.RowSource = "Sheet1!A2:B9"
シート1から取得します。 シート1の範囲A2:B9を指定してやります。

ユーザーフォームでリストを2列以上表示する2
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にしてやってください。

ユーザーフォームでリストを2列以上表示する3

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

ユーザーフォームでリストを2列以上表示する4

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

ユーザーフォームでリストを2列以上表示する5
     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列の場合

ところで前回は、このリストのアイテムを 配列で範囲から取得しました。 とっても簡単だったのに、今回はローソースを使って取得しました。
この方法をなぜ取ったかというと、 配列でリストのデータを入れると、 この見出しが表示できなくなってしまうからです。
でも配列で取得する方が簡単です。 だから見出しを取るか配列を取るかという、 二者択一になってしまいますが、 もし見出しを表示したければ、 このオーソドックスなローソースのリスト取得方法で コードを書きましょうということになります。
そして配列で取得したければ、見出しのことは諦めてリストを効率よく 取得しましょうということになります。
ではそのコードを書いていきます。 このコードを変更していきます。

ユーザーフォームでリストを2列以上表示する6
      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
     

それで見出しが欲しいなという場合は、 見出しをラベルで作りましょう。
それが一番簡単です。

ユーザーフォームでリストを2列以上表示する7