【VBA】リストボックスで複数選択を可能にし、選択項目を全て取得する方法

目次

はじめに

ユーザーフォームのリストボックスは、通常は一つの項目しか選択できません。しかし、例えば「複数の商品をカートに追加する」「複数のファイルを選択して処理する」といった場面では、複数の項目を一度に選択できるようにしたいですよね。

リストボックスの .MultiSelect プロパティを設定することで、CtrlキーやShiftキーを使った複数選択が可能になります。

この記事では、リストボックスの複数選択を有効にする方法と、選択された全ての項目のデータをVBAで取得するための、基本的で確実な方法を解説します。


複数選択リストボックスの設定と値の取得サンプルコード

このマクロは、2つの部分で構成されます。

  1. UserForm_Initialize: フォームが表示される際に、リストボックスを複数選択可能に設定します。
  2. 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 の行のデータを取得する。

この手順をマスターすれば、ユーザーが選んだ複数のデータに対して一括で処理を行う、より高度で柔軟なツールを作成することができます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次