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í.
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 ?
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.
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.
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.
Sergio, Gracias por tus ayudas. Consulta, ¿Cómo debería hacer en este caso, si la lista de datos está en otro archivo?
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
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??
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!!
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/
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!!
Gracias por la ayuda y Respuesta, cri cri
Buen aporte.
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
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!!
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.
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
muy buena explicacion, pero el ejemplo no funciona, al escribir en el textbox no selecciona nada. gracias
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.
Quien me ayuda lo ise en otro documento y me da error de compilacion no entiendo
Estimado
Baje el archivo y no anda!!!!
Algo se debe haber roto
Saludos
Me sale error 1004 y me manda a esta parte del codigo
Set Lista = Range(“lstProductos”)
Saludos JP.
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
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
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????
tenes el español, busca el similar en español, se llama si no me equivoco buscarv no me recuerdo
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
Permitame saludarlo, a la vez decirle que sus aportes son muy buenos, bastante utiles.