Búsqueda inteligente en un formulario de Excel vba
En un artículo anterior vimos cómo tener un CombBox que se autompleta para ayudar en la captura de datos. En base a ese articulo, en el video que se publicó en Youtube me hicieron una pregunta que se me hizo interesante. Me comentaban sobre la posibilidad de que, en lugar de autocompletar una lista, que sea una búsqueda en base a lo que se escribe sin importar el orden de las palabras y las letras.
Figura 1. Pregunta de un usuario en el Canal.
Fue entonces que me decidí desarrollar un ejemplo que hiciera la búsqueda como se escribe y mostrara los resultados de las palabras que contengan las letras introducidas.
Usé un formulario en el cual la búsqueda se hará mediante un TextBox. Conforme escribamos, los resultados se mostrarán en un ListBox y al darle Aceptar el valor elegido se capturará en una celda. La búsqueda se hará con los datos de una lista de PRODUCTOS.
Figura 2. Mostrar resultados conforme a lo que se escribe.
Ver el video
Diseño del formulario
Si entramos a la vista diseño del formulario notemos que es muy distinto a cuando se ejecuta desde la columna PRODUCTO. La propiedad Height (altura) es del 192, pero cuando se ejecuta el formulario se cambia a 83. Esto lo manipulamos en el evento Initialize del formulario.
Figura 2. Formulario en vista diseño.
Código vba (macros) del formulario
Código para mostrar el formulario al elegir una celda:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 'Si la celda elegida es B13:B18 se muestra el Formulario. If Not Intersect(Target, Range("B9:B14")) Is Nothing Then UserForm1.Show 'En todo caso no se muestra. Else End If End Sub
Código del formulario:
'--------------------------------------------------------------------------------------- ' Module : UserForm1 ' Author : MVP, Sergio Alejandro Campos ' Date : 19/02/2016 ' Purpose : Búsqueda "as type" '--------------------------------------------------------------------------------------- '1)Al iniciar Private Sub UserForm_Initialize() Me.Height = 83 End Sub '2)Al escribir texto en el TextBox Private Sub TextBox1_Change() If Me.TextBox1.Value = "" Or Me.TextBox1.Value = " " Then Me.Height = 83 Else Me.Height = 160 Dim rng As Range, e Set Lista = Range("lstProductos") With Me .ListBox1.Clear For Each i In Lista.Value If (i <> "") * (i Like "*" & .TextBox1.Value & "*") Then .ListBox1.AddItem i End If Next i End With End If End Sub '3)Aceptar el valor elegido y capturarlo en la celda activa Private Sub CommandButton2_Click() Cuenta = Me.ListBox1.ListCount For i = 0 To Cuenta - 1 If Me.ListBox1.Selected(i) = True Then ActiveCell.Value = Me.ListBox1.List(i) End If Next i Unload Me End Sub '4)Cerrar el formulario Private Sub CommandButton1_Click() Unload Me End Sub
Anexos
Descarga el ejemplo usado en este artículo dando click aquí.