Hojas de cálculo en Excel - página principal

Creando nuestro propio buscador

Muchas veces, si queremos buscar varios valores en una hoja de cálculo, a través del propio buscador de Excel (menú Edición, y luego Buscar...), tenemos el problema de que por defecto, nos devuelve la primera coincidencia con la que se encuentra. Si le decimos que nos busque todo, pulsando el botón correspondiente de la ventana que se nos muestra en la búsqueda, nos localiza todas las celdas que tengan ese patrón de búsqueda coincidente.

Si queremos obtener el mismo resultado que con el buscador de excel, pero de una forma más personalizada, remarcando el texto o los valores de las celdas cuyos datos coinciden con nuestra búsqueda, he aquí un macro donde deberemos informar de lo siguiente:

1. Nos pregunta cual es la celda inicial, a partir de la cual realizaremos la búsqueda (será la celda superior izquierda del rango de datos).

2. Nos pregunta cual es la celda final, donde finalizará la búsqueda (será la celda inferior derecha del rango de datos).

3.- Nos pregunta el valor o dato a buscar.

4. Nos pregunta donde queremos empezar a escribir las referencias de las celdas donde ha encontrado los datos (debe ser una celda fuera del rango comprendido entre la celda inicial y la celda final).

5. Nos pregunta si deseamos encontrar el dato de forma exacta, o si por el contrario deseamos encontrar cualquier celda que contenga parte de ese texto buscado. por ejemplo, si buscamos la palabra moto y le decimos que queremos encontrar el dato exacto, solo nos buscará las celdas que contengan la palabra moto, pero si le decimos que haga una búsqueda que no sea exacta, también nos encontrará las celdas que contengan por ejemplo la palabra motor.

Aquí os dejo el macro que tendréis que pegar en un módulo (ya se que en lugar de utilizar InputBox's, visualmente es mucho más atractivo el uso de UserForm's, pero la finalidad de este macro es otra, ya que deseamos crear una sencilla utilidad):


Sub buscar_cosas()
On Error Resume Next
Application.ScreenUpdating = False
donde_estamos = ActiveCell.Address
'--------------------------------------
'Hacemos las preguntas de rigor

celda_inicial = InputBox("¿Cuál es la celda inicial, donde quieres empezar a buscar?", "Pregunta")
celda_final = InputBox("¿Cuál es la celda final, donde quieres parar a buscar?", "Pregunta")
valor_buscado = InputBox("Introduce el valor, dato, o texto que deseas buscar:", "Dato a buscar")
mostrar_datos = InputBox("Venga, no te duermas, que ya acabo con las preguntas..." & _
Chr(10) & Chr(10) & "¿A partir de qué celda quieres que te muestre las referencias " & _
"de las celdas donde están los datos encontrados?." & Chr(10) & Chr(10) & "(Debe estar " & _
"fuera del rango de la búsqueda)", "Pregunta")
exacitud = MsgBox("¿Deseas encontrar el dato exactamente, tal y como lo escribiste?", vbYesNo)
If Trim(valor_buscado) = "" Then Exit Sub
'--------------------------------------
'pasamos los datos a variables

min_fila = Range(celda_inicial).Row
max_fila = Range(celda_final).Row
min_columna = Range(celda_inicial).Column
max_columna = Range(celda_final).Column
'nos situamos en la primera celda
Range(celda_inicial).Select
'comenzamos a buscar el dato
For i = min_fila To max_fila
For j = min_columna To max_columna
If exacitud = vbYes Then
'Sí buscamos el dato exacto
If ActiveCell.Value = Trim(valor_buscado) Then
'ponemos el dato en color rojo
Selection.Font.ColorIndex = 3
'guardamos la referencia donde se encuentra el dato
celdas_datos = celdas_datos & "," & ActiveCell.Address
End If
Else
'No buscamos el dato exacto
If InStr(ActiveCell.Value, valor_buscado) > 0 Then
'ponemos el dato en color rojo
Selection.Font.ColorIndex = 3
'guardamos la referencia donde se encuentra el dato
celdas_datos = celdas_datos & "," & ActiveCell.Address
End If
End If
ActiveCell.Offset(0, 1).Select
Next
ActiveCell.Offset(1, -max_columna).Select
Next
'quitamos la coma inicial del array de referencias
celdas_datos = Mid(celdas_datos, 2, Len(celdas_datos))
'ahora reemplazamos la referencia absoluta
celdas_datos = Replace(celdas_datos, "$", "")
'mostramos las referencias de las celdas
Range(mostrar_datos) = "Los datos encontrados están en: " & celdas_datos & ", es decir, aquí:"
'bajamos una fila
nuevos_datos = Range(mostrar_datos).Offset(1, 0).Address
Range(nuevos_datos).Select
'descomponemos el array
celdas = Split(celdas_datos, ",")
For i = 0 To UBound(celdas)
'ponemos la celda en cuestión
ActiveCell = celdas(i)
ActiveCell.Offset(1, 0).Select
Next
'Ordenamos el rango de datos con las referencias
Range(nuevos_datos).Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Sort Key1:=Range(nuevos_datos), Order1:=xlAscending
'nos situamos en la celda donde estábamos
Range(donde_estamos).Select
Application.ScreenUpdating = True
End Sub

Este es un ejemplo de lo que obtendríamos para la búsqueda de la palabra moto, y diciéndole que la búsqueda no sea exacta (si le hubiésemos dicho que queríamos una búsqueda exacta, solo habríamos obtenido como resultado, la palabra moto, y no aquellas palabras que contienen esa palabra, como es el caso de motor y motos):


Solo comentaros que una vez realizada la primera búsqueda, si queréis volver a realizar otra búsqueda, deberéis poner todo el texto encontrado en la primera búsqueda, nuevamente con su color original (por defecto, el negro), porque las búsquedas posteriores no reemplazan los colores rojos por sus colores iniciales. Aunque se podía haber hecho, he desestimado volver a poner sus colores originales, pues en una segunda búsqueda el rango de datos donde vamos a buscar, no tiene porqué coincidir con el de la primera búsqueda realizada.



86 comentarios:

Anónimo dijo...

