Selección de un dato desde un listbox

Tengo un listbox el cual se completa con los datos de un combobox

Hasta ahí todo bien pero luego quiero que al dar doble click sobre alguno de los elementos del listbox se seleccione dicho elemento en la hoja, luego tome el valor de la celda ubicada en la izquierda y y eso lo lleve hasta otro lugar... Lo que me esta fallando ahora es tomar el valor de la celda en la izquierda

If Val(ListBox1.Selected(n)) = 0 Then
Range("P4").Value = ActiveCell.Offset(0, -1).Value

ElseIf Val(ListBox1.Selected(n)) = 1 Then
Range("Q4").Value = ActiveCell.Offset(0, -1).Value

ElseIf Val(ListBox1.Selected(n)) = 2 Then
Range("R4").Value = ActiveCell.Offset(0, -1).Value

ElseIf Val(ListBox1.Selected(n)) = 3 Then
Range("S4").Value = ActiveCell.Offset(0, -1).Value

ElseIf Val(ListBox1.Selected(n)) = 4 Then
Range("T4").Value = ActiveCell.Offset(0, -1).Value

ElseIf Val(ListBox1.Selected(n)) = 5 Then
Range("U4").Value = ActiveCell.Offset(0, -1).Value

ElseIf Val(ListBox1.Selected(n)) = 6 Then
Range("V4").Value = ActiveCell.Offset(0, -1).Value

ElseIf Val(ListBox1.Selected(n)) = 7 Then
Range("W4").Value = ActiveCell.Offset(0, -1).Value

ElseIf Val(ListBox1.Selected(n)) = 8 Then
Range("X4").Value = ActiveCell.Offset(0, -1).Value

ElseIf Val(ListBox1.Selected(n)) = 9 Then
Range("Y4").Value = ActiveCell.Offset(0, -1).Value

ElseIf Val(ListBox1.Selected(n)) = 10 Then
Range("Z4").Value = ActiveCell.Offset(0, -1).Value

ElseIf Val(ListBox1.Selected(n)) = 11 Then
Range("AA4").Value = ActiveCell.Offset(0, -1).Value

ElseIf Val(ListBox1.Selected(n)) = 12 Then
Range("AB4").Value = ActiveCell.Offset(0, -1).Value

ElseIf Val(ListBox1.Selected(n)) = 13 Then
Range("AC4").Value = ActiveCell.Offset(0, -1).Value

ElseIf Val(ListBox1.Selected(n)) = 14 Then
Range("AD4").Value = ActiveCell.Offset(0, -1).Value
End If

Con esa serie de if estoy tratando de hacerlo pero me falla, por ejemplo si selecciono un elemento x del listbox me arroja cualquier dato menos el que debería

1 respuesta

Respuesta
1

Cuando presionas doble click sobre un elemento del listbox, con eso tienes el número de registro seleccionado.

Por ejemplo:

Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    n = ListBox1.ListIndex
End Sub

en n tengo el número de registro del listbox seleccionado.

No entiendo para que son los If que pusiste en tu código.


Cuando le das doble click solamente puedes saber qué fila escogiste del listbox, pero no puedes saber a qué columna le diste doble click. Creo que esa puede ser la confusión.

Para entender un poco mejor.

Sin utilizar código, puedes explicar con un ejemplo, lo que necesitas.

Mira te explico tengo una lista que se va llenando desde un combobox, lo que quiero es que al seleccionar por ejemplo el primer elemento me lleve el valor de este elemento hasta una celda determinada, luego si selecciono el segundo lo mismo pero a otra celda

Aprovechando, no existirá alguna opción de auto seleccionar todos los elementos del listbox y que haga todo el proceso con solo seleccionar el elemento del combobox

Y con ejemplos, ¿cómo sería?

Es que no entiendo la relación del combo con el listbox.

Explica con ejemplos, qué datos tienes en el combo y qué datos tienes en el listbox.

