Búsqueda inteligente en un formulario de Excel vba

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.

Comentario en Youtube

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.

Búsqueda as type en Excel

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.

Búsqueda inteligente en un formulario de Excel vba

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í.

También te podría gustar...