hola amigo, muy bueno tu aporte, bueno mi pregunta es si podrias ayudarme a realizar las siguientes modificaciones a tu buscador, con el fin de implementarlo en mis reportes, pues bien lo que necesitaria seria realizar la busqueeda en un rango especifico sin pedir la entrade de la celda incial y final, a su vez, establecer la celda conde se mostraran los datos en el mismo codigo (para que no aparesca el mensaje) y por ultimo en vez de colocar la reeferencia a la celda....si poddria mostrar el dato que contiene la celda. en verdad te agradeceria mucho tu ayuda ya que no estoy muy metido en esto de las macros...

gracias nuevamente....

Edu

El pilt®afilla - www.3piesalgato.com dijo...

Los cambios son muy sencillos de realizar, pero como veo que no te manejas mucho con macros, te he dejado aquí una hoja de cálculo con lo que buscabas (para descargarla, deberás poner los 3 caracteres alfanuméricos que te aparecerán): http://www.megaupload.com/es/?d=6MTKF8BW

Es preferible que la descargues a tu disco duro porque si abres la hoja de cálculo desde internet, igual no funciona correctamente. Una vez abierto el fichero, cuando entres en modo VBA (ya sabes, Alt+F11), encontrarás el código en el apartado de Módulos. En las primeras líneas del código, verás 3 celdas y cuyas referencias debes cambiar, pues corresponden a la celda inicial (A1 en el ejemplo), celda final (A7 en el ejemplo), y la celda donde se mostrarán los resultados (A10 en el ejemplo).

Espero que te sirva. Un saludo.

Anónimo dijo...

hola nuevamente amigo...pues te contare que implemente la macro en mi hoja de calculo y funciona muy bien...ahora, si fueras tan amable...solo me faltaria una cosita... como hago si quisiera en vez de mostrar la celda que ha encontrado, quisiera mostrar la celda que esta a su derecha (algo asi como el buscarv), lo que sucede es que necesito buscar en una tabla todas las coincidencias con el criteriod e busqueda y mostrar no solo ls coincidencias, como lo hace la macro que me brindaste, si no tambien el codigo que aparece a su derecha...como sabes, buscarv solo encuentra el primero pero no muestra las demas coincidencias, y con esta macro ya estaria resuelto mi problema..

gracias nuevamente por tu ayuda

Edu

El pilt®afilla - www.3piesalgato.com dijo...

Si en lugar de mostrar el valor encontrado en la celda, quieres mostrar el valor que aparece en la celda de la derecha, en el ejemplo que colgué en megaupload, cambia estas líneas donde pone...

'ponemos la celda en cuestión
ActiveCell = Range(celdas(i)).Value

Y pon estas otras:

'ponemos la celda de la derecha
ActiveCell = Range(celdas(i)).Offset(0, 1).Value

Si por el contrario, quieres que aparezca la celda con la palabra buscada y además quieres que a su derecha salga también el valor encontrado y que figura en la columna de la derecha, cambia aquella línea inicial y pon esto otro:

'ponemos la celda en cuestión
ActiveCell = Range(celdas(i)).Value
'ponemos la celda de la derecha
ActiveCell.Offset(0, 1) = Range(celdas(i)).Offset(0, 1).Value

Salu2

Unknown dijo...

