Sei sulla pagina 1di 3

Formulario para filtrar datos de una tabla en

ListBox eligiendo la columna de bsqueda en un


ComboBox en Excel
Published on 24 April, 2014 by Sergio Alejandro Campos in Bases de datos, Big Data, Excel vba

Te reto a implementar este ejemplo que les comparto en el formulario que les compart en este
otro artculo.
Hablando de este reto, ahora le comparto un formulario que nos servir para hacer filtros de una tabla
de Excel y devolver el resultado a un ListBox. Pero lo interesante es que tendremos un ComboBox el
cual se llenar con los encabezados de nuestra tabla y tendremos la opcin de nosotros elegir el campo
en el cual buscaremos datos para aplicar el filtro.

Cmo funciona
Al mostrar el formulario lo primero que har es validar que nuestro rango activo tenga ms de una celda
elegida y el ComboBox de Filtro por se llenar con los encabezados de la tabla para posteriormente
en el TextBox Buscar podamos ingresar un texto de bsqueda y nos muestre los resultados en
el ListBox de la parte inferior.

Figura 1. ComboBox que enlista los encabezados de una tabla.


Al elegir alguna opcin del resultado del filtro en el ListBox, notaremos que se activar la fila en la
tabla. Esto se hace para que funcione el otro formulario que es parte del reto.

Figura 2. Los resultados coincidentes se muestran en un ListBox.

Cdigo vba
Todo el siguiente cdigo corresponde al formulario.
'Cambia el TextBox con cada cambio en el Combo
'
Private Sub cmbEncabezado_Change()
Me.lblFiltro = "Filtro por " & Me.cmbEncabezado.Value
End Sub
'
'Cerrar formulario
Private Sub CommandButton2_Click()
Unload Me
End Sub
'
'
'Mostrar resultado en ListBox
Private Sub CommandButton5_Click()
On Error GoTo Errores
If Me.txtFiltro1.Value = "" Then Exit Sub
Me.ListBox1.Clear
Columna = Me.cmbEncabezado.ListIndex
j=1
Filas = Range("a1").CurrentRegion.Rows.Count
For i = 2 To Filas
If LCase(Cells(i, j).Offset(0, CInt(Columna)).Value) Like "*" & LCase(Me.txtFiltro1.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)
Else
End If
Next i
Exit Sub
Errores:
MsgBox "No se encuentra.", vbExclamation, "EXCELeINFO"
End Sub
'
'Activar la celda del registro elegido
Private Sub ListBox1_Click()

Range("a2").Activate
Cuenta = Me.ListBox1.ListCount
Set Rango = Range("A1").CurrentRegion
For i = 0 To Cuenta - 1
If Me.ListBox1.Selected(i) Then
Valor = Me.ListBox1.List(i)
Rango.Find(What:=Valor, LookAt:=xlWhole, After:=ActiveCell).Activate
End If
Next i
End Sub
'
'Dar formato al ListBox y traer los encabezados de la tabla
Private Sub UserForm_Initialize()
'
For i = 1 To 4
Me.Controls("Label" & i) = Cells(1, i).Value
Next i
'
With Me
.ListBox1.ColumnCount = 4
.ListBox1.ColumnWidths = "60 pt;60 pt;60 pt;60 pt"
.cmbEncabezado.List = Application.Transpose(ActiveCell.CurrentRegion.Resize(1).Value)
.cmbEncabezado.ListStyle = fmListStyleOption
End With
End Sub

Anexos

Potrebbero piacerti anche