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