Hola. muy bueno tu buscador, y tu blog. Funciona igual el macro en Excel 207? lo he probado en un rango pequeño, de 10 filas, pero el resultado solo me da 1 celda, aun sabiendo que por o menos hay 3 mas con el mismo valor. Intente encontrar lo que ocurre por mi mismo, pero no :( Gracias

El pilt®afilla - www.3piesalgato.com dijo...

Hola tocayo. Gracias por tu comentario.

Pues en principio debería funcionar correctamente, porque da lo mismo la versión para la que trabaje el macro. La verdad es que no tengo todavía instalada la versión 2007, así que no puedo testear su funcionamiento.

Bájate el ejemplo que colgué en http://www.megaupload.com/es/?d=6MTKF8BW, cuando le di respuesta a otro usuario que quería implementar algunos cambios, y me cuentas como te va.

Salu2

Unknown dijo...

Javier, hace dias estaba buscando algo asi, pero lo mas acertado es lo tuyo, gracias por el aporte.
Pero..... no me sirve. me podras colaborar con esto???

Necesito una macro que haga lo mismo que CRTL + B, Pero que al seleccionar lo que necesito me coloque ese dato en otra celda.

Me explico mejor....

Ejemplo tengo 2 dos columnas, A1 "Codigo" y A2 "Producto". Son 20000 filas. (si, 20000 filas), Quiero hacer una busqueda en A2, introduciendo un trozo de texto, por ejemplo el producto a buscar es: TRIS(HIDROXIMETIL) AMINOMETANOCLORHIDRATO PARA ANALISIS, como observas el nombre es complicado de escribir, por lo que necesito buscarlo con un trozo del nombre, o sea, "aminometano", pueden haber muchas otras concidencias por lo que me las debe mostrar todas, para yo elegir la correcta (tiene que coincidir tanto en mayusculas como en minusculas). Una vez elegida, en otra celda puede ser la C1 debe de colocar el valor corespondiente al codigo, o sea, A?=C1, Luego debe preguntarme si deseo hacer otra busqueda o finalizar. si hago otra busqueda debe hacer lo mismo y colocar el otro valor en la celda C2, y asi sucesivamente hasta que termine.

Yo se que debes tener muchas otras cosas que hacer, si no tenes tiempo para esto, no hay problema, pero te agradeceria mucho una respuesta.

El pilt®afilla - www.3piesalgato.com dijo...

Hola Valeria.

Bájate este fichero a ver si era lo que buscabas: http://www.megaupload.com/es/?d=NIR757ZS

Un saludo.

Anónimo dijo...

Buenas tardes he tratado de encontrar ayuda por internet y este ha sido el unico sitio que me ha parecido genial, de verdad un grandioso saludo para el equipo y espero me puedan ayudar ya que soy neofito con el exel, mi consulta es la siguiente:

tengo en un libro de exel, llamado Facturación en el cual tengo mas de 4500 facturas en hojas diferentes dentro de este claro esta, me gustaría hacer una hoja nuevo dentro de este con un buscador, que yo le diga que me busque la factura #382 y me abra la hoja donde esta la factura 382, eso es posible, gracias.

El pilt®afilla - www.3piesalgato.com dijo...

Hola que tal...

Te puedo dar una pista de por done irían los tiros.

Haz lo mismo que en este artículo, pero crétate un bucle "for", para que haga la búsqueda primero en una hoja, cuando haya acabado, si no ha encontrado nada, que avance a la siguiente hoja, y que busque. Si no encuentra nada, que vaya a la siguiente, y así sucesivamente.

Salu2

Unknown dijo...

Hola que ta Javier

Disculpa vi tu blog sobre excel y la verdad esta muy bueno, principalmente tus ejemplos los cuales lo he usado y marchan de maravilla. Pero me gustaria queme ayudaras con algo digo si tienes el tiempo, si no pues de todos modos tus aportes me han ayudado.

La cosa es que trabajo en seguros y quisiera un buscando pero en forma de lista, me explicare mejor, al momento de buscar alguna informacion, poner por ejemplo "mercedes" y que muestre en una lista las conicidencias que se tenga en uma hoja, y que permita escoger la mas acercatada a la busqueda??.

Espero averme explicado, y pues solamente resta nuevamente agradecer tu pagina muy padre.

El pilt®afilla - www.3piesalgato.com dijo...

Hola que tal...

Gracias por tu comentario. Creo que lo que buscas es algo parecido a lo que le dejé a Valeria en un mensaje anterior. Prueba a adaptarlo a tus necesidases (seguramente solo tendrás que cambiar un par de líneas). Puedes descargar el ejemplo desde aquí:

http://www.megaupload.com/es/?d=NIR757ZS

Salu2

Unknown dijo...

Bueno pues muchas gracias, pero solicitaba de tu ayuda por que la verdad ando perdido en este tipo de macros avanzados, pero como dije anteriormente de todos modos ayuda.

Gracias.

Unknown dijo...

Hola Javier, excelente tu aporte. Me interesa la opcion que me comentas al ultimo que obviaste y es volver al color original la busqueda realizada cada vez que se realiza una busqueda nueva. No se si me explico, seria sencillamente que cada vez que realizo una nueva busqueda, el resultado mostrado no incluya las busquedas echas anteriormente.
La idea pasa por cada vez que ejecuto el macro las palabras encontradas vuelvan a su color original. En macros soy bastante novato y espero puedas darme una ayuda.
Desde ya muchas gracias.

Saludos

Seba

El pilt®afilla - www.3piesalgato.com dijo...

El problema es que debes ejecutar unevamente el macro para que eso pudiera ser factible. Y en ese caso, es decir, en el caso de que ejecutases nuevamente el macro, deberías informar del rango de celdas donde efectuar la búsqueda, pero ...¿qué pasaría si el nuevo rango de búsqueda no coicidiera con el primero?. Ahí está el problema.

En realidad el buscador es para utilizarlo la mayoría de las veces, una sola vez, por eso desestimé realizar lo que comentas.

Un saludo.

Unknown dijo...

Gracias Javier por tu repuesta.
Entiendo perfectamente lo que me comentas, ahora me surge esta inquietud. Supongamos que el rango de celdas permanece invariable, se puede asignar un nuevo boton (LIMPIAR) que ejecute un macro que me vuelva todo el rango de celdas a su color original de letra?
Desde ya gracias.

Saludos
Seba

El pilt®afilla - www.3piesalgato.com dijo...

Sí, pero estaríamos en las mismas. Deberías informar nuevamente del rango de celdas que habría que limpiar.

Es más rápido y sencillo seleccionar todo a mano, y poner con el color de texto que tengas (normalmente negro).

Anónimo dijo...

hola, he estado viendo tu aporte y me parece magnifico, pero yo necesito un pasito mas y no se si es posible, yo tengo varios archivos cada uno con diferentes hojas, porq lo tengo dividido por meses y cada archivo en diferentes apartados, entonces me gustaria saber si se puede tener un buscador para todas las hojas excel? es decir buscar un nombre en todas esos archivos a ver si yo ya lo tenía relacionado gracias

Anónimo dijo...

Excelente me ha servido de mucho aunque me gustaria que me dijeses somo hacer para crear un carnet automaticamente con los datos de una tabla...

Trash!!! dijo...

Hola donde te puedo contactar veo que sabes de esto y quiero hacerte unas preguntas....,.

El pilt®afilla - www.3piesalgato.com dijo...

Lo siento Trash, pero son tantas las peticiones que recibo por email, que no puedo atenderlas muy a mi pesar. No podría ni trabajar, ni dedicarme a lo mío.

Espero que lo entiendas. Un saludo.

Anónimo dijo...

Antetodo agradecerte, excelente la información que brindas. Te queria consultar sobre un problema que tengo, necesito realizar una busqueda, tengo un listado con 600 nombres y los tengo que buscar en un listado de 2000, lo hice comparando con un bucle pero me lleva mas de 1hs que me tire las coincidencias y no le encuentro la vuelta para reducir el tiempo, un detalle la comparación no es exacta ya que muchas veces falta (en caso de que alla) uno de los dos nombres que posea la persona en el listado de 2000. Si tenes alguna idea te lo agradeceria un montón.

Gracias por tus aportes, un abrazo.

Antonio

El pilt®afilla - www.3piesalgato.com dijo...

Te sugiero que investigues sobre la función BUSCARV (en la ayuda de excel, puedes obtener info al respecto).

Un saludo.

Anónimo dijo...

Consulta, hay alguna función en VBA que trabaje igual que BUSCARV.

Gracias.

El pilt®afilla - www.3piesalgato.com dijo...

Prueba de esta forma:

Application.WorksheetFunction.VLookup(Arg1,Arg2,Arg3)

O bien usando la grabadora de macros, e introduciendo la función Buscarv, luego detienes el macro, y verás que te generará un código parecido a este:

ActiveCell.FormulaR1C1 = "=VLOOKUP(Arg1,Arg2,Arg3)"

Salu2

Anónimo dijo...

Estuve probando la funcion vlookup y tengo un problema lo que comparas tiene que ser exacto y en mi caso no lo es, ej "Garcia Juan" y tal vez en el listado aparece "Garcia J", alguna otra idea.

Gracias por la paciencia.

El pilt®afilla - www.3piesalgato.com dijo...

Para que funcione, los datos deben estar ordenados alfabéticamente. Si lo deseas, puedes usar un 4º argumento.

Esto es lo que pone la ayuda de excel (F1 desde excel, para consultarla): Ordenado es un valor lógico que especifica si BUSCARV debe localizar una coincidencia exacta o aproximada. Si se omite o es VERDADERO, devolverá una coincidencia aproximada. En otras palabras, si no localiza ninguna coincidencia exacta, devolverá el siguiente valor más alto inferior a valor_buscado. Si es FALSO, BUSCARV encontrará una coincidencia exacta. Si no encuentra ninguna, devolverá el valor de error # N/A.

Saludos.

Anónimo dijo...

hola, tu blog es muy bueno abusando de tus conocimientos queria preguntarte si me podrias ayudar, estoy usando la funcion buscarv pero solo me busca criterios exactos, por ejemplo tengo por decir una cadena que dice "ajt135 35635jk" pero en la matriz solo dice "135 35635"
agradeceria mucho tu ayuda gracias

Anónimo dijo...

hola me llamo jose, perdona que te moleste es la primera vez que entro y no se si lo veras. mira mi pregunta es "tengo una pagina donde entro los datos fechas,numeros y texto.
quisiera poner automaticamente esos datos en diferentes hojas pues son facturas y quiero ponerlas por trimestre y que busque las facturas por trimestre en esa hoja principal.gracias

Anónimo dijo...

Hola,
muy, muy bueno y de gran utilidad. Mis profundos agradecimientos por lo util que me resulta todo. Gracias mil.

El pilt®afilla - www.3piesalgato.com dijo...

De nada, mariazinha.

Muchas gracias por tu comentario.

Anónimo dijo...

HOLA SOY JUIL PABLO JAVIER MACRO NECESITO DE TU AYUDA PORFAA LO NECESITO DE VERDAD MIRA TENGO UN MAESTRO EN DONDE TENGO VARIOS DATOS NºSAP AGENCIA RUT ETC EN HOJAS DE ENERO FEBREO MARZO ETC Y LA ULTIMA HOJA SE LLAMA REPORTE BUENO LO Q NECESITO ES EN LA HOJA REPORTE INGRESAR EL Nº SAP Y Q ME ARROJE LOS DATOS DE ESE REGISTRO Y SI HAY MAS DE UNA CONCIDENCIA PARA ESE Nº SAP Q LO MUESTRE PORFAAAA AYUDAMEEE LO NECESITOOOO

Anónimo dijo...

hola,
necesito ayuda, me podrian ayudar: como puedo buscar datos en varias hojas, por ejemplo si en una hoja escribir el numero de folio de una factura, buscara en todas las hojas de calculo de ese libro, lo tengo por mes, ademas que me arrojara todos los datos relacionados con esa factura. les explico mas, yo capturo todo el material que me llega al almacen y quiero imprimir un tipo de etiqueta con todos los datos de ese producto, por ejemplo, cantidad, descripcion, fecha etc, los cuales quisiera que al escribir el # de factura me llenara automaticamente los campos de mi etiqueta.

saludos

Anónimo dijo...

Hola Javier Marco,mi nombre es Hector, te felicito por tu blog es (sin exagerar) de lo mejor en excel que he visto por la red y me ha resultado muy didáctico. Te cuento que estoy necesitando una pequeña ayuda/aclaracion respecto al codigo del buscador: ¿De qué manera debo modificar el codigo del buscador para que el resultado se muestre en un MsgBox? y no en la planilla. He probado de varias formas pero no doy en la tecla. Saludos y desde ya Muchas Gracias! y adelante!

Unknown dijo...

Buenas noches Javier una consulta, no sin antes felicitarte por tu blogg en el cual participo por primera vez. Todos los buscadores me parecen interesante, pero yo estoy necesitando uno parecido al que tiene Google, cuando vas a buscar información es decir conforme vas ingresando letras, te va mostrando toda la información de la cual tu puedes elegir una. Te explico, mi tabla está en la hoja 2 y tiene la siguiente estructura: Código, Alumno, asignatura, sección, nota1, y nota2. Mi campo clave puede ser el código, que es numérico de 6 digitos, como podría ser el apellido paterno. Depende como haga la búsqueda, sea una o el otro, debe mostrarme, los datos posibles, apróximados, de tal manera que yo pueda elegir al alumno, y que debajo me muestre en un formulario o algo parecido, toda la información del alumno elegido, es decir: Código, Alumno, asignatura, sección, notas. Debe preguntar si se va a modificar algún campo, de tal manera que yo pueda corregir, editar lo que sea necesario, en especial poder ingresar las notas, y que todo lo vuelva a reemplazar en la Hoja2 Como te darás cuenta antes, como paso inicial de todo debe preguntar si la búsqueda se va a realizar por código, o por el apellido.
Muchas gracias, buen fin de semana
Si no tuvieras alguna solución a la mano te agradeceré algún link de referencia donde encontrarlo
Jgbh

Anónimo dijo...

Hola que tal , muy buenos tus aportes , pero ahora tengo una inquietud y te pido de favor que me expliques o que me diga si es posible hacer o no.
Tengo una hoja en excel , es una base de datos bibliografica osea que en cada columna estan el autor , el nombre del libro , y un codigo de libro ... ¿ sera posible hacer un buscado que al momento de escribir y hacer clic , pueda arrojar los datos de todos los libros que tengasn refencia con ese tema ?
muchas gracias

Unknown dijo...

Mi duda tambien es como a dicho mateo, tengo un excel bibliografico y quiero buscar por titulo y que me indique ayutor y codigo. parecido el cntrol b.. aver soi se te ocurre algo

Anónimo dijo...

HOLA, MI PREGUNTA ES LA SIGUIENTE, HE PROBADO LA MACRO BUSCAR Y FUNCIONA DE MARAVILLA, PERO LA CUESTION ES QUE QUIERO QUE RESALTAR EL FONDO CON UN COLOR DE LA CELDA DONDE SE ENCUENTRA EL DATO QUE HA BUSCADO LA MACRO, COMO PODRIA HACERLO, GRACIAS DE ANTEMANO.

El pilt®afilla - www.3piesalgato.com dijo...

Te propongo que utilices la grabadora de macros (el asistente), y pongas una celda en el color de fondo que quieras. Grabas ese macro, luego lo editas, y verás el código que te aparece.

Tan solo tendrás que copiar ese código debajo de la línea del macro de este artículo donde pone que hay que darle color rojo al texto encontrado (no le pongas fondo rojo, porque no se vería, con el texto también en rojo).

Si no sabes como se usa la grabadora de macros, pásate por aquí: Mi primer macro en excel.

Anónimo dijo...

Si en vez de aparecer los datos a partir de la celda A10 me aparecieran dentro de un listbox como puediera hacer
Gracias

Miguel dijo...

Hola Javier! Eres un máquina. En el código de tu buscador cambié un par de lineas:
celda_inicial = "A1"
celda_final = "J100"
mostrar_datos = "K1"

Sin embargo he comprobado que no me realiza bien la búsqueda porque en muchas celdas no me busca (sobre todo obvia las columnas B y C). A ver si me puedes dar una idea de lo que hice mal. Un saludo! Estoy deseando que sigas añadiendo nuevos artículos :)

