web-dev-qa-db-ja.com

Excelのスプレッドシートのリストボックスから値を取得するVBA

ExcelブックのSheet1にListBox1という名前のリストボックスがあります。

ユーザーがリスト内のアイテムの1つを選択するたびに、その名前をstrLBという変数にコピーする必要があります。

したがって、Value1、Value2、Value3、Value4があり、ユーザーがValue1とValue3を選択した場合、strLBがValue1、Value3として出力される必要があります。とても簡単です。

私はそれをやってみましたpost hoc

For i = 1 To ActiveSheet.ListBoxes("ListBox1").ListCount
    If ActiveSheet.ListBoxes("ListBox1").Selected(i) Then strLB = strLB & etc.etc.
Next i

しかし、これは非常に遅いです(実際、リストボックスには15,000個の値があります)。これが、ユーザーが入力を完了した後、サイクルではなくリアルタイムで選択を記録する必要がある理由です。

もちろん、ユーザーが前の選択を削除したかどうかを確認する方法も必要です。

皆さんが助けてくれることを願っています!!

13
Bruder

残念ながら、MSFormsリストボックスでは、リストアイテムをループしてSelectedプロパティをチェックすることが唯一の方法です。ただし、これは別の方法です。選択したアイテムを変数に保存/削除しています。リモートセルでこれを実行し、追跡できます:)

Dim StrSelection As String

Private Sub ListBox1_Change()
    If ListBox1.Selected(ListBox1.ListIndex) Then
        If StrSelection = "" Then
            StrSelection = ListBox1.List(ListBox1.ListIndex)
        Else
            StrSelection = StrSelection & "," & ListBox1.List(ListBox1.ListIndex)
        End If
    Else
        StrSelection = Replace(StrSelection, "," & ListBox1.List(ListBox1.ListIndex), "")
    End If
End Sub
12
Siddharth Rout

ユーザーが行を選択解除した場合、リストはそれに応じて更新されないため、受け入れられた回答はそれを削減しません。

代わりに私が提案するものは次のとおりです。

Private Sub CommandButton2_Click()
    Dim lItem As Long

    For lItem = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(lItem) = True Then
            MsgBox(ListBox1.List(lItem))
        End If
    Next
End Sub

礼儀 http://www.ozgrid.com/VBA/multi-select-listbox.htm

リストボックスの選択されたアイテムの値を取得するには、次を使用します。

単一列のリストボックスの場合:ListBox1.List(ListBox1.ListIndex)

複数列のリストボックスの場合:ListBox1.Column(column_number, ListBox1.ListIndex)

これにより、ループが回避され、非常に効率的になります。

0
matt2405

選択した値を取得:

worksheet name = ordls
form control list box name = DEPDB1

selectvalue = ordls.Shapes("DEPDB1").ControlFormat.List(ordls.Shapes("DEPDB1").ControlFormat.Value)
0
Alex