问题
I have a listbox with 40 items. What I would like to achieve is to get each one that is chosen to be returned each on its separate line, with a line missing between, hence the .Row + 2
.
Example code is:
Dim LastRow As Long
Dim lItem As Long
LastRow = Worksheets(3).Range("B" & Rows.Count).End(xlUp).Row + 2
For lItem = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(lItem) And lItem = 0 Then
Worksheets(3).Range("B" & LastRow).Value = "Example1abc"
ElseIf ListBox1.Selected(lItem) And lItem = 1 Then
Worksheets(3).Range("B" & LastRow).Value = "Example2def"
ElseIf ListBox1.Selected(lItem) And lItem = 2 Then
Worksheets(3).Range("B" & LastRow).Value = "Example3ghi"
ElseIf ListBox1.Selected(lItem) And lItem = 3 Then
Worksheets(3).Range("B" & LastRow).Value = "Example4jkl"
ElseIf ListBox1.Selected(lItem) And lItem = 4 Then
Worksheets(3).Range("B" & LastRow).Value = "Example5mno"
ElseIf ListBox1.Selected(lItem) And lItem = 5 Then
Worksheets(3).Range("B" & LastRow).Value = "Example6pqr"
ElseIf ListBox1.Selected(lItem) And lItem = 6 Then
Worksheets(3).Range("B" & LastRow).Value = "Example7stu"
ElseIf ListBox1.Selected(lItem) And lItem = 7 Then
Worksheets(3).Range("B" & LastRow).Value = "Example8vwx"
ElseIf ListBox1.Selected(lItem) And lItem = 8 Then
Worksheets(3).Range("B" & LastRow).Value = "Example9yza"
ElseIf ListBox1.Selected(lItem) And lItem = 9 Then
Worksheets(3).Range("B" & LastRow).Value = "Example10bcd"
ElseIf ListBox1.Selected(lItem) And lItem = 10 Then
Worksheets(3).Range("B" & LastRow).Value = "Example11efg"
ElseIf ListBox1.Selected(lItem) And lItem = 11 Then
Worksheets(3).Range("B" & LastRow).Value = "Example12hij"
ElseIf ListBox1.Selected(lItem) And lItem = 12 Then
Worksheets(3).Range("B" & LastRow).Value = "Example13klm"
ElseIf ListBox1.Selected(lItem) And lItem = 13 Then
Worksheets(3).Range("B" & LastRow).Value = "Example14nop"
ElseIf ListBox1.Selected(lItem) And lItem = 14 Then
Worksheets(3).Range("B" & LastRow).Value = "Example15qrs"
ElseIf ListBox1.Selected(lItem) And lItem = 15 Then
Worksheets(3).Range("B" & LastRow).Value = "Example16tuv"
ElseIf ListBox1.Selected(lItem) And lItem = 16 Then
Worksheets(3).Range("B" & LastRow).Value = "Example17wxy"
ElseIf ListBox1.Selected(lItem) And lItem = 17 Then
Worksheets(3).Range("B" & LastRow).Value = "Example18zab"
ElseIf ListBox1.Selected(lItem) And lItem = 18 Then
Worksheets(3).Range("B" & LastRow).Value = "Example19cde"
ElseIf ListBox1.Selected(lItem) And lItem = 19 Then
Worksheets(3).Range("B" & LastRow).Value = "Example20fgh"
ElseIf ListBox1.Selected(lItem) And lItem = 20 Then
Worksheets(3).Range("B" & LastRow).Value = "Example21ijk"
ElseIf ListBox1.Selected(lItem) And lItem = 21 Then
Worksheets(3).Range("B" & LastRow).Value = "Example22lmn"
ElseIf ListBox1.Selected(lItem) And lItem = 22 Then
Worksheets(3).Range("B" & LastRow).Value = "Example23opq"
ElseIf ListBox1.Selected(lItem) And lItem = 23 Then
Worksheets(3).Range("B" & LastRow).Value = "Example24rst"
ElseIf ListBox1.Selected(lItem) And lItem = 24 Then
Worksheets(3).Range("B" & LastRow).Value = "Example25uvw"
ElseIf ListBox1.Selected(lItem) And lItem = 25 Then
Worksheets(3).Range("B" & LastRow).Value = "Example26xyz"
ElseIf ListBox1.Selected(lItem) And lItem = 26 Then
Worksheets(3).Range("B" & LastRow).Value = "Example27abc"
ElseIf ListBox1.Selected(lItem) And lItem = 27 Then
Worksheets(3).Range("B" & LastRow).Value = "Example28def"
ElseIf ListBox1.Selected(lItem) And lItem = 28 Then
Worksheets(3).Range("B" & LastRow).Value = "Example29ghi"
ElseIf ListBox1.Selected(lItem) And lItem = 29 Then
Worksheets(3).Range("B" & LastRow).Value = "Example30jkl"
ElseIf ListBox1.Selected(lItem) And lItem = 30 Then
Worksheets(3).Range("B" & LastRow).Value = "Example31mno"
ElseIf ListBox1.Selected(lItem) And lItem = 31 Then
Worksheets(3).Range("B" & LastRow).Value = "Example32pqr"
ElseIf ListBox1.Selected(lItem) And lItem = 32 Then
Worksheets(3).Range("B" & LastRow).Value = "Example33stu"
ElseIf ListBox1.Selected(lItem) And lItem = 33 Then
Worksheets(3).Range("B" & LastRow).Value = "Example34vwx"
ElseIf ListBox1.Selected(lItem) And lItem = 34 Then
Worksheets(3).Range("B" & LastRow).Value = "Example35yza"
ElseIf ListBox1.Selected(lItem) And lItem = 35 Then
Worksheets(3).Range("B" & LastRow).Value = "Example36bcd"
ElseIf ListBox1.Selected(lItem) And lItem = 36 Then
Worksheets(3).Range("B" & LastRow).Value = "Example37efg"
ElseIf ListBox1.Selected(lItem) And lItem = 37 Then
Worksheets(3).Range("B" & LastRow).Value = "Example38hij"
ElseIf ListBox1.Selected(lItem) And lItem = 38 Then
Worksheets(3).Range("B" & LastRow).Value = "Example39klm"
ElseIf ListBox1.Selected(lItem) And lItem = 39 Then
Worksheets(3).Range("B" & LastRow).Value = "Example40nop"
End If
Next
This clearly only returns the last one that is chosen and not the others.
What do I need to put in without making the code extremely long, like the following example??
Dim LastRow As Long
Dim lItem As Long
LastRow = Worksheets(3).Range("B" & Rows.Count).End(xlUp).Row + 2
For lItem = 0 To ListBox1.ListCount - 1
If ListBox1.Selected(lItem) And lItem = 0 Then
Worksheets(3).Range("B" & LastRow).Value = "Example1abc"
ElseIf ListBox1.Selected(lItem) And lItem = 1 Then
Worksheets(3).Range("B" & LastRow).Value = "Example2def"
ElseIf ListBox1.Selected(lItem) And lItem = 2 Then
Worksheets(3).Range("B" & LastRow).Value = "Example3ghi"
ElseIf ListBox1.Selected(lItem) And lItem = 3 Then
Worksheets(3).Range("B" & LastRow).Value = "Example4jkl"
''''''''''''''''''''''''''''''''''''''''
''' etc as above... '''
''' then for more than one selected: '''
''''''''''''''''''''''''''''''''''''''''
ElseIf ListBox1.Selected(lItem) And lItem = 1 & 2 Then
Worksheets(3).Range("B" & LastRow).Value = "Example1abc"
Worksheets(3).Range("B" & LastRow +2).Value = "Example2def"
ElseIf ListBox1.Selected(lItem) And lItem = 1 & 3 Then
Worksheets(3).Range("B" & LastRow).Value = "Example1abc"
Worksheets(3).Range("B" & LastRow +2).Value = "Example3ghi"
'''''''''''''''''
''' etcetc... '''
'''''''''''''''''
End If
Next
This would obviously be a very long and tedious way of doing it, especially with 40!
(8.1591528324789773434561126959612e+47) options!
I hope this is clear.
I have searched, but can't seem to find a similar situation elsewhere.
回答1:
if "Example1abc"
, "Example2def"
, .... are different then the values in the list themselves then you can go like follows:
Option Explicit
Private Sub CommandButton1_Click()
Dim lItem As Long
Dim sResultArr As Variant
sResultArr = Array("Example1abc", "Example2def", "Example3ghi", "Example4jkl", ...) '<--| hard code the values to be associated with list items
With Worksheets(3)
For lItem = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(lItem) Then .Cells(.Rows.Count, "E").End(xlUp).Offset(2) = sResultArr(lItem)
Next
End With
End Sub
otherwise, i.e. "Example1abc"
, "Example2def"
, .... are the values in the list themselves then you can go like follows:
Private Sub CommandButton1_Click()
Dim lItem As Long
With Worksheets(3)
For lItem = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(lItem) Then .Cells(.Rows.Count, "E").End(xlUp).Offset(2) = Me.ListBox1.List(lItem)
Next
End With
End Sub
回答2:
You dont need to harcode the list item value, you can read it like this:
Me.ListBox1.List(0)'/ Returns the first item
Private Sub CommandButton1_Click()
Dim lctr As Long
Dim lRow As Long
lRow = 1
For lctr = 0 To Me.ListBox1.ListCount - 1
If Me.ListBox1.Selected(lctr) Then
Debug.Print Me.ListBox1.List(lctr)
Worksheets("Sheet1").Cells(lRow, 2) = Me.ListBox1.List(lctr)
lRow = lRow + 2
End If
Next
End Sub
来源:https://stackoverflow.com/questions/39231029/how-to-get-a-listbox-to-return-its-results-into-the-next-empty-row-in-excel-vba