El pilt®afilla - www.3piesalgato.com dijo...

Hola Miguel. Gracias por tu comentario.

Pues debería funcionarte. Acabo de probarlo, sustituyendo los inputbox por valores fijos (los que has puesto en el ejemplo), y busca perfectamente en las columnas B y C.

Saludos.

Jaime dijo...

Hola amigo estado revisando tu pagina y esta muy buena, me ha servido vastante para hacer mis macros, solo que ahora tengo uno que no puedo resolver no se si me puedas ayudar mi problema es este." Tengo dos columna A y B, en la columna A las celdas aparecen con 000000 (cero) y en la columna B con 45678 (numeros), si en alguna celda de la columna B al cantarlas hay mas de 5 numero, quiero que que en la columna A, busque la celda corespondiente a la B y que me quite un (cero) y asi susebamente". Espero me puedas a yudar si no estas muy ocupado. Pero es que la verdad ya llevo un rato buscand la solucion y no la he encontrado.

El pilt®afilla - www.3piesalgato.com dijo...

Si en A1 tienes los ceros, y en B1 la otra cifra, prueba esta fórmula en la celda C1:

=SI(LARGO(B1)>5;IZQUIERDA(A1;LARGO(A1)-((LARGO(B1)-5)));A1)

Luego copia esa columna, y haz un pegado especial en la columna A.