Si seleccionas el dato "x" del combo, ¿qué dato quieres seleccionar del listbox? Y qué dato quieres poner en la celda y en cuál celda.

Si no me explicas con ejemplos, solamente podré estar suponiendo y no te entregaré lo que necesitas.


Por ejemplo:

Si quieres seleccionar cada uno de los elementos del listbox y ese dato ponerlo, por ejemplo, en la celda E2, y el siguiente en la celda E3:

Private Sub ComboBox1_Change()
    fila = 2
    For i = 0 To ListBox1.ListCount - 1
        dato = ListBox1.List(i, 0)
        Sheets("Hoja3").Range("E" & fila) = dato
        fila = fila + 1
    Next
End Sub

Pero es un ejemplo. Necesito saber qué necesitas exactamente, explicado con ejemplos, para entregarte la solución.

Aquí va concreto todo

Tengo esta hoja en excel

y este formulario (que se supone no debería tener el segundo combobox pero actualmente me funciona todo a la perfección con el) 

Lo que hace mi macro es que cuando selecciono un dato del combobox2 y doy click en generar grafica lleva los datos hasta donde se le indica, esto funciona a la perfección pero lo que me piden ahora es que solo seleccionando la Cadena se haga ese proceso de forma automatica

por ejemplo en mi macro luego de seleccionar la cadena (cencosud para este ejemplo) debo seleccionar la campaña en el combobox2 luego click en generar, pero tengo que hacerlo campaña por campaña

entonces no se como hacer para que haga eso mismo pero sin la necesidad de seleccionar cada campaña

aquí va lo que tengo como código y me funciona como yo quiero

Private Sub UserForm_initialize()

Range("Q4:Z6").Select

Selection.ClearContents

Dim sd As New Collection

Dim sda As New Collection

Dim celda As Range

Dim r As String

Dim uf As Integer

Application.ScreenUpdating = False

Sheets("Consolidado_de_campañas_Activas").Select

On Error Resume Next

conta = 0

ComboBox1.Clear

Sheets("consolidado_de_campañas_activas").Select

Range("G2").Select

uf = Range("M" & Rows.Count).End(xlUp).Row

r = "G2:G" & uf

For Each celda In Range(r)

sd.Add celda.Value, CStr(celda.Value)

Next celda

For Each dato In sd

ComboBox1.AddItem dato

conta = conta + 1

Next dato

On Error Resume Next

conta = 0

ComboBox2.Clear

Sheets("consolidado_de_campañas_activas").Select

Range("C2").Select

uf = Range("C" & Rows.Count).End(xlUp).Row

r = "C2:C" & uf

For Each celda In Range(r)

sda.Add celda.Value, CStr(celda.Value)

Next celda

For Each dato In sda

ComboBox2.AddItem dato

conta = conta + 1

Next dato

End Sub

Private Sub CommandButton1_Click()

    Dim n As Integer

    Sheets("Consolidado_de_campañas_Activas").Select

    u = Range("C" & Rows.Count).End(xlUp).Row

    ActiveSheet.Range("$A$1:$O$" & u).AutoFilter Field:=3, Criteria1:= _

        ComboBox2.Value

    ActiveSheet.Range("$A$1:$O$" & u).AutoFilter Field:=7, Criteria1:= _

        ComboBox1.Value

    u = Range("C" & Rows.Count).End(xlUp).Row

    If u < 2 Then

        MsgBox "No hay registros que cumplan el filtro"

    Else

        cuenta = 0

        For i = 2 To u

            If Cells(i, "M").EntireRow.Hidden = False Then

                If Cells(i, "M") = "Pendiente" Then

                    cuenta = cuenta + 1

                End If

            End If

        Next

   End If

    u = Range("C" & Rows.Count).End(xlUp).Row

    ActiveSheet.Range("$A$1:$O$" & u).AutoFilter Field:=3, Criteria1:= _

        ComboBox2.Value

    ActiveSheet.Range("$A$1:$O$" & u).AutoFilter Field:=7, Criteria1:= _

        ComboBox1.Value

    u = Range("C" & Rows.Count).End(xlUp).Row

    If u < 2 Then

        MsgBox "No hay registros que cumplan el filtro"

    Else

        cuentas = 0

        For i = 2 To u

            If Cells(i, "M").EntireRow.Hidden = False Then

                If Cells(i, "M") = "Pendiente" Or Cells(i, "M") = "Finalizada" Then

                    cuentas = cuentas + 1

                End If

            End If

        Next

    End If

                    Cells.Find(What:=ComboBox2.Value, After:=ActiveCell, LookIn _

                      :=xlFormulas, lookat:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _

                      xlNext, MatchCase:=True, SearchFormat:=False).Activate

                      y = ActiveCell.Value

                        ActiveCell.Offset(0, -1).Select

                        Z = ActiveCell.Value

        Range("P4").Select

