How to get a listbox to return it's results into the next empty row in excel vba

∥☆過路亽.° 提交于 2019-12-25 06:31:23

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!