Jaime dijo...

Mil gracias me funciona a la perfeccion la formula que me comentaste. gracias por todo. muy buena pagina sobre Excel de lo mejor. sigue adelante.

Callao2908 dijo...

Javier, gusto de saludarte, siguiendo como de costumbre todos los comentarios de éste post que me llegan a mi correo. Molesto tú atención, ya que con fecha 26/09/2009 con el usuario Callao2908, te hice una consulta. Imagino que fue porque estabas bastante equivocado en ese entonces, no me pudistes responder. Ahora que veo que respondes con mayor frecuencias, a lo mejor me puedas dar algunas referencias al respecto.
Saludos
Jorge

El pilt®afilla - www.3piesalgato.com dijo...

Hola Callao2908. Ten en cuenta que lo que buscas no es algo que se pueda contestar en un par de líneas, y que es algo que requiere su tiempo y dedicación, y la verdad es que no puedo atender todas las preguntas de los usuarios.

Lo que quieres, recuerdo que se lo explicó un compañero de forosdelweb.com a otro usuario. Échale un vistazo a este hilo: http://www.forosdelweb.com/f90/ayuda-con-macro-comodines-734714/

Para el resto, échale un vistazo al tema de como modificar datos utilizando un formulario.

Jaime dijo...

Hola de nuevo, una pregunta como puedo hacer que un archivo que cre en excel se guarde en un archivo de texto, cheque la pagina y se que hay ejemplo pero tate de hacer lo similar y no me funciona a la hora de ejecutarlo no se si me puedas ayudar Javier.

saludos cordiales.

El pilt®afilla - www.3piesalgato.com dijo...

Mírate este artículo: grabar datos en un fichero de texto, pues se explica de tres formas distintas como hacer eso (con 3 macros distintos).

Yo me quedaría con el último ejemplo, a pesar de que los tres funcionan perfectamente.

Saludos.

Anónimo dijo...

Hola mi amigo..mi nombre es Amet y la verdad he aprendido mucho.. pero he estado viendo el buscador y la verdad me parece de lo mejor.. pero sabes me gustaria que ahora me de como resultado las dos filas que aparecen en la coincidencia.. es decir.. los datos estan en la fila A1 hasta la fila A10 y al buscaer coincide con la celda A5,A6 y A7, y quiero que ponga los datos de las celdas B5,B6B7 y lo que esta en las filas C5,C6y C7, no se si sea mucho pedirte pero te lo agaradeceria mucho.. Gracias.. y nuevamente muchas felicitaciones por tu página

Anónimo dijo...

Que tal, es una excelente aportación, me ha ayudado y he tratado de adaptarlo tambien a mis reportes, sin embargo tengo una duda: que pasa si el boton con la macro lo quiero en otra pestaña y mantener las listas en otra, pero que al utilizar la macro me de los resultados en la primera.. esto es debido a que quiero una mantener una pestaña u hoja especial para busqueda de datos y no en la misma hoja donde esta toda la informacion.. saludos

El pilt®afilla - www.3piesalgato.com dijo...

Simplemente, al comienzo del macro puedes informar de la hoja donde quieres hacer la búsqueda. Por ejemplo así (suponiendo que quieras buscar en la hoja 2):

Hoja2.Select

O bien así:

Sheets("Hoja2").Select

