Obtener la partida activa de un depósito con BUSCARX: concatenación y búsqueda inversa

Un miembro de la comunidad gestiona un inventario de depósitos (AFORO) con una tabla llamada PARTIDAS_AGE. Cada depósito tiene múltiples partidas con fecha de apertura y fecha de cierre. El reto: obtener automáticamente la partida activa (la más reciente, o la que aún no tiene fecha de cierre) para cada depósito.

Hugo propone una primera solución usando BUSCARX con una condición matricial que maximiza la fecha de apertura dentro del depósito:

``
=BUSCARX(
1;
(MAX(SI(PARTIDAS_AGE[Depósito]=[@Deposito]; PARTIDAS_AGE[Fecha apertura]; 0))
= PARTIDAS_AGE[Fecha apertura])
(PARTIDAS_AGE[Depósito]=[@Deposito]);
PARTIDAS_AGE[Partida]; 0
)
`

Leo simplifica el enfoque usando BUSCARX con modo de búsqueda inversa (-1) y concatenación para un BUSCARX multicriteria:

`
=BUSCARX(
[@Deposito] & MAX(([@Deposito]=PARTIDAS_AGE[Depósito]) PARTIDAS_AGE[Fecha de Cierre]);
PARTIDAS_AGE[Depósito] & PARTIDAS_AGE[Fecha de Cierre];
PARTIDAS_AGE[Partida]; "";;-1
)
`

La idea: concatenar depósito + fecha de cierre para crear una clave compuesta, y buscar la que tenga la fecha máxima. Si hay varias con la misma fecha, devuelve la última.

John mejora la concatenación añadiendo un delimitador entre los valores para evitar falsos positivos (cuando números de depósito y fechas podrían combinarse en coincidencias falsas):

`
=LET(
d; [@Deposito];
rd; PARTIDAS_AGE[Depósito];
rc; PARTIDAS_AGE[Fecha de Cierre];
BUSCARX(d & "-" & MAX((d=rd) rc); rd & "-" & rc; PARTIDAS_AGE[Partida];;;-1)
)
`

También propone una alternativa con LET que busca directamente por fecha de apertura máxima:

`
=LET(
b; PARTIDAS_AGE[Fecha apertura] (PARTIDAS_AGE[Depósito]=[@Deposito]);
SI(MAX(b); BUSCARX(MAX(b); b; PARTIDAS_AGE[Partida];;;-1); "")
)
`

Tanto John como Leo coinciden en que la versión más limpia es la última (con LET), por su claridad y por evitar el problema de concatenaciones sin delimitador.

Técnicas destacadas:

- BUSCARX con modo -1 (búsqueda del último al primero) para obtener el registro más reciente
- Concatenación multicriteria en BUSCARX como alternativa a INDICE+COINCIDIR
- Delimitadores en concatenaciones para evitar falsos positivos
- LET` para nombrar variables y mejorar legibilidad

Un depósito con varias partidas históricas y la necesidad de saber cuál está activa ahora mismo: la más reciente, o la que todavía no tiene fecha de cierre. Es un problema clásico de inventarios, y la comunidad lo resolvió con cuatro fórmulas que enseñan casi todo lo que hay que saber sobre búsquedas multicriteria con BUSCARX.

El problema

La tabla PARTIDAS_AGE guarda, para cada depósito, todas sus partidas con fecha de apertura y fecha de cierre. Se necesita una fórmula que, dado un depósito, devuelva automáticamente su partida activa.

La dificultad es doble: hay que filtrar por depósito y quedarse con el registro más reciente. BUSCARX sin ayuda solo sabe hacer lo primero.

Enfoque 1: condición matricial con MAX

Hugo construye un vector de coincidencia multiplicando dos condiciones:

=BUSCARX(
    1;
    (MAX(SI(PARTIDAS_AGE[Depósito]=[@Deposito]; PARTIDAS_AGE[Fecha apertura]; 0))
        = PARTIDAS_AGE[Fecha apertura])
    * (PARTIDAS_AGE[Depósito]=[@Deposito]);
    PARTIDAS_AGE[Partida]; 0
)

