Excel VBA ユーザーフォーム上のリストボックスで選択されている値を取得する方法

コントロール作成/操作

ユーザーフォーム上のリストボックスで選択されている値を取得する方法をご説明します。

リストボックスは複数のテキストを登録し、その中から選択できる機能のコントロールです。

セル範囲をリストに登録したり、1つしか選択できないように指定したり、複数選択可能にしたり、また、選択したリストを取得するなどが可能です。

そのため、選択された値を取得する処理が必要になることがあります。

値を取得するためには、まずリストボックスを取得する必要があります。

また、リストボックスは複数のリストを選択可能ですので、複数選択されたリストを取得する方法もご説明します。

その他のリストボックスについての処理は下記記事をご覧ください。

1.リストボックスを取得する方法

リストボックスを取得するには直接コントロールを指定する方法と、ユーザーフォーム上にあるコントロールをすべてループして、条件を満たしたコントロールを取得する方法があります。

指定したリストボックスの取得

特定のリストボックスを指定して取得する方法です。

コントロールを指定するにはコントロール名かインデックス番号で指定します。

それぞれ次のように記述します。

Controls(“コントロール名”)

Controls(番号)

ユーザーフォーム上のコントロールをループして取得する

ユーザーフォーム上に設置されているコントロールをすべてループして、コントロールの種類がリストボックスの場合のみ取得する方法です。

条件となるリストボックスを特定できるコントロール名の場合は、名前でも対応出来ます。

コントロールをすべてループするには「For Each In Next」でループするのが最も簡単です。

コントロールの種類がリストボックスか判定するには「TypeName」関数を使用します。

リストボックスの種類を特定するのは「ListBox」です。

TypeName」は次のように記述します。

TypeName(Control)

Controlには Controls(“コントロール名”) か、 Controls(番号)を指定します。

サンプルコードは「コントロールの数と名前と種類を取得する」をご覧ください。

2.リストボックスの値を取得する

コントロールの取得方法の次は、値の取得方法です。

1つ選択されているリストの取得

現在選択されているリストは「ListIndex」プロパティで取得出来ます。

ListBox1.List(ListBox1.ListIndex)

取得した値はすべて文字列で格納されます。

未選択の状態ですリストの一番上が取得されます。

複数選択されているリストの取得

複数選択可能なリストで、複数選択されているリストを取得するには少し工夫が必要です。

Selected」プロパティでリストが一つずつ選択されているかループで確認します。

次のように記述します。

ListBox1.Selected(Index)

選択されているかはブール型のTrue/Falseを返しますので、True/Falseで判定してTrueの場合に取得します。

3.サンプルコード

コントロールの取得方法と値の取得方法がわかりましたので、サンプルコードです。

ユーザーフォームとリストボックスを表示する

ユーザーフォームにリストボックスを設置して、下記コードでユーザーフォームを表示して、リストを追加したリストボックスを操作します。

複数選択も可能にするため「MultiSelect」を「fmMultiSelectExtended」に指定しています。

Sub Sample()

Dim MyCtrl      As Object
Dim i           As Long
Dim MyArray()   As Variant

ReDim MyArray(0 To 3)
MyArray(0) = "りんご"
MyArray(1) = "みかん"
MyArray(2) = "ぶどう"
MyArray(3) = "スイカ"

With UserForm1

    Set MyCtrl = .Controls.Add("Forms.ListBox.1", "MyList", True)
    
    With MyCtrl
        .Top = 24                           'Top位置
        .Left = 18                          'Left位置
        .Height = 100                        '高さ
        .Width = 100                        '幅
        .BorderStyle = fmBorderStyleSingle  '枠線
        .ForeColor = RGB(0, 0, 0)           '文字色
        .Font.Name = "メイリオ"             'テキストのスタイル
        .TextAlign = 2                      'テキストの位置
        .FontSize = 10                      'テキストのサイズ
        .IMEMode = fmIMEModeHiragana        'IMEをひらがなに指定する
        .MultiSelect = fmMultiSelectExtended '複数選択可能
        .TabIndex = 1
        
        For i = 0 To 3 'リスト追加
        
            .AddItem MyArray(i)
        
        Next i
        
    End With

    .Show vbModeless

End With

End Sub

1つの選択されたリストの値を取得する

指定したリストボックスの値を取得する
Sub Sample1()

With UserForm1

    MsgBox .Controls("MyList").List(.Controls("MyList").ListIndex)
    
End With

End Sub

「.Controls(“MyList”).List(.Controls(“MyList”).ListIndex)」は長いので「.Controls(“MyList”).ListIndex」を数値型の変数に格納するとコードがシンプルになります。

長々としていて、わかりづらいですが、「コントロール.リストボックス.リストの選択されている番号」ということです。

複数の選択されたリストの値を取得する

複数選択されているリストを取得するには、少し工夫が必要です。

リストに登録されているテキスト数分ループして、一つずつ選択されているか判定します。

登録されているリスト数は「.Controls(“MyList”).ListCount – 1」で取得します。

「Selected(i)」で選択されているか判定します。

Trueの場合のみ取得します。

Sub Sample2()

Dim i       As Long
Dim MyStr   As String

With UserForm1

    For i = 0 To .Controls("MyList").ListCount - 1 'リスト分ループ
    
        If .Controls("MyList").Selected(i) Then '選択されているか判定
        
            MyStr = MyStr & .Controls("MyList").List(i) & vbCrLf
            
        End If
        
    Next i
    
MsgBox MyStr
    
End With
    
End Sub
タイトルとURLをコピーしました