Quiero filtrar datos de un ComboBox a un listbox y dos Textbox

Tengo una tabla de de 12 columnas con las cual filtro a través de un Combobox en un listbox. Las columnas 11 y 12 deben ser filtradas en dos textbox correspondientes. Este es el código que he trabajado hasta el momento. Lo que intento es accionar este "filtro" con un solo Command button y que me filtre en listbox como en los dos textbox al mismo tiempo. Ya intente los dos códigos por separados y funcionan el problema viene cuando debo unificar ambos objetos (listbox y textbox) con un solo command button. Agradeciera mucho a quien me pueda ayudar con esto ya que he estado buscando información y solo encuentro como vincular un command button con un objeto a la vez, pero no dos.

Mostrar resultado en ListBox y Textbox

Private Sub CommandButton1_Click()

Aquí van los datos al textbox'

If ComboBox1 = "" Then Exit Sub
Set h = Sheets("T_APPS")
Set b = h.Range("A57:A3500").Find(ComboBox1, LookIn:=xlValues, Lookat:=xlWhole)
If Not b Is Nothing Then
TextBox1 = h.Range("L" & b.Row)
TextBox2 = h.Range("M" & b.Row)
Else
MsgBox "Not Found", vbInformation
Else If
Aqui viene los datos de listbox'
On Error GoTo Errores
If ComboBox1.Value = "" Then Exit Sub
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, 4) = Cells(i, j).Offset(0, 4)
ListBox1. List(ListBox1.ListCount - 1, 5) = Cells(i, j).Offset(0, 5)
ListBox1. List(ListBox1.ListCount - 1, 6) = Cells(i, j).Offset(0, 6)
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

Next i
Exit Sub
Errores:
MsgBox "No se encuentra", vbExclamation

Exit Sub

End Sub

2 Respuestas

Respuesta
3

Revisa mis siguientes respuestas:

Un combo y un textbox:

Userform listbox search | MrExcel Message Board

Tres textbox

populate data in listbox based on multiple textboxes instead one textbox | MrExcel Message Board

En la anterior, puedes cambiar el combo por alguno de los textbox.

Nota: Los códigos anteriores no requieren un commandbutton, el filtro se realiza en automático cuando modificas los textbox o el combo. Los códigos son más rápidos, ya que hacen la lectura de los datos en memoria.


Intenta utiliza la matriz como lo muestro en los ejemplos y como lo expliqué en el vídeo. El uso de matrices para leer datos en memoria es de las mejores prácticas en excel, esto hace más rápidos los procesos, sobre todos si utilizas grandes cantidades de registros.


Si quieres que te ayude con el código completo, pon un ejemplo de tu hoja, para qué tipos de datos tienes en las columnas que van a filtrarse.

Respuesta
2

Te dejo el código ajustado, uniendo los 2 procesos tal como solicitaste.

Private Sub CommandButton2_Click()
'si el combo se encuentra vacío, no se ejecuta
If ComboBox1 = "" Then Exit Sub
'se declaran la hoja y el rango
Set h = Sheets("T_APPS")
Set b = h.Range("A57:A3500").Find(ComboBox1, LookIn:=xlValues, Lookat:=xlWhole)
'si no encuentra el dato buscado finaliza para todos los controles
If b Is Nothing Then MsgBox "Not Found", vbInformation: Exit Sub
'Aqui viene los datos de listbox'
On Error GoTo Errores
ListBox1.Clear
j = 1
'ya se tiene la fila del registro que coincide con el valor del combobox
i = b.Row
    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, 4) = Cells(i, j).Offset(0, 4)
    ListBox1. List(ListBox1.ListCount - 1, 5) = Cells(i, j).Offset(0, 5)
    ListBox1. List(ListBox1.ListCount - 1, 6) = Cells(i, j).Offset(0, 6)
    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)
    'aquí las otras col en los textbox
    TextBox1 = h.Range("L" & b.Row)      'col 12
    TextBox2 = h.Range("M" & b.Row)      'col 13
Exit Sub
Errores:
MsgBox "No se encuentra", vbExclamation
End Sub

A continuación algunas aclaraciones porque parece que no está del todo bien tu análisis.

1- Al apartado 'Errores' ya no se llegará si no encuentra el dato buscado, porque eso se controla antes. Sí puede llegar aquí por algún problema con los controles... debieras cambiar el mensaje.

2- En el ListBox llenas las 10 primeras col del registro encontrado, es decir de las col A:J,. Luego en los TextBox van los datos de las col L y M, es decir que no estás contemplando la col K ... verifica que sea lo correcto.

3- Un ListBox permite mostrar más de una fila de datos. Del modo que estás haciendo la búsqueda solo te va a mostrar una fila. Y eso estaría bien, porque los TextBox solo pueden recibir datos de una fila por vez.

Si vas a mostrar más de un elemento filtrado, luego del primer resultado devuelto por Find, debes continuar con FindNext. Te recomiendo veas el video 23 de mi canal.

Y en ese caso necesitarás otra solución para las 2 col que te faltan... tema para otra consulta ;)

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas