Tengo un cuadro de lista con 40 elementos. Lo que me gustaría lograr es que cada uno que se elija se devuelva en su línea separada, con una línea que falta entre, de ahí el .Row + 2.

El código de ejemplo es:

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

Esto claramente solo devuelve el último que se elige y no los demás.
¿Qué necesito poner sin hacer que el código sea extremadamente largo, como el siguiente ejemplo?

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

Obviamente, esta sería una forma muy larga y tediosa de hacerlo, especialmente con las opciones 40! (8.1591528324789773434561126959612e + 47).
Espero que esto quede claro.

He buscado, pero parece que no puedo encontrar una situación similar en otro lugar.

0
StanB 30 ago. 2016 a las 18:02

2 respuestas

La mejor respuesta

Si "Example1abc", "Example2def", .... son diferentes a los valores en la lista, entonces puede hacer lo siguiente:

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 

De lo contrario, es decir, "Example1abc", "Example2def", .... son los valores en la lista ellos mismos, entonces puede ir de la siguiente manera:

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
1
user3598756 30 ago. 2016 a las 15:35

No necesita codificar el valor del elemento de la lista, puede leerlo así:

 Me.ListBox1.List(0)'/ Returns the first item

Privado 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
2
cyboashu 30 ago. 2016 a las 15:14