リストボックス(複数選択編)

リストボックスで複数選択を可能にするためには、MultiSelectプロパティで設定ます。
値の取得はSelectedプロパティを使いますが、これは配列になります。値が1つの場合も同じです。
単一選択の場合と異なり、TextプロパティやValueプロパティは使用しませんので注意してください。
リストの設定自体はこれまでの方法とわかりません。
MultiSelectプロパティの設定
複数選択する場合は、MultiSelectプロパティを指定します。
定 数 | 値 | 内 容 |
---|---|---|
fmMultiSelectSingle | 0 | 単一選択 |
fmMultiSelectMulti | 1 | クリックするたびに選択 |
fmMultiSelectExtended | 2 | windows基準の選択方法 |
複数選択の場合は、fmMultiSelectMulti か fmMultiSelectExtended を選択します。
両者の違いは、複数選択する際の選択操作の違いです。
fmMultiSelectMulti ではクリックするたびに選択できるようになります。
fmMultiSelectExtended では windows基準のShitキーやCtrlキーを使った選択方法になります。
選択項目の取得
Selectedプロパティにリストのどれが選択されたかTrue・Falseで返ってきます。
インデックスはリストと同じなので、Forループで巡りながら取得するのが一般的です。
インデックスは0から始まる数です。
以下の例では、設置したボタンをクリックすると選択された項目をイミディエイトウィンドウに表示させます。
Private Sub Button_Click()
Dim i As Long
With ListBox1
For i = 0 To .ListCount - 1
If .Selected(i) = True Then
Debug.Print .List(i, 0)
End If
Next i
End With
End Sub
リストのインデックスは0から始まりますので、リストの最後を得る時は「.ListCount – 1」としています。
Forループで Selected が True であれば、Listの値を参照します。
上の例はリストが複数列ある場合なので、 List(i, 0) としています。
第二引数が列になります。一列目は0となります。
一列のリストの場合は、 List(i) とすればOKです。
まとめ
複数行の選択できるリストボックスでは、単一選択とは全く別方法で取得することになります。
プログラムコードは少々複雑になりますが、パターンを覚えてしまえばそれほど難しくはありません。
以下のサンプルコードを参考にしてみてください。
コードはユーザーフォームモジュールのプログラム画面に書きます。
サンプルコード
Private Sub UserForm_Initialize()
Dim arr
arr = Worksheets("Sheet2").Range("A1:B7")
With ListBox1
.ColumnCount = 2 '表示列数の設定
.TextColumn = 1 'Textとして取得する列の設定
.BoundColumn = 2 'Valueとして取得する列の設定
.ColumnWidths = "60;50" '列幅の指定
.List = arr
End With
End Sub
ユーザーフォーム初期化のプロシージャです。
この例ではSheet2のA1:B7にある値をリストにしています。
Private Sub Button_Click()
Dim i As Long, cnt As Long, lastRow As Long
'それまでの表示を消去
lastRow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
For i = 1 To lastRow
Cells(i, 1) = ""
Cells(i, 2) = ""
Next i
cnt = 1
With ListBox1
For i = 0 To .ListCount - 1
If .Selected(i) = True Then
Cells(cnt, 1) = .List(i, 0) '1列目
Cells(cnt, 2) = .List(i, 1) '2列目
cnt = cnt + 1
End If
Next i
End With
End Sub
ユーザーフォーム上のボタンをクリックした時のプロシージャです。
このプログラムでは、アクティブシートのA列B列にそれぞれ値を表示します。
表示する際に前回の値を消去する必要がありますので、
最終行を取得して、A列B列を消去しています。
転記するセルは上から順番にするため cnt というカウンタ変数を用意しておきます。
あとは選択された順番に値を代入していきます。
尚、以下の例では ListStyle プロパティを fmListStyleOption としているためチェックボックスが付いています。

ユーザーフォームの使い方
・ユーザーフォームのプログラミング(準備編)
・ユーザーフォーム 第1回(起動と終了)
・ユーザーフォーム 第2回(ボタン)
・ユーザーフォーム 第3回(ラベル)
・ユーザーフォーム 第4回(テキストボックス)
・ユーザーフォーム 第5回(モーダル・モードレス)
・ユーザーフォーム 第6回(チェックボックス)
・ユーザーフォーム 第7回(オプションボタン)
・ユーザーフォーム 第8回(コンボボックス)
・ユーザーフォーム 第9回(リストボックス)
・ユーザーフォーム 第10回(リストボックス複数選択)
・ユーザーフォーム 第11回(タブストップ)
・ユーザーフォーム 第12回(スピンボタン)