Ú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 una LAMBDA a cada fila del rango.
  • FILTRAR: descarta los ceros y deja solo las tarifas vigentes.
  • TOMAR: con índice negativo, recoge el último elemento.
  • INDICE y COINCIDIR: 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