Filtro multicriteria dinámico con LET, FILTRAR y LAMBDA

Hector comparte con la comunidad una fórmula avanzada para filtrar una tabla de productos/servicios por múltiples criterios opcionales (clave, descripción y palabras similares). Lo interesante del caso es que los filtros son dinámicos: si un campo de búsqueda está vacío, se ignora ese criterio.

La primera versión usa una función auxiliar LAMBDA dentro de LET que devuelve 1 cuando el campo de búsqueda está vacío (para no filtrar por ese criterio) o evalúa HALLAR cuando hay un valor:

``
=LET(
f, LAMBDA(_value,_rango, SI(_value="", 1, ESNUMERO(HALLAR(_value, _rango)))),
_mFiltrada, FILTRAR(tblProductoServicio,
f(B2, tblProductoServicio[c_ClaveProdServ])
f(B3, tblProductoServicio[Descripcion])
f(B4, tblProductoServicio[Palabras_similares])),
_result, SI.ERROR(
EXCLUIR(_mFiltrada,,-2),
SI.ERROR(LET(
CveProducto, SI(B2="", SECUENCIA(CONTARA(tblProductoServicio[c_ClaveProdServ])),
tblProductoServicio[c_ClaveProdServ]=B2),
Descripcion, ESNUMERO(HALLAR(B3, tblProductoServicio[Descripcion])),
Similar, ESNUMERO(HALLAR(B4, tblProductoServicio[Palabras_similares])),
FILTRAR(tblProductoServicio[[c_ClaveProdServ]:[Material Peligroso]],
CveProductoDescripcionSimilar)),
"No hay registros")),
_result)
`

Tras iterar, Hector refina la fórmula a una versión más legible, añadiendo una validación para el caso en que todos los campos de búsqueda estén vacíos (devuelve la tabla completa):

`
=LET(
f, LAMBDA(_value, _rango, SI(_value = "", 1, ESNUMERO(HALLAR(_value, _rango)))),
todosVacíos, Y(B2 = "", B3 = "", B4 = ""),
_mFiltrada, SI(todosVacíos,
tblProductoServicio,
FILTRAR(tblProductoServicio,
f(B2, tblProductoServicio[c_ClaveProdServ])
f(B3, tblProductoServicio[Descripcion])
f(B4, tblProductoServicio[Palabras_similares]))),
_resultado, SI.ERROR(EXCLUIR(_mFiltrada,,-2), "No hay registros"),
_resultado)
``

Un patrón muy útil para crear buscadores interactivos en Excel sin macros.

El problema: un buscador con filtros opcionales

Hector quería montar en Excel un buscador de productos que filtrara por varios criterios a la vez —clave, descripción y palabras similares— pero con una condición práctica: si dejas un campo de búsqueda en blanco, ese criterio debe ignorarse, no descartar todas las filas. Es el comportamiento natural de cualquier formulario de búsqueda, y conseguirlo con fórmulas tiene una trampa: HALLAR sobre un texto vacío encuentra "" en cualquier celda, así que un criterio en blanco, en vez de no filtrar, lo "aprueba todo" de forma engañosa.

La idea central: una LAMBDA que decide si filtrar

La pieza clave es una función auxiliar f que encapsula la regla "si el campo está vacío, no filtres":

=LET(
    f; LAMBDA(_value; _rango; SI(_value=""; 1; ESNUMERO(HALLAR(_value; _rango))));
    _mFiltrada; FILTRAR(tblProductoServicio;
        f(B2; tblProductoServicio[c_ClaveProdServ]) *
        f(B3; tblProductoServicio[Descripcion]) *
        f(B4; tblProductoServicio[Palabras_similares]));
    EXCLUIR(_mFiltrada;; -2)
)

Cuando el campo _value está vacío, f devuelve 1 (verdadero para toda la columna: no filtra). Cuando tiene contenido, evalúa ESNUMERO(HALLAR(...)), que da verdadero solo en las filas donde el texto aparece. Al multiplicar los tres resultados se logra un Y lógico entre los criterios activos: una fila sobrevive solo si cumple todos los que están rellenos. EXCLUIR(...;; -2) recorta las últimas columnas auxiliares del resultado.

Segundo refinamiento: mostrar todo si no hay nada escrito

Hector afinó la fórmula para cubrir el caso extremo —todos los campos vacíos— devolviendo la tabla completa en lugar de un resultado ambiguo:

=LET(
    f; LAMBDA(_value; _rango; SI(_value=""; 1; ESNUMERO(HALLAR(_value; _rango))));
    todosVacios; Y(B2=""; B3=""; B4="");
    _mFiltrada; SI(todosVacios;
        tblProductoServicio;
        FILTRAR(tblProductoServicio;
            f(B2; tblProductoServicio[c_ClaveProdServ]) *
            f(B3; tblProductoServicio[Descripcion]) *
            f(B4; tblProductoServicio[Palabras_similares])));
    SI.ERROR(EXCLUIR(_mFiltrada;; -2); "No hay registros")
)

El indicador todosVacios con Y(...) comprueba si los tres campos están en blanco; si es así, se muestra la tabla entera. Y SI.ERROR envuelve el resultado para que, cuando ninguna fila cumpla, aparezca un mensaje claro en vez de un error.

Por qué es un patrón reutilizable

Lo potente de esta solución es que la LAMBDA f es genérica: sirve para cualquier número de criterios opcionales. Añadir un cuarto filtro es tan simple como multiplicar por f(B5; tblProductoServicio[OtroCampo]). Toda la lógica de "ignorar vacíos" vive en un único sitio, y el filtro final se construye multiplicando condiciones, que es la forma canónica de combinar máscaras booleanas en Excel moderno.

Funciones clave

  • LAMBDA: encapsula la regla "vacío = no filtrar" en una función reutilizable.
  • FILTRAR: aplica la máscara booleana resultante de multiplicar los criterios.
  • ESNUMERO + HALLAR: comprueban si el texto buscado aparece en cada campo.
  • LET y SI.ERROR: ordenan la fórmula y controlan el caso "sin resultados".

Conclusión

Un buscador multicriterio con campos opcionales no necesita macros ni tablas dinámicas: basta una LAMBDA que neutralice los criterios vacíos y una multiplicación de condiciones dentro de FILTRAR. Es un patrón que puedes copiar tal cual para cualquier formulario interactivo. Ideas así se cuecen a diario en la comunidad de InflueXcel.

Más casos con estas funciones

Más contenido de Excel en InflueXcel