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

29 thoughts on “Búsqueda inteligente en un formulario de Excel vba”

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

    1. 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 ?

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

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

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

  3. 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?

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

      1. 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??

  5. 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!!

    1. Martín, para abrir el formulario al iniciar Excel usa el evento Open del libro, como lo explico en este artículo http://www.exceleinfo.com/vba/ejecutar-macros-al-abrir-un-archivo-en-excel-con-el-evento-workbook_open/

      Para guardar tu resultado en una celda específica usa:

      Me.TextBox1.Value = Sheets(“Hoja1”).Range(“A1”).Value

      Y para asociarlo a un botón, guíate en este artículo http://www.exceleinfo.com/vba/ejecutar-macro-desde-un-botn-un-control-o-una-forma-en-excel-vba/

      1. Martín Borges

        Hola Sergio, gracias por tu ayuda pero no puedo funciono jaja.
        Intento hacer los pasos como el video paro no me sale. con respecto a guardar el resultado en una celda especifica es en todo el libro. Lugo para asignarla a un botón realmente no me doy cuanta, porque no es una macro. te agradezco si me das una mano, Saludos!!

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

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

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

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

  10. Orlando j S. Mejia

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

  11. Franklin Trinidad Solís

    Hola que tal, Muchas gracias por el Video tutorial en youtube Me ayudo mucho, tengo una pregunta. Como Puedo hacer o el código para copiar una fila que contenga datos que se busco a partir de TextBox1 en la “Hoja5” hacia la “Hoja1” pero en distintas celdas, por ejemplo: Se Busca un código en el “TextBox1” sea “123456” en lista del “ListBox1” al darle aceptar, este coloque la información seleccionada de la fila en la que esta el numero o valor de la “Hoja5” en la “Hoja1”, por Ejemplo “Hoja5” celda “A5”, “B5, …, ETC. a la “Hoja1” Celda “C12” = “A5”, “Hoja1” celda “E12”, “Hoja1” celda “D15”, …, ETC. le agredecia mucho la ayuda, muchas gracias.

  12. juan pablo quintanilla

    Me sale error 1004 y me manda a esta parte del codigo
    Set Lista = Range(“lstProductos”)
    Saludos JP.

    1. te manda error ahí por que ese rango no existe, lo que tienes que hacer es poner un rango tipo:

      Set Lista = Range(“A1:A2”)

      este es el rango de donde sacara la información

      1. Leo AngelHeart

        disculpa amigo, a mi me da error pero creo que es porque no sé como hacer la referencia a una tabla ubicada en otra hoja, así lo hice pero me da un “error 9”

        Set Lista = Range(Sheets(“hoja1”).ListObjects(“Base”).ListColumns(“NumInt”))

        me ayudarías por favor

  13. a mi me sale el error 1004 (No se puede obtener la propiedad VLookup de la clase de WorksheetFunction.) El tema es que me funciona bien con la mayoría de los datos de la lista, la cual modifique, pero solo con un nombre particular me da el error….yo hice que me abra otro userform después de que me pega el dato elegido….esto me pasa en distintos archivos y con nombres distintos, si sirve de dato el nombre que no me funciona en este libro en otro si…..me podrías ayudar????

    1. mario alfredo oviedo

      tenes el español, busca el similar en español, se llama si no me equivoco buscarv no me recuerdo

  14. buenos días, funciona de maravilla el código, pero lo necesito adaptar un poco, yo tengo una base de datos de nombres con un codigo de legajo, me interesa buscar por nombre pero que en la celda activa me traiga el codigo de legajo, me podrían ayudar?— ademas dejo otra pregunta, aca abre el form si se ingresa en el rango seleccionado, como puedo hacer abrir el form si quiero por ejemplo precionar un boton ejemplo F12 que abra la busqueda

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top