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 coincidenciaMAX— combinado con condiciones booleanas, localiza el registro más reciente de un subconjuntoLET— nombra los vectores intermedios y convierte una fórmula ilegible en una legibleSI— 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
- Multiplicar por coeficientes de escenario con INDICE, COINCIDIRX y SI.CONJUNTO CasoUn miembro de la comunidad tiene una tabla de conceptos con cantidades, precios y un campo "Escenario" (1, 2 o 3). Aparte, tiene una tabla d
- Encontrar en qué columna está el máximo: BYCOL + BUSCARX vs TOMAR + SI CasoA partir de una tabla de datos donde cada fila tiene valores distribuidos en varias columnas con cabeceras compuestas (ej: "Madrid - Ventas"
- Desempaquetar resultado multicolumna de BUSCARX con arrays CasoUn miembro desde Argentina tiene una fórmula =BUSCARX(A22:A28; A2:A11; E2:G11) que busca varios valores a la vez en un rango de tres columna
- Cruzar albaranes entre hojas con AJUSTARFILAS y BUSCARX CasoUn miembro de la comunidad tiene números de albarán en una hoja y, en otra hoja, varias columnas con pares albarán-importe (distribuidos hor
- Del VBA a una sola fórmula: calcular el RFC mexicano con LET, MAP y expresiones regulares CasoHector llega al grupo con un problema que no se ve todos los días: tiene resuelto el cálculo del RFC mexicano, pero lo tiene en VBA, y quier
- BUSCARX con valor devuelto dinámico: elige la columna con un botón o un segmentador CasoUna integrante de la comunidad planteó un reto muy habitual al trabajar con tablas de varias columnas: tiene una lista de municipios con cua
- BUSCARX explicado fácil TutorialDesde la sintaxis básica hasta trucos avanzados como expresiones regulares y cruce de rangos. Además, aprenderás a manejar errores y a usar
- 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á
- Buscar prefijos de longitud variable en otra columna: BYROW, MAP, REGEX y COINCIDIRX CasoInteresante problema planteado por un miembro: tiene una columna A con ~1.200 referencias de longitud variable y una columna C con ~276 text
- Montecarlo en Excel explicado con croissants Tutorial¿Se puede usar Excel para calcular croissants? Sí, y lo hacemos con el método Montecarlo.