También puedes pasar el nombre de la hoja de cálculo a una variable, preguntando en qué página quieres hacer la búsqueda (con un InputBox, puedes preguntar por el nombre de la hoja donde buscar). Hay algún que otro ejemplo de esto (del uso de los InputBox para preguntar, en el blog, ...usa el buscador interno y verás algún que otro ejemplo).

Un saludo.

Anónimo dijo...

hola he leido tu articulo de buscar cosas y es buenisimo pero necesito un fabor es que soy nuevo y no se como hago para que me muestre todos los datos buscados con los de las columnas siguientes es que el que tu enviaste me muestra el dato y la columna siguiente en la celda de abajo asi
juan
andres 12
36
los datos de la segunda columna no queda al lado de la primera
ademas como hago para guardar siertos datos de todos los que tiene el dato buscado en otra parte u hoja

Anónimo dijo...

hola como hago para buscar la respuesta de mi comentario por ejemplo de este

Anónimo dijo...

Hola, mira tengo una duda, como hago para que excel haga lo siguiente

tengo dos hojas : una tiene datos de nombres y facturas
la segunda condatos similares

Pero necesito una funcion que me permita verificar que datos tengo en la hoja 1 que no estan en la dos o viceversa y que me los saque en una columna

Juan Carlos dijo...

Hola Marco: Mi nombre es Juan Carlos; antes que nada felicitarte por tus aportes, Por favor ayudame con lo siguiente:
Trabajamos con varias empresas en servicios de taxi. Lo que necesito es que cuando me llame un cliente de una determinada compañia y me pida la tarifa de un lugar a otro el sistema me muestre automaticamente el precio. Ojo que cada empresa tiene un tarifario diferente; entonces los datos a ingresar seria: EMPRESA, LUGAR DE RECOJO y LUGAR DE DESTINO, yo debo registrar estos 3 datos y la maquina debe indicarme en forma automatica la tarifa del servicio para ese cliente. Asimismo el programa a realizar debe tener una opcion de ingresar a un cliente nuevo con sus rutas respectivas. De antemano gracias por tu ayuda.

pablobaez dijo...

super bueno tu eejmplo lo en modificado en nada
Sub BUSCAR_PRODUCTO()
On Error Resume Next

palabra_a_buscar = LCase(InputBox("Palabra (o parte de la palabra) a buscar", "Pregunta"))
If palabra_a_buscar = "" Then
MsgBox "Ingresar Datos", vbCritical
Else
Range("A2").Select
Do While Not IsEmpty(ActiveCell)
If InStr(LCase(ActiveCell), palabra_a_buscar) > 0 Then
celda = ActiveCell.Address
Range("h3").Select
Do While Not IsEmpty(ActiveCell)
ActiveCell.Offset(1, 0).Select
Loop
ActiveCell = Range(celda).Offset(0, 2)
Range(celda).Select
End If
ActiveCell.Offset(1, 0).Select
Loop
mensaje = MsgBox("Búsqueda finalizada", vbOKOnly, "Final")
End If
Range("H2").Activate
End Sub


pero como hago para agregar mas colomna al registro encontrado

Anónimo dijo...

Excelente buscador, te tengo una pregunta: porqué no presenta la información en orden (como se podría lograrlo)muestra por ej:
D10051
D10082
D10113
D1014
D10144
en lugar de ponerlo ordenado:
D1014
D10051
D10082
D10113
D10144

Si te es posible por favor ayudame con esto

GomeS dijo...

hola oye tu aporte genial, sin embargo me gustaria que me ayudaras 1 a no pedir celda inicial ni final siendo que siempre son en un mismo rango, y 2 que no solo me imprima la celda si no que me imprima toda esa fila, de antemano gracias

metano dijo...

El algoritmo aquí presentado es fácil de entender y no tanto desarrollar, pero tiene sus detalles, el primero es que: ¿Cuál es la función de la variable celdas_datos & "," & ActiveCell.Address cuando lo usa en el primer for? ¿Por qué este programa no funciona de arriba hacia abajo, pero sí de abajo hacia arriba?, por ejemplo., empieza la búsqueda de a1 hasta a10, ¿Por qué no iniciar de a10 a a1, tratándose de una matriz de datos?, gracias mi correo es termi_mlm@hotmail.com

frankhack1 dijo...

Hola amigo.
He usado tu codigo y ha sido sorprendente, pero tengo una duda, en esta formula que ya he modificado:
'Estas son las celdas que debes cambiar
celda_inicial = "A1"
celda_final = "A11111"
mostrar_datos = "C1"

Como podria hacer para que el lugar de hacer una busqueda por celdas, lo haga en una columna entera, siendo mas especifico, quisiera que buscara solo en la columna A, es decir A:A.
Que otras partes del codigo afectaria esta modificacion?

El pilt®afilla - www.3piesalgato.com dijo...

Pues creo que deberías modificar lo siguiente:

la variable "celda_inicial", y "celda_final" no harían falta, con lo que se podrían eliminar las líneas:

celda_inicial = InputBox("¿Cuál es la celda inicial, donde quieres empezar a buscar?", "Pregunta")
celda_final = InputBox("¿Cuál es la celda final, donde quieres parar a buscar?", "Pregunta")

Luego, habría que cambiar las variables "min_fila", "max_fila", "min_columna", y "max_columna", poniendo estos valores:

min_fila = 1
max_fila = 1000 'he supuesto que buscarás hasta la fila 1000
min_columna = 1
max_columna = 1

Y por último, esta línea:

Range(celda_inicial).Select

deberías cambiarla por esta otra:

Range("A1").Select

Creo que no me he dejado nada...
Saludos.

frankhack1 dijo...

Muchas gracias por tu respuesta! Yo he hecho tal como lo comentaste y funciono y solo como ultima cosa, quisiera que el buscador buscara en toda la columna A hasta donde encuentre datos, lo digo por esta linea:
[quote]max_fila = 1000 'he supuesto que buscarás hasta la fila 1000[/quote]
La verdad que queria que buscara en toda la columna A, por que podria llegar a recibir hasta mas de 30 mil datos, ya intente ponerle un valor como 100000 y se quedo colgado el Excel, entonces si hay forma de que Excel automaticamente identifique hasta donde hay datos y pare de buscar, seria lo ideal

