Último valor no-cero de una fila: 4 enfoques comparados
Interesante problema planteado por un miembro de la comunidad que trabaja con una tabla de artículos textiles (manteles, delantales, etc.) con hasta 11 columnas de tarifas. Cada artículo tiene varias tarifas históricas de izquierda a derecha, y las que ya no aplican se rellenan con cero. La pregunta: ¿cómo obtener la tarifa más reciente (la última distinta de cero en la fila)?
El fichero adjunto muestra la estructura: columnas G a Q con TARIFA/1 a TARIFA/11. Un artículo típico tiene valores como 7.366 | 10.312 | 10.931 | 1.744 | 0 | 0 | 0... y se necesita obtener 1.744. El autor ya tenía un intento con COINCIDIR + INDICE que no le convencía.
En apenas 25 minutos, la comunidad aportó 4 soluciones distintas, cada una con su enfoque:
Nacho — BYROW + FILTRAR + TOMAR:
``
=BYROW(G4:Q12;LAMBDA(x;
LET(
_precios; ENCOL(x);
TOMAR(FILTRAR(_precios; _precios<>0; "Sin tarifas"); -1)
)
))
`
Convierte la fila en columna con ENCOL, filtra los ceros, y con TOMAR(...;-1) se queda con el último valor. Incluye manejo del caso sin tarifas.
Gerson — versión compacta del mismo enfoque:
`
=BYROW(G4:Q12;LAMBDA(x;TOMAR(FILTRAR(x;x>0);; -1)))
`
Mismo patrón pero sin ENCOL ni LET. Más directa y limpia.
Oswaldo — ELEGIRCOLS + COINCIDIR + INDICE:
`
=ELEGIRCOLS(
FILTRAR(
SI(COINCIDIR(0;G9:Q9;0)<>1;
INDICE(G9:Q9; COINCIDIR(0;G9:Q9;0)+1);
INDICE(G9:Q9; COINCIDIR(0;G9:Q9;0)-1)
);
G9:Q9<>0
);
-1
)
`
Un enfoque más clásico usando COINCIDIR para localizar el primer cero y luego INDICE para obtener el valor adyacente.
John — el truco clásico con BUSCAR:
`
=BYROW(1/G4:Q12^-1;LAMBDA(f;BUSCAR(9^9;f)))
`
Elegantísimo. Al calcular 1/valor^-1, los ceros generan errores (#DIV/0!). Luego BUSCAR(9^9;f) busca un número enorme y, al no encontrarlo exactamente, devuelve el último valor válido (no-error) de la fila. Una sola línea, sin filtros ni funciones auxiliares. Bendiciones! 😄
Cuatro caminos para el mismo problema: desde el enfoque moderno con BYROW+FILTRAR+TOMAR hasta el truco clásico con BUSCAR` que resuelve en una línea lo que otros necesitan varias funciones anidadas.
El problema
Un miembro de la comunidad trabaja con una tabla de artículos textiles —manteles, delantales y demás— con hasta once columnas de tarifas históricas, de izquierda a derecha. Cuando una tarifa deja de aplicarse, la celda se rellena con cero. La pregunta es fácil de enunciar y sorprendentemente rica de resolver: ¿cómo obtener la tarifa más reciente, es decir, el último valor distinto de cero de cada fila?
Con una fila como 7.366 | 10.312 | 10.931 | 1.744 | 0 | 0 | 0, el resultado buscado es 1.744. En apenas 25 minutos, la comunidad propuso cuatro soluciones con enfoques muy diferentes.
Enfoque 1: BYROW + FILTRAR + TOMAR
Nacho lo aborda fila a fila con BYROW. Dentro de cada fila, FILTRAR se queda solo con las tarifas mayores que cero y TOMAR(...;-1) recoge la última:
`` =BYROW(G4:Q12;LAMBDA(x;TOMAR(FILTRAR(x;x>0);;-1))) ``
Limpio y directo: filtra los ceros y toma el último elemento que queda. Si quieres blindarlo, puedes añadir un mensaje para el caso de que no haya ninguna tarifa.
Enfoque 2: la versión compacta
Gerson depura la misma idea hasta dejarla en lo esencial, sin variables auxiliares. Mismo patrón BYROW + FILTRAR + TOMAR, pero todavía más escueto. Cuando el objetivo es legibilidad y rendimiento, menos es más.
Enfoque 3: INDICE + COINCIDIR
Oswaldo recupera el enfoque clásico: localizar la posición del primer cero con COINCIDIR y usar INDICE para recuperar el valor inmediatamente anterior, envolviendo todo en FILTRAR y ELEGIRCOLS para quedarse con la columna correcta. Es más largo, pero funciona en versiones de Excel donde TOMAR no está disponible.
Enfoque 4: el truco clásico con BUSCAR
Y John cierra con la joya del hilo, una sola línea:
`` =BYROW(1/G4:Q12^-1;LAMBDA(f;BUSCAR(9^9;f))) ``
La magia está en 1/valor^-1: los ceros generan un error de división, mientras que el resto de valores sobreviven intactos. Después, BUSCAR(9^9;f) busca un número gigantesco que nunca encontrará de forma exacta y, por diseño, devuelve el último valor válido de la fila. Sin filtros, sin funciones auxiliares, puro ingenio de hoja de cálculo.
Funciones clave
BYROW: aplica unaLAMBDAa cada fila del rango.FILTRAR: descarta los ceros y deja solo las tarifas vigentes.TOMAR: con índice negativo, recoge el último elemento.INDICEyCOINCIDIR: el tándem clásico para localizar posiciones.BUSCAR: aprovechado como truco para devolver el último valor no erróneo.
Conclusión
Cuatro caminos para el mismo destino: desde el enfoque moderno y legible con BYROW + FILTRAR + TOMAR hasta el histórico truco con BUSCAR que resuelve en una línea lo que otros necesitan varias funciones anidadas. Ninguno es "el correcto": conviven según tu versión de Excel y tu gusto por la elegancia. Casos así, nacidos de un problema real de tarifas, son el pan de cada día en la comunidad de Influexcel.
Más contenido de Excel en InflueXcel
- Cuenta clientes y cervezas en Excel 🍺 Caso "La Taberna: El Poney Pisador" (Nivel 1) Tutorial🍺 Noche cerrada en Bree. Frodo, Sam, Merry y Pippin cruzan la puerta de El Poney Pisador huyendo de los Jinetes Negros: la sala está a reven
- SUMAR.SI.CONJUNTO en acción con El Señor de los Anillos 🃏 El 21 de La Comarca TutorialLo que practicamos en este caso: • Contar cartas por palo con CONTAR.SI • Sumar valores con condiciones (SUMAR.SI / SUMAR.SI.CONJUNTO) • Apl
- Reto de Excel: El cumpleaños de Bilbo 🎂 | CONTAR.SI y SUMAR.SI desde cero (Nivel 1) TutorialEn La Comarca se celebra el cumpleaños número 111 de Bilbo Bolsón: cerveza, pasteles, fuegos artificiales… y algún curioso escondido tras el
- ¡Excel PowerQuery Hack! Conexiones con rutas relativas en 10 minutos! Tutorial¿Harto de ajustar las conexiones en PowerQuery cada vez que compartes tu archivo de Excel? 🙄 Convierte las conexiones de PowerQuery con ruta
- Mejora un 90% el rendimiento de Power Query con SQLite TutorialPower Query es una herramienta potente para consolidar, combinar y calcular datos, pero cuando trabajamos con millones de registros y calcul
- Reorganizar tablas mensuales: cruzar por persona buscando en vertical y en horizontal CasoNuevo caso interesante de la comunidad. Juan tenía varias tablas mensuales (a veces más de una en el mismo mes) y quería reorganizarlas por
- Un dato de todas las hojas, escrito una sola vez CasoEsta semana surgió en la comunidad un reto muy habitual cuando un libro tiene muchas hojas: mostrar el valor de la celda B3 de cada hoja, in
- Un índice de hojas que se genera solo: HYPERLINK en rangos desbordados CasoEsta semana surgió en la comunidad un pequeño "expediente X". Un miembro llegó tras ver un vídeo con una idea clara en la cabeza: montar una
- Reformatear un código alfanumérico al teclear: de NN1234567 a NN-12345-67 CasoEsta semana surgió en la comunidad una duda muy práctica: cómo conseguir que al escribir un código tipo NN1234567 (dos letras seguidas de si
- Reclasificación contable: duplicar cada fila con una conversión distinta por columna, en un único bloque CasoInteresante reto contable planteado esta semana por un miembro de la comunidad. Juan parte de una tabla de apuntes contables (rango C7:P10)