Es de las preguntas mas recurrentes que he tenido: ¿se puede lograr que la función BUSCARV() devuelva varios resultados? Si recordamos el uso de esta función, sabremos que la misma buscar en valor en el rango especificado, retornando un solo resultado. Si en la tabla tenermos varios registros iguales BUSCARV() solo nos devolverá el primero de ellos, omitiendo el resto.
Entonces ¿se puede? Bueno, aplicando otra técnica sencilla que se me ocurrió al intentar solucionar el planteamiento de un lector... si, puedo hacerlo.... pero sin usar BUSCARV().
la idea es que coloquemos en E1 el código del producto a buscar y a partir de E2 nos devuelva todas las coincidencias de la tabla.
[+/-] Ver el resto / Ocultar
Vamos a necesitar una columna "auxiliar" para llevar a buen término este proyecto. Con macros el tema sería mas sencillo, pero aquí la cuestión es resolverlo con las funciones de Excel, sin VBA.
Paso a paso:
Como primer medida chequeamos que valores de la columna A coincide con el ingresado en E1; si es así, reflejamos allí el nro de fila:
=SI(A2=$E$1;FILA();"")
todo bien: ya se que en las filas 2, 5 y 6 se repiten los valores presentes en E1.
Aqui el principal problema radica en omitir los espacios en blanco, brindando al usuario una lista (a partir de E2) en donde solo aparezcan los resultados, no las celdas vacías.
En
esta entrada vimos como ordenar un rango de datos con funciones, así que aplicaremos lo aprendido para continuar: en E2 (y hasta la misma fila en donde termina la tabla) va esta función:
=K.ESIMO.MAYOR($C$2:$C$8;FILA(C2)-1)
ya podemos observar el resultado en las celdas coloreadas de la columna E: tengo a los datos ordenados, sin espacios en blanco. Por ahora no prestemos atención al error #¡NUM!, del cual nos encargaremos al final
Pero claro, en la columna E yo necesito tener los resultados, no el número de fila en donde se encuentran. Bueno, con INDICE() resolvemos esto, colocando la función anterior en el segundo argumento:
=INDICE($B$1:$B$8;K.ESIMO.MAYOR($C$2:$C$8;FILA(C2)-1))
el primer argumento de INDICE() es la matriz en donde buscaremos, el segundo se trata del nro de posición del elemento dentro de esa matriz que queremos recuperar.
Y si colocamos otro código en E1:
todos los precios de los registros cuyo campo código es igual a "d"
Y si colocamos "b"?
bien: uno solo.
Ahora nos encargaremos del error. Seleccionamos E2 y allí aplicamos el siguiente formato condicional:
o sea: si la función detecta que hay un error, se aplicará el formato indicado: en este caso, que la fuente sea de color blanco, el mismo color de fondo de las celdas.
Copiamos E2, edición/pegado especial/formatos, y obtenemos esto:
el error persiste.... solo que ha quedado "invisible". También oculté la columna C, para que el trabajo quede mas prolijo.
Fin. Ya podemos listar los resultados de una búsqueda sin la necesidad de recurrir a las macros. Este método (desde mi punto de vista) solo tiene dos problemas: si el tamaño de la tabla crece en registros, no deberemos olvidar que hay que copiar y pegar las fórmulas de la columna C y E, hasta el final, para asegurarnos que abarque la nueva dimensión de la tabla y devuelva correctamente todos los valores coincidentes. El segundo inconveniente es que si hablamos de miles y miles de registros Excel puede ponerse un tanto "lento" al recalcular muchas funciones. Pero es un método viable y soluciona el problema planteado, mas aún con bases de datos de "no tantos" registros.
Aquí les dejo el
link al archivo y un gran agradecimiento por todos sus mensajes y mails.
Suerte.
damián...
ResponderEliminarjunto con saludarte y agradecer la labor que haces al amigarnos de este gran y utilizado programa, me interesa saber si es posible realizar este mismo ejercicio pero para una matriz nxn de datos... he intentado extenderlo pero me ha sido muy difícil.
de antemano gracias y espero tu respuesta
saludos cordiales
hola luximpi: aclarame un poco mas sobre que necesitas realizar, por que no comprendo el tema de "nxn" de datos, ya que no me queda muy en claro.
ResponderEliminarmuchas gracias por tus palabras.
un abrazo
me refiero a mas columnas y filas ( en verdad debiese haber dicho matriz n x m con n filas y m columnas)...
ResponderEliminarlo que necesito hacer es ubicar un codigo(ej: MT-CF) en una fila de una matriz n x m de datos y obtener la info de toda la fila, es decir, hacer la comparación que hacías al principio pero que arroje todo lo que aparece en dicha fila... no se si me explique bien y quizá es más simple por otro método. Estoy haciendo mi práctica pero el área administrativa no es el fuerte de un Ingeniero Civil Eléctrica XD jajaja muchas gracias y saludos
luximpi: creo que la solución a tu problema es sencilla.
ResponderEliminarverás en el ejemplo que la lista de resultados ocupa la columna E, en cuyas celdas hay una funcion INDICE() que lee del rango de la columna B. Hasta ahí todo bien.
Supongamos que tu tabla tiene 3 columnas. Con el archivo que proporcioné ya lees la segunda (B).
Ahora en la columna F colocá esta función:
=INDICE($C$1:$C$8;K.ESIMO.MAYOR($D$2:$D$8;FILA(D2)-1))
es decir: estamos ante lo mismo, solo que en lugar de leer los datos de la columna B, lo hago sobre la columna C, la tercer columna de tu tabla. y funciona muy bien
te dejo el enlace al archivo con las modificaciones, así lo estudias y ves como puedes aplicarlo a tu proyecto:
https://sites.google.com/site/damianomarsilva2/BuscarVVV02.xls
suerte y cualquier cosa me avisas.
Damian, tengo un problema.
ResponderEliminarnecesito la manera de unir un buscarv con un buscarh, hay alguna manera de hacerlo???
o alguna funcion que me permita buscar un valor verticalmente y luego buscar en esa fila un valor que esta relacionado con otro.
Andrés: date una vuelta por esta entrada: http://damianexcel.blogspot.com/2010/03/otras-formas-de-buscar-mas-complejas.html
ResponderEliminarcreo que con Indice() y Coincidir() anidadas podes llegar a lograr lo que necesitas.
cualquier cosa me avisas.
DAMIAN, ESTOY VIENDO TU EXPLICACION Y ME GUSTARIA VER SI PODEMOS AVANZAR UN POCO MAS. VOS ESTAS BUSCANDO DESCRIPCIONES IDENTICAS Y ME GUSTARIA APLICAR ESTO PARA DESCRIPCIONES SIMILARES. POR EJEMPLO CODIGO ES "ACIDO SULFURICO" Y "SULFUR ACID" YO QUIERO BUSCARLA LA PALABRA "SULFUR" Y QUE TRAIGA AMBOS CODIGOS.
ResponderEliminarPara hacer algo sencillo y no complicarlo demasiado, estimo que podemos hacer uso de la funcion =ENCONTRAR(texto_buscado;dentro_del_texto)
ResponderEliminarDeberás borrar las funciones de la columna C y reemplazarla por esta:
=SI(NO(ESERR(ENCONTRAR("sulfuric";A2)));FILA();"")
bueno, veamos: le estoy diciendo esto: si no arroja un error la función que busca "sulfuric" dentro de la celda, entonces colocá el nro de fila en la que se encuentra.
cabe aclara que si con ENCONTRAR() no hallamos el texto buscado, esta nos devuelve un error. De ahí que primero pregunte con un =SI().
lo probé y funciona bien. cualquier duda me avisas.
gracias x tu mensaje
Tengo que haer un grafico que debe contener
ResponderEliminargrupos que reiben beca
2a=5
4b=0
6a=8
8a=2
8b=0
primero quiero graficar en tipo de pastel pero que los de cero no se incluyan
y que el grafico muestre el total en este caso 15 La carrera y el tipo de Beca que otorgo y la carrera en la que lo otorgo
christian: deberías enviarme un correo con el archivo adjunto, así puedo analizar bien la estructura de la tabla. Avisame aquí cuando lo remitas (fijate que al pié del formulario está la dirección de correo electrónico)
ResponderEliminarHola quisiera saber, como puedes resolver este mismo problema pero con macros, espero me puedas ayudar, gracias de antemano
ResponderEliminarno entiendo muy bien la primera parte =SI(A2=$E$1;FILA();"") que valor debo de ingresar en la parte donde dice fila();""....??
ResponderEliminarDentro de la función FILA() no va ningún argumento. Lo que dice mi fórmula es: si el valor de A2 coincide con el valor ingresado en E1, entonces devolveme en qué fila se encuentra. De ahí en mas formo una "matriz" con las coincidencias y las busco.
ResponderEliminar