viernes, 4 de septiembre de 2020

Filtros dinámicos con VBA, utilizando Userform

En el video anterior (N° 34) vimos cómo realizar una búsqueda dinámica directamente desde la hoja, utilizando Filtros Avanzados.

Hoy vamos a seguir con el tema, pero en esta ocasión utilizando un formulario o Userform.

En esta entrega encontrarán 2 ejemplos y en ambos el resultado de la búsqueda se muestra en un control ListBox.

Ejemplo 1: Desde un control TextBox se ingresará el texto a buscar en TODA la hoja, no importando en qué columna se encuentre. El resultado se irá mostrando en el control Lista.  La búsqueda se realiza de modo parcial, es decir que las celdas deben contener el texto buscado.  

Además este modelo presenta un control Combobox para realizar búsqueda por Nombre completo. A medida que se van registrando las letras se filtrará la lista.


En este formulario programamos 3 eventos. Initialize (o sea al iniciar el formulario), TextBox_Change y ComboBox_Change en el caso de que además del control TextBox se cuenta con un desplegable también.

Ejemplo 2: En este modelo se utilizarán tantos controles TextBox como criterios tengamos para la búsqueda. Cada control corresponderá a una columna de la tabla. El resultado se irá mostrando en el control Listbox de modo filtrado. Los criterios se solicitan como: contenido en celdas de col A y C y coincidencia total con la columna B. 


Tanto en la apertura del formulario (evento Initialize) como desde el botón 'Limpiar' (CommandButton1_Click), se mostrará la lista completa en el control ListBox. 

El resto del código será para los 3 controles TextBox (evento Change) o la cantidad que tenga el formulario. Cada uno de estos eventos, luego de filtrar el rango correspondiente según su columna, llama a una macro común para el llenado del ListBox.

Los criterios para las columnas A y C se buscan de modo parcial, como parte del contenido de las celdas. En cambio para la columna B la coincidencia debe ser total.

Por ejemplo, para el primer TextBox:

Private Sub TextBox11_Change()
If TextBox11 <> "" Then
dato1 = "*" & TextBox11.Value & "*"         
Range("$A$3:$G$" & Range("A" & Rows.Count).End(xlUp).Row).AutoFilter Field:=1, Criteria1:=dato1, Operator:=xlAnd
Else
ActiveSheet.Range("$A$3:$G$" & Range("A" & Rows.Count).End(xlUp).Row).AutoFilter Field:=1
End If
Call llenalista
End Sub

Sub llenalista()
ListBox1.Clear
x = Range("A" & Rows.Count).End(xlUp).Row
If x < 4 Then Exit Sub
For Each cd In Range("A4:A" & x).SpecialCells(xlCellTypeVisible)
ListBox1.AddItem cd.Value
i = ListBox1.ListCount - 1
ListBox1.List(i, 1) = Range("B" & cd.Row)
ListBox1.List(i, 2) = Range("C" & cd.Row)
Next cd
End Sub

 

Ver VIDEO 36.

Desde el siguiente enlace se puede descargar el libro con la programación de los ejemplos, tanto del video 35 como del 36:

http://aplicaexcel.com/Blog/FiltroAvanzado.xlsm