ユーザーフォーム 第10回 リストボックス2

ユーザーフォーム

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

 リストボックスで複数選択を可能にするためには、MultiSelectプロパティで設定ます。
 値の取得はSelectedプロパティを使いますが、これは配列になります。値が1つの場合も同じです。
 単一選択の場合と異なり、TextプロパティやValueプロパティは使用しませんので注意してください。
 リストの設定自体はこれまでの方法とわかりません。

MultiSelectプロパティの設定

 複数選択する場合は、MultiSelectプロパティを指定します。

定 数内 容
fmMultiSelectSingle0単一選択
fmMultiSelectMulti1クリックするたびに選択
fmMultiSelectExtended2windows基準の選択方法

 複数選択の場合は、fmMultiSelectMulti fmMultiSelectExtended を選択します。
 両者の違いは、複数選択する際の選択操作の違いです。
 fmMultiSelectMulti ではクリックするたびに選択できるようになります。
 fmMultiSelectExtended では windows基準のShitキーやCtrlキーを使った選択方法になります。

選択項目の取得

 Selectedプロパティにリストのどれが選択されたかTrueFalseで返ってきます。
 インデックスはリストと同じなので、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 としているためチェックボックスが付いています。

タイトルとURLをコピーしました