Obtener la última tarifa (valor más a la derecha) con 5 fórmulas distintas
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, es decir, la última distinta de cero de 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 venía con un intento propio de COINCIDIR + INDICE que no le convencía.
En apenas 25 minutos la comunidad aportó cinco enfoques distintos, desde los más modernos hasta trucos clásicos.
Nacho propone BYROW + FILTRAR + TOMAR:
``
=BYROW(G4:Q12;LAMBDA(x;LET(
_precios;ENCOL(x);
TOMAR(FILTRAR(_precios;_precios<>0;"Sin tarifas");-1)
)))
`
Convierte cada fila en columna con ENCOL, filtra los ceros y toma el último valor con TOMAR(...;-1). Incluye además el manejo del caso sin tarifas.
Otro miembro afina el mismo enfoque hasta dejarlo en una línea:
`
=BYROW(G4:Q12;LAMBDA(x;TOMAR(FILTRAR(x;x>0);; -1)))
`
Mismo patrón, pero sin ENCOL ni LET: filtra directamente y se queda con la última columna.
Aparece también un enfoque más clásico con ELEGIRCOLS + FILTRAR + COINCIDIR:
`
=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)
`
Localiza el primer cero con COINCIDIR, coge el valor adyacente con INDICE y remata con ELEGIRCOLS en índice -1 para quedarse con la última columna.
Hugo cierra con el truco clásico de 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 de la fila. Una sola línea, sin filtros ni funciones auxiliares.
Y un quinto camino, con REDUCE como acumulador:
`
=BYROW(G4:Q12;LAMBDA(x;REDUCE(;x;LAMBDA(a;v;SI(v>0;v;a)))))
`
Recorre cada valor de la fila: si es mayor que 0 lo guarda, y si no mantiene el anterior. Al final queda el último positivo.
Cinco caminos para el mismo problema: desde el enfoque moderno con BYROW + FILTRAR + TOMAR hasta el truco con BUSCAR` que resuelve en una línea lo que otros necesitan varias funciones anidadas.
El problema: la tarifa más reciente (último valor a la derecha)
Un miembro tenía una tabla con tarifas históricas en varias columnas, una por período, y las que ya no aplican se rellenan con cero. Necesitaba obtener, para cada fila, la tarifa más reciente: el último valor distinto de cero. La comunidad respondió con cinco fórmulas, de las más modernas a los trucos clásicos.
BYROW + FILTRAR + TOMAR (Nacho)
=BYROW(G4:Q12;LAMBDA(x;LET(
_precios;ENCOL(x);
TOMAR(FILTRAR(_precios;_precios>0;"Sin tarifas");-1)
)))Convierte cada fila en columna con ENCOL, descarta los ceros con FILTRAR (aquí basta >0 porque las tarifas son positivas) y con TOMAR(...;-1) se queda con el último valor. Incluye un mensaje para las filas sin ninguna tarifa.
Versión compacta (Leo)
=BYROW(G4:Q12;LAMBDA(x;TOMAR(FILTRAR(x;x>0);; -1)))El mismo patrón sin ENCOL ni LET: filtra directamente y toma la última columna. Más directa y limpia.
El truco clásico con BUSCAR (Hugo)
=BYROW(1/G4:Q12^-1;LAMBDA(f;BUSCAR(9^9;f)))Elegantísimo. Al calcular 1/valor^-1, los ceros generan errores de división. Luego BUSCAR(9^9;f) busca un número gigantesco y, al no encontrarlo, devuelve el último valor válido (no erróneo) de la fila. Una sola línea, sin filtros ni funciones auxiliares.
REDUCE como acumulador
=BYROW(G4:Q12;LAMBDA(x;REDUCE(;x;LAMBDA(a;v;SI(v>0;v;a)))))Recorre cada valor de la fila: si es mayor que cero lo guarda, y si no, mantiene el anterior. Al terminar queda el último positivo. Muy legible.
Un enfoque clásico con INDICE y COINCIDIR
Hugo también planteó una versión con ELEGIRCOLS, COINCIDIR e INDICE que localiza la posición del primer cero y navega hasta el valor contiguo. Más verbosa, pero útil si trabajas en una versión de Excel sin FILTRAR ni TOMAR.
Funciones clave
BYROW— aplica la lógica fila a fila.FILTRAR+TOMAR— quitan los ceros y cogen el último valor.ENCOL— pasa una fila a columna.BUSCAR(9^9;…)— truco para devolver el último valor válido de un rango.REDUCE— acumula recorriendo la fila.
Conclusión
Cinco caminos para el mismo objetivo, desde el moderno BYROW+FILTRAR+TOMAR hasta el truco de BUSCAR(9^9;…) que lo resuelve en una línea. Si valoras la claridad, quédate con FILTRAR; si te gusta la magia compacta, el de BUSCAR es un clásico que merece la pena conocer. Comparar enfoques así es lo que se cuece a diario en la comunidad de InflueXcel. Descarga el fichero y prueba cuál te convence más.
Más casos con estas funciones
Más contenido de Excel en InflueXcel
- Filtro multicriteria dinámico con LET, FILTRAR y LAMBDA CasoHector comparte con la comunidad una fórmula avanzada para filtrar una tabla de productos/servicios por múltiples criterios opcionales (clav
- Descomposición de Cholesky con matrices dinámicas: de VBA a LAMBDA+REDUCE CasoJuan Pablo lanza un reto al grupo: tiene una descomposición de Cholesky resuelta con VBA y quiere saber si se puede hacer con matrices dinám
- Serie de Fibonacci con LAMBDA y REDUCE en una sola fórmula CasoSurge un reto interesante en la comunidad: generar la serie de Fibonacci con una sola fórmula de Excel, sin celdas auxiliares ni macros. Un
- Generar la serie de Fibonacci con REDUCE, APILARV y LAMBDA CasoInteresante ejercicio compartido en la comunidad: generar los primeros N números de la serie de Fibonacci usando exclusivamente fórmulas de
- Saldo acumulado por mes: tres enfoques (REDUCE+BYROW, PIVOTARPOR+acumulado, MMULT) CasoJuan plantea una pregunta que parece sencilla y se acaba convirtiendo en tres clases magistrales sobre cómo recorrer una matriz mes a mes. T
- Optimización de REDUCE+APILARV con LAMBDA recursiva en bisección CasoAlejandro plantea un reto de rendimiento interesante: tiene una fórmula LET enorme que calcula la permanencia de carga en puerto por matrícu
- Funciones personalizadas en Excel: LET, LAMBDA y recursividad TutorialCómo pasar de una fórmula escrita a mano a una función propia que puedes llamar por su nombre en cualquier libro. Los tres vídeos de esta pá
- Filtrar una tabla por una lista de valores: una LAMBDA propia y su inversa TutorialTe pasan una lista de 30 números de albarán y hay que sacar esas filas de una tabla de miles. Con el autofiltro es marcar casillas una a una
- FILTRAR que devuelve múltiples filas: por qué falla y cómo resolverlo CasoInteresante problema que aparece con frecuencia cuando se combinan FILTRAR con funciones iterativas como MAP o BYROW. Un miembro tiene una t
- Fibonacci sin recursión lenta: de LAMBDA exponencial a fórmula instantánea CasoUn ingeniero industrial del grupo implementa Fibonacci con LAMBDA recursiva (Fibonacci(n-1)+Fibonacci(n-2)), pero a partir de n=35 la fórmul