El pilt®afilla - www.3piesalgato.com dijo...

Es probable que pienses que la aplicación se ha colgado, si el volumen de coincidencias es muy elevado. Es decir, si hay pocos resultados para la búsqueda realizada, la aplicación irá muy rápida, pero si el volumen de datos encontrados es ato (resultados que coinciden con los criterios de búsqueda), entonces la aplicación puede ir muy lenta. Ojo, esto último no quiere decir que se cuelgue, sino simplemente que tardará mucho (déjalo que trabaje, que ya verás como te devuelve los resultados solicitados, aunque tarde 1, 2, o 3 minutos).

Puedes buscar hasta la última celda con datos contínuos, cambiando la variable max_fila, por esta otra:

max_fila = Range("A1").End(xlDown).Row

Saludos.

frankhack1 dijo...

Gracias por tu ayuda!!

Anónimo dijo...

Master una consulta, quiero saber si lo siguiente es posible en excel.
En la celda A1 tengo un monto de 100.000 y en la columna b tengo 30 celdas con distintos montos y de los cuales si sumo solo cuatro me dan los mismos 100.000, es posible hacer una macro que encuentre y especifique cuales son las celdas que suamndo me pueden dar 100.000.

Agradecido desde ya,
Claudio

Anónimo dijo...

hola, estuve revisando tu aporte y esta genial, por cierto ya se como jalar mas celdas, lo que no sé y no tengo ni idea es por que busca solo letras o texto, en mi caso quiero buscar códigos, y no lo puede hacer, lo mio mas o menos es así el código que busco tiene un ingreso en numero, coincidente mente el ingreso esta al lado derecho, y la salida esta al lado derecho del ingreso, me funcionaria si mi código seria un nombre pero dado que es un numero no me resulta, por favor dame una mano...

Anónimo dijo...

Hola Javier Marco.

Soy Pedro. Y desde ya muy agradecido por tu aporte de la macro “buscar_cosas”.
Mira, tengo unas dudas.
Estoy utilizando la 1ª modificación que proporcionaste a Edu, el 15 de abril de 2008. Y me parece fenomenal. Pero me gustaría solicitarte que me ayudaras en una pequeña modificación, ya que me he artado de buscar por la Web, y por las referencias de VBA Excel y no encuentro la solución. Todo sea dicho, no soy muy ducho en esto de las macros, ni en VBA.
Tendría, las siguientes necesidades.

1º Me seria de utilidad, que: En vez de introducir por medio de “InputBox”, el comienzo y el fin de una columna; esta operación, se realizara por medio del ratón. O bien pulsando en el comienzo de una columna, ó, seleccionando directamente un grupo de celdas.

2º No me es necesario, que el texto coincidente, de las celdas encontradas, cambie de color. Así pues, el código relacionado con esto, se podría eliminar. (Dudo, a que parte de código, afectaría. Por eso no me he atrevido, a cambiarlo yo).

3º Y lo más importante. Todas las celdas donde se hayan encontrado coincidencias, tendrían que ser copiadas, con el mismo formato. En la misma posición y rango, en el que se encontraban inicialmente, pero en una columna diferente. La cual, también seria necesario, que se pudiera seleccionar mediante el ratón, y no por medio de “InputBox”.

Reitero mi agradecimiento desde ya, aun en el caso, que no me puedas ayudar. Y te pido disculpas por las molestias que te ocasione esto.

Mil gracias de nuevo.

Anónimo dijo...

Hola amigo, necesito un buscador que con un solo dato me extraiga todos los datos que hayan en la fila, me explico mejor: tengo nombres y apellidos, cedula, codigo, etc. necesito poner el numero de cedula y que me traiga todos los datos, que pueda poner nombres e igual me traiga todo o con cualquier otro dato pero que me traiga todo, si me pudieras ayudar porque neesito gestionar una base de datos pero solo me falta el buscador para consultar por cualquier dato, gracias.

Anónimo dijo...

hola amigo, he leido gran parte de tus enseñanzas y la verdad cabe felicitarte por esta magnifica pagina.
Mi pregunta es; quiero saber si es posible crear un buscador pero de hojas, me explico mejor..
en la hoja1 quiero implementar con un formulario de consulta la busqueda de hojas, que tenga un combobox en donde le ingrese el nombre de la hoja y si la encuentra me la seleccione.
gracias por cualquier ayuda que me puedas prestar.

El pilt®afilla - www.3piesalgato.com dijo...

Como buscador de hojas, lo más parecido que hay en el blog es esto, que creo que te será de mucha ayuda: buscar hojas ocultas.

Saludos.

Pauly dijo...

Estimado Javier:
Tu puedes ser mi salvación. Tengo que hacer un formulario que busque en otra hoja excel donde tengo datos de contratos. En el buscador tengo que por codigo de proyecto, me muestre todos los contratos asociados (según codigo de busqueda) en una tablita puesta en el formulario.

Anónimo dijo...

hola amigo esta bastante bueno, me ha ayudado un monton, pero encontré un detalle, aver si nos ayudas a todos con esto, te muestro mi tabla de ejemplo:
B C D
9 maria 08:35 tarde
10 pedro 08:20 puntual
11 javier falta
12 luis 08:40 tarde

escribo "tarde"
al hacer click en el boton buscar deberia arrojarme los nombres las personas que llegaron tarde:

maria
luis

ese es el detalle, no se como se podria acoplar en tu macro, seria excelente para que lo complementes y de mucha ayuda para nosotros,gracias.

Anónimo dijo...

Hola, te felicito, de verdad que eres bueno. Pero como siempre uno se antoja de cosas que no se si se pueden hacer en excel. Te explico lo que tengo. en una hoja de calculo en la columna B por ejemplo, tengo todos los materiales de un almacen, en la columna A sus referencias y en la columna c el numero de stock para cada material. En otra hoja de calculo tengo un formato de reporte para la salida de materiales. lo que deseo es no solo escribir el codigo del material y aparezca el material en la hoja de reporte. prefiero escribir el material en si y que aparezcan las coincidencias y hacer click para seleccionar la que se esta buscando. (pues uno no se va a paprender todas esas referencias y no perder tiempo buscando la referencia de cada paterial a reportar). algo asi como en el buscador de google que mientras uno escribe aparece unas coincidencias abajo y al hacer click en ella la busca. mi correo es: esteban.trejo@gmail.com

