Tengo este listbox en VBA pero no carga los datos filtrados del ComboBox

Tengo este ListBox que quiero que cargue los datos filtrados de mi ComboBox. Cuando doy click en Search, los datos no cargan al ListBox. Los datos provienen de una tabla y comienzan en la fila A57. Ya he probado varias veces cambiando el código la parte donde determino donde empieza el rango a56 pero aun así no funciona. La única forma que funciona es colocando la tabla en el rango a1, y empezar a contar desde ahí. Pero no quiero eso, ya que ahí tengo otra información que utilizo para el dashboard.

Este es el código del ListBox . Muchas gracias de antemano a quien pueda ayudar.

'Mostrar resultado en ListBox
Private Sub CommandButton1_Click()
On Error GoTo Errores
If Me.ComboBox1.Value = "" Then Exit Sub
Me.ListBox1.Clear
j = 1
Filas = Range("a56").CurrentRegion.Rows.Count
For i = 57 To Filas
If LCase(Cells(i, j).Offset(0, 0).Value) Like "*" & LCase(Me.ComboBox1.Value) & "*" Then
Me.ListBox1.AddItem Cells(i, j)
Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = Cells(i, j).Offset(0, 1)
Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = Cells(i, j).Offset(0, 2)
Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = Cells(i, j).Offset(0, 3)
Me.ListBox1.List(Me.ListBox1.ListCount - 1, 7) = Cells(i, j).Offset(0, 7)
Me.ListBox1.List(Me.ListBox1.ListCount - 1, 8) = Cells(i, j).Offset(0, 8)
Me.ListBox1.List(Me.ListBox1.ListCount - 1, 9) = Cells(i, j).Offset(0, 9)
Else
End If
Next i
Exit Sub
Errores:
MsgBox "No se encuentra.", vbExclamation
End Sub

2 Respuestas

Respuesta
3

[Ho la Ariel Linarte y bienvenido a TodoExpertos!

Veo que estás interesado en aprender a programar en VBA, tal vez te interese ver el siguiente vídeo:

Macro Cargar Listbox con Matriz - YouTube

Te invito a suscribirte a mi canal y a activar las alertas para que recibas las notificaciones de los siguientes vídeos!

Respuesta
4

No se acumulan en la lista porque cada vez que presionas el botón, limpias la lista. Retirá esa línea y probalo nuevamente.

Private Sub CommandButton1_Click()
On Error GoTo Errores
If Me.ComboBox1.Value = "" Then Exit Sub
    'Me.ListBox1.Clear
j = 1
Filas = Range("a56").CurrentRegion.Rows.Count
For i = 57 To Filas
    If LCase(Cells(i, j).Offset(0, 0).Value) Like "*" & LCase(Me.ComboBox1.Value) & "*" Then
        Me.ListBox1.AddItem Cells(i, j)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 1) = Cells(i, j).Offset(0, 1)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 2) = Cells(i, j).Offset(0, 2)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 3) = Cells(i, j).Offset(0, 3)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 7) = Cells(i, j).Offset(0, 7)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 8) = Cells(i, j).Offset(0, 8)
        Me.ListBox1.List(Me.ListBox1.ListCount - 1, 9) = Cells(i, j).Offset(0, 9)
    End If
Next i
Exit Sub
Errores:
MsgBox "No se encuentra.", vbExclamation
End Sub

PD) si solo habrá un Userform abierto no es necesario agregar la palabra ME. Se entiende que es un control de ese formulario.

Sdos.

Elsa

* Los invito a visitar la sección Manuales de mi sitio... acabo de publicar el Manual 500Macros+365 (revisión y actualización completa del manual 500Macros incluyendo código apto para la versión Excel 365 + nuevos capítulos). Imperdible!

Ya retire esta línea, pero aun así no hace me lleva los resultados al Listbox. La única manera en que he logrado que muestre los resultados en el Listbox es llevando la tabla al rango A1, pero eso es lo que no quiero. También le quite el Me al Listbox y nada aun.

'Me.ListBox1.Clear

Adjunto el código donde formateo el Listbox con el evento Initialize. Lo que quiero hacer es que el dato que me carga en el ComboBox pasarlo al Listbox, para solo seleccionarlo y así ir directamente a esa línea para verlo o modificarlo en la tabla de Excel. La tabla inicia en el A56, quiero que me aparezcan 6 columnas en el listbox de la info que busco con el ComboBox.

'
'Dar formato al ListBox y traer datos de la tabla
Private Sub UserForm_Initialize()
For i = 1 To 6
Next i

With ListBox1
.ColumnCount = 6
.ColumnWidths = "60 pt;74 pt;100 pt;60 pt;100 pt;105 pt"
End With
End Sub

Como no comentaste cómo se rellena el combobox ni cómo se filtra, en mi ejemplo el combo se llena desde la propiedad RowSource (también podría ser que lo rellenes con ese bucle For... Next que por el momento aparece vacío en el evento Initialize).

Y por el momento, el Listbox se rellena con el item seleccionado en el combo. Lo dejo en el botón de comando que ya tenías, pero bien puede ser en el evento Exit del combo.

Además de quitarle la línea que limpia la lista, también debes ajustar la variable Fila (la 1ra vez también recree tu modelo a partir de fila 1 por eso no observé el error).

Si tu rango inicia en fila 56 debes sumar 55 al total de filas que te devuelve CurrentRegion.

Y así quedaría la macro:

'Mostrar resultado en ListBox
Private Sub CommandButton1_Click()
On Error GoTo Errores
If ComboBox1.Value = "" Then Exit Sub
    'Me.ListBox1.Clear
j = 1
Filas = Range("a56").CurrentRegion.Rows.Count + 55
For i = 57 To Filas
    If LCase(Cells(i, j).Offset(0, 0).Value) Like "*" & LCase(ComboBox1.Value) & "*" Then
        ListBox1. AddItem Cells(i, j)
        ListBox1. List(ListBox1.ListCount - 1, 1) = Cells(i, j).Offset(0, 1)
        ListBox1. List(ListBox1.ListCount - 1, 2) = Cells(i, j).Offset(0, 2)
        ListBox1. List(ListBox1.ListCount - 1, 3) = Cells(i, j).Offset(0, 3)
        ListBox1. List(ListBox1.ListCount - 1, 7) = Cells(i, j).Offset(0, 7)
        ListBox1. List(ListBox1.ListCount - 1, 8) = Cells(i, j).Offset(0, 8)
        ListBox1. List(ListBox1.ListCount - 1, 9) = Cells(i, j).Offset(0, 9)
    Else
    End If
Next i
Exit Sub
Errores:
MsgBox "No se encuentra.", vbExclamation
End Sub

Recomendación: Como verás, insisto en no utilizar Me. cuando se trata de un único formulario. Es como decirle al código: Trabajá con mi lista y con mi combo.... no da error, solo es como redundante. El problema está en que si se acostumbran a usar siempre Me., cuando tengan 2 formularios abiertos también le pondrán Me. a los 2 y ahí empezarán los errores ;) 

También te invito a mirar el video N° 36: Filtro dinámico utilizando un Userform... allí, alrededor del minuto 1:40 se explica cómo mostrar una lista filtrada a medida que se escribe o selecciona desde otro control.

Sdos!

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas