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個の値があります)。これが、ユーザーが入力を完了した後、サイクルではなくリアルタイムで選択を記録する必要がある理由です。
もちろん、ユーザーが前の選択を削除したかどうかを確認する方法も必要です。
皆さんが助けてくれることを願っています!!
残念ながら、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
ユーザーが行を選択解除した場合、リストはそれに応じて更新されないため、受け入れられた回答はそれを削減しません。
代わりに私が提案するものは次のとおりです。
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
リストボックスの選択されたアイテムの値を取得するには、次を使用します。
単一列のリストボックスの場合:ListBox1.List(ListBox1.ListIndex)
複数列のリストボックスの場合:ListBox1.Column(column_number, ListBox1.ListIndex)
これにより、ループが回避され、非常に効率的になります。
選択した値を取得:
worksheet name = ordls
form control list box name = DEPDB1
selectvalue = ordls.Shapes("DEPDB1").ControlFormat.List(ordls.Shapes("DEPDB1").ControlFormat.Value)