Anónimo dijo...

Hola buenas! Muy buena la macro. La acabo de probar y casi me funciona. Te comento, yo busco sobre una lista (D7:D300) y resulta que me busca bien pero hasta las D124, a partir de ahi nada de nada.

Alguna solucion coherente?

Rodrigo dijo...

Javier,
como puedo hacer para que el siguiente codigo me busque el primer valor(numerico o palabra) exacto??

Sub ENCUENTRA()

On Error GoTo linea1

Dim VALOR As String

VALOR = Sheets("Base Datos").Range("F3").Value
Sheets("Info").Activate

With Sheets("Info").Range("B1:B10000")
.Select
.Find(VALOR).Activate
End With
ActiveCell.Select
Exit Sub

linea1:
MsgBox "El nombre del proveedor ingresado No esta registrado en la base de datos"

End Sub

el problema que tengo es que si le ingreso buscar por ejemplo el valor 51 y en la hoja donde busca se encuentra el valor 515 primero que el 51, me entregara el 515... que le debo agregar al codigo para que me entregue el valor exacto (51 en el caso del ejemplo)

saludos, Rodrigo

El pilt®afilla - www.3piesalgato.com dijo...

Prueba cambiando esto:

.Find(VALOR).Activate

Por esto:

.Find(VALOR, LookAt:=xlWhole).Activate

Saludos

Rodrigo dijo...

Muchas gracias!! solucionaste mi problema!!!, excelente pagina me a sido de gran ayuda... Saludos

Rodrigo dijo...

Javier,
antes que nada gracias por la respuesta anterior. sabes que e intentado que la misma macro me busque el primer valor que encuentre pero primero revisando la columna A y si no encuentra nada que se pase a la B, me funciona pero el problema que no puedo solucionar es que me entregue el mensaje cuando el valor que se busca no esta en estas 2 columnas :/ por lo que me envia un error.... ojala me puedas ayudar, este es el codigo

Sub ENCUENTRA()

On Error GoTo linea1

Dim VALOR1 As String

VALOR1 = Sheets("Base Datos").Range("F3").Value
Sheets("Info").Activate

With Sheets("Info").Range("A1:A10000")
.Select
.Find(VALOR1, LookAt:=xlWhole).Activate
End With
ActiveCell.Select
Exit Sub

linea1:

On Error GoTo linea2
Dim VALOR2 As String

VALOR2 = Sheets("Base Datos").Range("F3").Value
Sheets("Info").Activate

With Sheets("Info").Range("B1:B10000")
.Select
.Find(VALOR2, LookAt:=xlWhole).Activate
End With
ActiveCell.Select
Exit Sub

linea2:
MsgBox "El nombre del proveedor ingresado No esta registrado en la base de datos"

End Sub



Saludos, Rodrigo

Anónimo dijo...

De donde puedo descargar el buscador ya que de esta pagina http://www.megaupload.com/es/?d=6MTKF8BW
ya no se puede.

Saludos.

El pilt®afilla - www.3piesalgato.com dijo...

Lo acabo de subir a este nuevo sitio: http://www.mediafire.com/?o7013pwpyog0hr4

Saludos.

Anónimo dijo...

Muchas gracias por la respuesta, muy buen aporte, para implementar el buscador en mi reporte , yo no requiero pedir los datos de rango inicial y final y el dato a buscar ya lo tengo en una celda.
Una vez encontrado el valor en una fila, que me ponga el valor de todas las celdas de esa fila.

en verdad te agradeceria mucho tu ayuda , ya que no tengo mucha experiencia con excel.

Anónimo dijo...

Buenas,
como podría hacer para buscar un dato en toda la hoja de Excel y me mostrara , no la celda donde está sino el dato en sí.
Es decir, si busco TU500, por ejemplo, que me muestre ese dato en una columna las veces que esté.
Gracias.

Anónimo dijo...

"que tal, muy interesante tu blog me ayuda mucho, te agradeceria mucho en verdad que me ayudes con este problema, tengo un pequeño negocio con mas de 100 productos y quiero un formulario de búsqueda en el cual se ponga una palabra referente al producto no importa la ubicacion por ejemplo: estoy escribiendo Lap y en un cuadro me aparece: lapicero Faber C, lapicero Lucas, lapiz Faber,
borrador LAPDOC , y asi mientras escribo se reducen los no coincidentes, tambien que aparesca al costado del producto su precio y stock

he estado trabajando con este codigo pero falta mas expresiones como para que me seleccione lo que busco:
Private Sub TextBox1_Change()
Dim i As Integer, Ctrl As Boolean
Ctrl = True
For i = Me.ListBox1.ListCount - 1 To 0 Step -1
If Not IsEmpty(Trim(Me.TextBox1)) Then
If LCase(Me.ListBox1.List(i)) Like LCase(Me.TextBox1.Value) + "*" Then
Me.ListBox1.Selected(i) = True
Ctrl = False
End If
End If
Next
If Ctrl And Not IsEmpty(Trim(Me.TextBox1)) Then
MsgBox "Nombre No Registrado", vbInformation + vbOKOnly, "Sr. Operador"
End If
End Sub

Anónimo dijo...

hola me llamo jesus hoy tonteando en Internet me di con esta pagina donde hay muy buenos aportes con respecto a excel con macros, la verdad que no se nada de macro, estoy leyendo tu 33 utilidades a ver si aprendo algo, pero de momento como haces una base de datos para empleados donde aparezca nombre, DNI, Cargo, Empresa Fecha de carnet , fecha de caducidad, pues de antemano gracias por estar aqui ayudando novatos como yo, gracias buen dia.

Unknown dijo...

Hola compañeros, tengo los siguienets datos, en la columna A Nos de cedulas, en la columna B nombre de empleados y en la columna C cargos, me gustaria saber si se puede hacer una macro que me pida un numero de cedula y en otra hoja me llleve la informacio n de esa persona,, muchas gracias,,,