Excel VBA リストボックスで複数行選択して値を取得する

スポンサーリンク

リストボックスで複数行選択して値を取得する方法

リストボックスで複数行を選択できるようにするには、ListBox【リストボックス】コントロールオブジェクトのMultiSelect【マルチセレクト】プロパティを使用して複数行選択できるリストボックスを設定します。

次に、複数行を選択できるリストの選択状況を判定するListBox【リストボックス】コントロールオブジェクトのSelected【セレクテッド】プロパティを使用してリストが選択されているか判定します。

リストボックスに設定されているリストの行数をListBox【リストボックス】コントロールオブジェクトのListCount【リストカウント】プロパティで取得して取得した行数分の繰り返し処理で選択状況を判定します。

選択されているリストの行番号を設定してリストボックスの項目の値を取得するListBox【リストボックス】コントロールオブジェクトのList【リスト】プロパティを使用して選択されているリストの値を取得します。

ListBoxコントロールオブジェクトの主なプロパティ一覧

プロパティ 内容
MultiSelect
【マルチセレクト】
リストボックスで複数行のリストを
選択できるようにします。
Selected
【セレクテッド】
複数行を選択できるリストボックスでの
リストの選択状況を確認します。
ListCount
【リストカウント】
リストボックスに設定されている
リストの総行数を取得します。
List
【リスト】
リストボックスの項目の値を取得します。

MultiSelect【マルチセレクト】プロパティ

リストボックスで複数行のリストを選択できるようにするには、ListBox【リストボックス】コントロールオブジェクトのMultiSelect【マルチセレクト】プロパティを使用します。

MultiSelect【マルチセレクト】プロパティの書式と設定値

オブジェクト.MultiSelect = 設定値

  • オブジェクト(必須)
    対象のListBox【リストボックス】コントロールオブジェクトのオブジェクト名を指定します。
  • 設定値
    リストの選択方法をfmMultiselect列挙型の定数で指定します。

    fmMultiselect列挙型の定数
    定数 内容
    fmMultiSelectSingle 0 1行だけ選択できます。(既定値)
    fmMultiSelectMulti 1 複数行選択できます。
    選択を解除するには再度選択行をクリックします。
    fmMultiSelectExtended 2 [Shift]キーを押しながらクリックすると
    連続した行が選択できます。
    [Ctrl]キーを押しながらクリックすると
    連続していない複数の行を選択できます。

Selected【セレクテッド】プロパティ

複数行を選択できるリストボックスで選択状況を調べるには、ListBox【リストボックス】コントロールオブジェクトのSelected【セレクテッド】プロパティを使用します。

引数pvargIndex【ピイブイアーグインデックス】に選択されているかどうかを調べたいリストの行数を設定し、その行が選択されている場合はTrueを返し選択されていない場合はFalseを返します。値の取得と設定ができます。

Selected【セレクテッド】プロパティの書式と設定値(引数)の説明

【取得】
オブジェクト.Selected( pvargIndex )
【設定】
オブジェクト.Selected( pvargIndex ) = 設定値

  • オブジェクト(必須)
    対象となるListBox【リストボックス】コントロールオブジェクトのオブジェクト名を指定します。
  • pvargIndex【ピイブイアーグインデックス】(必須)
    リストボックスの選択状態を取得または設定したい行番号を設定します。リストの先頭行を「0」として、上から順番に数えた数値を指定します。
  • 設定値(必須)
    引数pvargIndexで指定した行のリストを選択状態に設定するには「True」選択されていない状態に設定するには「False」を指定します。

ListCount【リストカウント】プロパティ

リストボックスに設定されているリストの総行数を取得するには、ListBox【リストボックス】コントロールオブジェクトのListCount【リストカウント】プロパティを使用します。

ListCount【リストカウント】プロパティの書式と設定値の説明

オブジェクト.ListCount

  • オブジェクト(必須)
    対象のListBox【リストボックス】コントロールオブジェクトのオブジェクト名を指定します。

List【リスト】プロパティ

リストボックスの項目の値を取得するには、ListBox【リストボックス】コントロールオブジェクトのList【リスト】プロパティを使用します。

値の取得と設定ができます。

List【リスト】プロパティの書式と設定値(引数)の説明

