目次
はじめに
ユーザーフォームのリストボックスは、通常は一つの項目しか選択できません。しかし、例えば「複数の商品をカートに追加する」「複数のファイルを選択して処理する」といった場面では、複数の項目を一度に選択できるようにしたいですよね。
リストボックスの .MultiSelect
プロパティを設定することで、Ctrl
キーやShift
キーを使った複数選択が可能になります。
この記事では、リストボックスの複数選択を有効にする方法と、選択された全ての項目のデータをVBAで取得するための、基本的で確実な方法を解説します。
複数選択リストボックスの設定と値の取得サンプルコード
このマクロは、2つの部分で構成されます。
UserForm_Initialize
: フォームが表示される際に、リストボックスを複数選択可能に設定します。SubmitButton_Click
: 「決定」ボタンが押されたときに、選択されている全ての項目の情報を取得して表示します。
ユーザーフォームのコード
' フォームが初期化されるときに実行されるイベント
Private Sub UserForm_Initialize()
With Me.ItemListBox
' 3列表示に設定
.ColumnCount = 3
.ColumnWidths = "50;120;60"
' ワークシートの範囲からデータを読み込み
.List = ThisWorkbook.Worksheets("ItemList").Range("A1:C10").Value
' .MultiSelectプロパティで複数選択を有効化
' fmMultiSelectExtended: ShiftキーやCtrlキーを使った一般的な複数選択
.MultiSelect = fmMultiSelectExtended
End With
End Sub
' 「決定」ボタン(SubmitButton)がクリックされたときの処理
Private Sub SubmitButton_Click()
Dim i As Long
Dim resultText As String
resultText = "【選択された項目】" & vbCrLf
With Me.ItemListBox
' .ListCountプロパティでリストの全行数を取得し、ループ処理
For i = 0 To .ListCount - 1
' .Selected(i)プロパティで、i番目の行が選択されているか(True)を判定
If .Selected(i) = True Then
' 選択されていたら、その行のデータを結果に追加
resultText = resultText & _
"・" & .List(i, 0) & ", " & _
.List(i, 1) & ", " & _
.List(i, 2) & "円" & vbCrLf
End If
Next i
End With
MsgBox resultText, vbInformation, "選択結果"
End Sub
コードの解説
.MultiSelect = fmMultiSelectExtended
この一行が、複数選択を可能にするための鍵です。
.MultiSelect
: リストボックスの選択モードを設定するプロパティです。fmMultiSelectExtended
:Shift
キーによる範囲選択や、Ctrl
キーによる個別選択を可能にする、最も一般的な複数選択モードです。fmMultiSelectMulti
: クリックまたはスペースキーで、複数項目のオン/オフを切り替えるモードです。fmMultiSelectSingle
: 単一選択モードです(デフォルト)。
For i = 0 To .ListCount - 1
選択された項目を取得するには、リストの先頭から最後まで全ての行をチェックする必要があります。
.ListCount
: リストの総行数を返します。インデックスは0から始まるため、ループは0
から.ListCount - 1
までとなります。
If .Selected(i) = True Then
このコードが、各行が選択されているかどうかを判定する核心部分です。
.Selected(i)
:i
番目の行の選択状態をTrue
(選択されている)かFalse
(選択されていない)で返すプロパティです。If
文で、このプロパティがTrue
の行だけを対象に、データ取得の処理を実行します。
まとめ
今回は、リストボックスで複数選択を可能にし、選択された全ての項目を取得する方法を解説しました。
.MultiSelect
プロパティで複数選択モードを有効にする。.ListCount
を使って全行をループする。- ループの中で
.Selected(行インデックス)
プロパティをチェックし、True
の行のデータを取得する。
この手順をマスターすれば、ユーザーが選んだ複数のデータに対して一括で処理を行う、より高度で柔軟なツールを作成することができます。