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

You may also like...

  • Adolfo Fernández

    Buenos días Sergio,
    Me he bajado el archivo pero no me funciona. Cuando me sitúo sobre las celdas si me salta el formulario, pero al escribir palabras no me aparece nada, y que conste que he puesto palabras de la lista.
    Por otro lado el tamaño del formulario inicial es un poco mas grande de lo que debería ser y cuando se agranda no se ve completamente. Esto lo puedo cambiar directamente en las propiedades, pero ya que estaba te lo comento.

    Muchas gracias por todo el tiempo y esfuerzo que dedicas a compartir con los demas tantos conocimientos de excel.

    Un saludo

    • Hola. Con respecto a los nombres, éstos deben ser coincidentes en mayúsculas y minúsculas que te encuentre los nombres. Y en el tema del formulario, no será que todavía no usas Windows 10 ?

      • Adolfo Fernández

        Correcto, era por las ·”%&@ mayusculas, jajajjaja
        Lo del formulario no me preocupaba mucho, pero tienes razon y no utilizo windows 10, estoy en windows 7 y excel 2010.

        Muchisimas gracias.

        • Adolfo Fernández

          Sin animo de estropear tu codigo y por si le puede servir a alguien, le he añadido las siguientes líneas en el Private Sub TextBox1_Change() para que me transforme todo a mayúsculas y así evitarme el problema de si esta en mayúsculas o minúsculas. Las lineas son:

          TextBox1.Text = UCase(TextBox1.Text)

          TextBox1.SelStart = Len(TextBox1)

          El resto de código quedaría igual.
          Supongo que habrá otras formas mucho mejores de hacer lo mismo, pero bueno, esto funciona.

  • Juan Jose CastilIo C

    Estimado, gracias por compartir.

    Esta es mi duda y no sé como solucionarlo.

    Como poner 2 formulario de búsqueda de diferentes datos cada uno en la misma hoja. Un formulario es para me muestre una celda en especifica y otro formulario es un rango.

  • Rodrigo Antonio Muñoz Lobos

    Sergio, Gracias por tus ayudas. Consulta, ¿Cómo debería hacer en este caso, si la lista de datos está en otro archivo?

  • Andres Arias Ceron

    BUENAS TARDES, MUY BUEN APORTE, ES SENCILLO Y FACIL DE USAR, UNA PREGUNTA, COMO PODEMOS USAR ESTE FILTRO PERO QUE TRAIGA UNA LISTBOX EN COLUMNAS, POR EJEMPLO: TENGO UNA TABLA “CONSULTA” EN LA CUAL VIENEN LOS DATOS DE UN PRODUCTO, EN LA MISMA TABLA VIENEN DATOS DE PRECIOS Y EXISTENCIAS; AQUI HAY DOS OPCIONES NO SE CUAL SEA LA MAS FACIL, UNA TENGO REPARTIDAS EN LAS HOJAS LOS PRECIOS Y LAS EXISTENCIAS, PARA CADA LISTA TIENE UN NOMBRE EN “PRODS”, “EX”, “PRECIO”, A PARTIR DEL FILTRADO INICIAL EN “PRODS”, EN EL LIST BOX APAREZCA EN COLUMNAS Y LA COLUMNA PRINCIPAL LLAME EL FILTRADO, PERO MUESTRE DENTRO DEL LISTBOX EN LAS DOS COLUMNAS SIGUIENTE EL PRECIO Y LA EXISTENCIA.

    • Qué tal Andrés.

      Anteriormente he publicado otros ejemplos donde uso ListBox. Por favor revisa en el este link: http://www.exceleinfo.com/?s=listbox

      • Andres Arias Ceron

        hola sergio gracias, ya he revisado los archivos, sin embargo tengo el problema que los archivos que existen de varias columnas solo seleccionan el dato y te lo muestran.

        mi tema es el siguiente a partir de este ejemplo, tengo una tabla con datos de producto, existencia y precio; la lista es de 6000 productos aproximadamente, primero el codigo aplica sobre el valor de la primer columna, intente agregar mas columnas al listbox mediante “.ListBox1.ColumnCount = 3”, y les di un ancho a cada columna con “.ListBox1.ColumnWidths = ” 160 pt; 30 pt; 30pt”, todo esto dentro del “with Me”; sin embargo, los datos de las otras dos columnas no las muestra o las muestra en blanco, he intentado agregarlo mediante el Rowsource pero 0, me carga todo pero no me deja agregar items, y en los otros ejemplos solo me agrega filas pero no me agrega columnas, me podrias apoyar??

  • Martín Borges

    Buenas tardes, yo lo utilizo para búsqueda de cliente, les consulto como puedo hacer para que se inicie al abrir mi Excel y me guarde el resultado en una celda especifica. y lo otro como puedo asociarlo a un botón para iniciarlo en cualquier momento. muchas gracias!!

  • Gabriel

    Buen aporte.

  • Paulo Rezzio

    Hola Buenos días Sergio, Estupendo Buscardor, muy práctico y, sobre todo, fácil de implementar en cualquier proyecto. En mi caso, lo he implementado en mi proyecto con Formularios, el problema me ha venido cuando he querido djar de lado las hojas de excel y pasar toda la info a una BD Access y utilizar Excel solo para vistas, bien al tema, como puedo enlazar la búsqueda hacia un campo concreto de una tabla de Access, se que ha de hacerse en esta linea:

    Set Lista = Range(“lstProductos”)

    pero en vez de usar un rango de Excel, Usar un “Select Campo FROM Tabla” para mostrar los datos de ese campo de dicha tabla. espero haberme explicado correctamente, si puedesecharme un cable te lo agradecería, saludos
    Paulo Rezzio

  • FELIPE PATRICIO VILLASECA VEGA

    Muchísimas gracias por tu tiempo!

    Tengo una duda que no he podido resolver en ninguna parte:

    Quisiera hacer lo mismo que hiciste con tu listbox, es decir, mostrar los resultados de acuerdo a los datos que incorpores en el textbox, pero todo con un combobox que está dentro de un formulario.

    Es decir, tengo un formulario con muchos campos, donde tengo un combobox que despliega información de una lista asignada con el administrador de nombres y quisiera que en ese combobox se vayan mostrando las coincidencias aproximadas de acuerdo a la data que vaya ingresando.

    Espero puedas responderme, muchísimas gracias!!

  • Gerardo Mujica Arevalo

    Que tal, excelente tutorial.. Cómo puedo lograr que la barra del titulo del form cambie de color al momento de la ejecución del formulario?? por ejemplo así como lo muestras tú en Azul.
    Gracias, saludos.

  • opadrino

    Hola, excelente tutorial, me gustaría preguntarte como se pueden utilizar 2 o más Combox, para simplificar la búsqueda.
    Al tener esta parte: Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ¿Cómo se podría hacer?
    Muchas gracias por tú tiempo.
    Saludos

  • Orlando j S. Mejia

    muy buena explicacion, pero el ejemplo no funciona, al escribir en el textbox no selecciona nada. gracias