【取得】
オブジェクト.List( pvargIndex, pvargColumn )
【設定】
オブジェクト.List( pvargIndex, pvargColumn ) = 設定値

  • オブジェクト(必須)
    対象となるListBox【リストボックス】コントロールオブジェクトの「オブジェクト名」を指定します。
  • pvargIndex【ピイブイアーグインデックス】(省略可)
    値を取得または設定したい行位置を指定します。指定する値は先頭行を「0」として上から順番に数えた数値です。省略した場合は先頭行を表す「0」が設定されます。
  • pvargColumn【ピイブイアーグカラム】(省略可)
    値を取得または設定したい列位置を指定します。指定する値はリストの左端列を「0」として左から順番に数えた数値です。省略した場合は先頭列を表す「0」が設定されます。
  • 設定値(必須)
    リストボックスの項目に追加したい値を設定します。

リストボックスのリストを複数行選択できるように設定する方法

リストボックスのリストを複数行選択できるように設定するには、ユーザーフォームが開く直前に実行されるUserFrom【ユーザフォーム】モジュールのInitalize【イニシャライズ】イベントプロシージャーにリストの設定とともに設定します。

リストを複数行選択できるように設定するコードと解説

Private Sub UserForm_Initialize()
Dim lastrow As Long
 lastrow = Sheets("リスト").Cells(Rows.Count, 1).End(xlUp).Row
With ListBox1
  .MultiSelect = fmMultiSelectMulti
  .ColumnHeads = True
  .ColumnCount = 3
  .ColumnWidths = "40;50;50"
  .RowSource = "リスト!" & Range("A2", "C" & lastrow).Address
End With
End Sub
5行目【.MultiSelect = fmMultiSelectMulti】
ListBox【リストボックス】コントロールオブジェクトのMultiSelect【マルチセレクト】プロパティに
fmMultiSelectMultiを設定して複数行選択できるリストボックスに設定します。
このコードの詳細解説については
リストボックスにセル範囲のデータを設定する」をご覧ください。

実行結果


複数選択された行の値を取得してメッセージボックスに表示するコードと解説

Private Sub CommandButton1_Click()
Dim リスト As String
Dim i As Integer
With ListBox1
 For i = 0 To .ListCount - 1
  If .Selected(i) = True Then
   リスト = リスト & .List(i) & vbCrLf
  End If
 Next i
End With
  MsgBox リスト
End Sub
1行目【Private Sub CommandButton1_Click()】
「CommandButton1」ボタンがクリックされたときに発生する「CommandButton1_Click」イベントプロシージャにコードを記述します。


2行目【Dim リスト As String】
List【リスト】プロパティで取得してリストの値を格納する変数「リスト」を文字列型(String)で宣言します。


3行目【Dim i As Integer】
繰り返し処理の中で使用するリストの行番号を格納するカウンター変数「i」を整数型(Integer)で宣言します。


4行目【With ListBox1】
操作対象となるListBox【リストボックス】コントロールオブジェクトのオブジェクト名ListBox1を
With【ウィズ】ステートメントで指定します。


5行目【For i = 0 To .ListCount – 1】
For Next【ファアネクスト】ステートメントを使用して繰り返し処理の始まりです。カウンター変数の「i」に0からListCount【リストカウント】プロパティで取得したリストの行数‐1を順に代入します。0から始まる理由はリストの選択状況を調べるSelected【セレクテッド】プロパティや値を取得するList【リスト】プロパティの取得対象の行を設定する引数pvargIndex【ピイブイアーグインデックス】に設定する行数の先頭行が0から始まるためです。


6行目【If .Selected(i) = True Then】
If【イフ】ステートメント(条件分岐)でSelected【セレクテッド】プロパティを使用して、i行目のリストがTrueだったときつまり、リストが選択状態のときを定義します。


7行目【リスト = リスト & .List(i) & vbCrLf】
6行目の条件分岐が成立したとき、つまり行が選択されている場合、その行の値をList【リスト】プロパティで取得して改行コードを&アンパサンドで連結して変数「リスト」に代入します。
繰り返し処理の中で、前の変数「リスト」に格納されている値を&アンパサンドで連結して変数「リスト」に代入します。


11行目【 MsgBox リスト】
変数「リスト」の格納されている値をMsgBox【メッセージボックス】関数で表示します。


実行結果


複数選択された行の値を取得してセルに代入するコード

Private Sub CommandButton1_Click()
Dim リスト As String
Dim i As Integer
With ListBox1
  For i = 0 To .ListCount - 1
      If .Selected(i) = True Then
        リスト = リスト & .List(i) & vbCrLf
      End If
  Next i
End With
    Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Value = リスト
End Sub

実行結果


リストボックスのプロパティ一覧は「リストボックスのプロパティ」をご覧ください。

以上で、リストボックスで複数行選択して値を取得する方法についての解説を終了します。ありがとうございました。

スポンサーリンク

関連記事・広告