La idea: MAX con un SI calcula la fecha de apertura más alta de ese depósito. Después se compara esa fecha con toda la columna, se multiplica por la condición de depósito, y el resultado es un vector de unos y ceros donde el único uno marca la fila buscada. BUSCARX busca ese 1.

Es un patrón muy sólido: multiplicar condiciones booleanas equivale a un Y lógico aplicado a toda la columna de golpe.

Enfoque 2: clave concatenada y búsqueda inversa

Leo simplifica con una técnica distinta: fabricar una clave compuesta y aprovechar el modo de búsqueda inversa de BUSCARX.

=BUSCARX(
    [@Deposito] & MAX(([@Deposito]=PARTIDAS_AGE[Depósito]) * PARTIDAS_AGE[Fecha de Cierre]);
    PARTIDAS_AGE[Depósito] & PARTIDAS_AGE[Fecha de Cierre];
    PARTIDAS_AGE[Partida]; ""; ; inverso
)

Donde inverso representa el modo de búsqueda con valor menos uno, que recorre la tabla del último registro al primero. Si hay varias filas con la misma clave, devuelve la más reciente en el orden de la tabla.

La concatenación de depósito y fecha crea un identificador único por fila, y MAX sobre el producto de condiciones calcula la fecha de cierre máxima de ese depósito. Es el equivalente moderno a un INDICE con COINCIDIR multicriteria, en una sola función.

Enfoque 3: el delimitador que evita falsos positivos

John detecta un riesgo real en la concatenación anterior y lo arregla:

=LET(
    d; [@Deposito];
    rd; PARTIDAS_AGE[Depósito];
    rc; PARTIDAS_AGE[Fecha de Cierre];
    BUSCARX(d & "-" & MAX((d=rd) * rc); rd & "-" & rc; PARTIDAS_AGE[Partida]; ; ; inverso)
)

El añadido es ese & "-" &. Sin delimitador, concatenar valores numéricos puede producir coincidencias falsas: el depósito 1 con la fecha 23456 genera la misma cadena que el depósito 12 con la fecha 3456. Un guion entre medias hace imposible la colisión.

Es un detalle pequeño que evita errores silenciosos, del tipo que solo se descubre meses después cuando alguien nota que un dato no cuadra. Siempre que concatenes claves, mete un separador que no pueda aparecer en los datos.

Enfoque 4: la versión que ganó

John cierra con una alternativa que busca directamente por fecha de apertura máxima, sin concatenar nada:

=LET(
    b; PARTIDAS_AGE[Fecha apertura] * (PARTIDAS_AGE[Depósito]=[@Deposito]);
    SI(MAX(b); BUSCARX(MAX(b); b; PARTIDAS_AGE[Partida]; ; ; inverso); "")
)

La variable b es la columna de fechas de apertura anulada en las filas de otros depósitos: multiplicar por la condición deja la fecha donde coincide y cero donde no. A partir de ahí, MAX(b) es la fecha buscada y BUSCARX la localiza dentro del propio vector b.

El SI(MAX(b); ...) de fuera es la red de seguridad: si el depósito no tiene ninguna partida, MAX vale cero, la condición se evalúa como falsa y devuelve vacío en lugar de un error.

Tanto Leo como John coinciden en que esta es la mejor: se lee de arriba abajo, no depende de concatenaciones y contempla el caso sin resultados.

Funciones clave

  • BUSCARX — su sexto argumento controla el sentido de búsqueda; el modo inverso devuelve la última coincidencia
  • MAX — combinado con condiciones booleanas, localiza el registro más reciente de un subconjunto
  • LET — nombra los vectores intermedios y convierte una fórmula ilegible en una legible
  • SI — gestiona el caso sin coincidencias antes de que dé error

Conclusión

De este caso salen tres reglas que valen para cualquier búsqueda multicriteria: multiplicar condiciones booleanas para combinarlas, usar delimitadores al concatenar claves, y contemplar siempre el caso vacío.

Y una lección de fondo: la fórmula más ingeniosa no siempre es la que se queda. En la comunidad de InflueXcel ganó la más legible.

Más casos con estas funciones

Más contenido de Excel en InflueXcel