Do Until ActiveCell = Empty

ActiveCell.Offset(0, 1).Select

If ActiveCell.Value = "" Then

ActiveCell.Value = Z

ActiveCell.Offset(-1, 0).Value = y

ActiveCell.Offset(1, 0).Value = cuenta

ActiveCell.Offset(2, 0).Value = cuentas

Else: ActiveCell.Offset(0, 1).Select

ActiveCell.Value = Z

ActiveCell.Offset(1, 0).Value = cuenta

ActiveCell.Offset(2, 0).Value = cuentas

End If

ActiveCell.Offset(0, 1).Select

Loop

ActiveSheet.Range("$A$1:$O$377").AutoFilter Field:=3

ActiveSheet.Range("$A$1:$O$377").AutoFilter Field:=7

End Sub

Ahora comentas esto:

Por ejemplo en mi macro luego de seleccionar la cadena (cencosud para este ejemplo) debo seleccionar la campaña en el combobox2 luego click en generar, pero tengo que hacerlo campaña por campaña

Pero en tu petición original decía esto:

Quiero que al dar doble click sobre alguno de los elementos del listbox se seleccione dicho elemento en la hoja


Es por eso que no estoy entendiendo la relación de lo que pides con tus macros.


Voy a hacer caso a tu última petición

Luego de seleccionar la cadena (cencosud para este ejemplo) debo seleccionar la campaña en el combobox2 luego click en generar

Pon en el siguiente código:

Private Sub ComboBox1_Change()
    If ComboBox1.Value = "" Or ComboBox1.ListIndex = -1 Then Exit Sub
    '
    For i = 0 To ComboBox2.ListCount - 1
        ComboBox2.Value = ComboBox2.List(i)
        CommandButton1_Click
    Next
End Sub

Lo que hace es, cada que selecciones un dato del combo1 (cadena), el combobox2 se va a llenar con el primer dato que tiene el mismo combo2, va a ejecutar el commandbutton1. Luego regresa y llena el combo2 con el segundo dato que tiene el combo2, va a ejecutar el commandbutton1. Regresa y pone el dato3 y así hasta poner todos los datos del combo2.


Sal u dos

Comienza a tomar forma, pero el tema es que el combobox2 puede tener varios elementos y con cada uno de esos elementos se debe ejecutar el mismo proceso 

Justamente eso hace esta parte:

    For i = 0 To ComboBox2.ListCount - 1
        ComboBox2.Value = ComboBox2.List(i)
        CommandButton1_Click
    Next

El combobox2 toma un valor y ejecuta el commandbutton1

Toma otro valor y ejecuta el commandbutton1

Y así con cada dato contenido en el combobox2


Si te falta algo deberá ser más claro con los ejemplos y las explicaciones.

En tu ejemplo solamente pusiste un dato "cencosud", pero no mencionaste nada de los datos del otro combo.


Prueba en tu form, si es lo que necesitas, no olvides valorar la respuesta

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas