Contar valores únicos respetando filtros manuales: SUBTOTALES + MAP al rescate

Miki lanza una pregunta que parece sencilla pero esconde un buen reto: ¿cómo contar valores únicos en una columna cuando hay filtros manuales aplicados a la tabla? La función AGREGAR no tiene equivalente a "contar únicos", y las soluciones típicas con UNICOS o CONTAR.SI ignoran los filtros.

Nacho sugiere la línea de ataque: añadir una columna que controle la visibilidad de cada fila con SUBTOTALES y luego UNICOS con FILTRAR sobre esa columna. A partir de ahí, la comunidad desarrolla varias implementaciones.

Gerson propone una fórmula clásica donde SUBTOTALES(3; DESREF(...)) detecta si cada fila es visible:

``
=FILAS(
UNICOS(
SI(
SUBTOTALES(3; DESREF(A1; FILA(A2:A20)-1; ));
A2:A20
)
)
) - 1
`

El truco está en que SUBTOTALES con la función 3 (CONTARA) devuelve 0 para filas ocultas por filtro. DESREF recorre celda a celda para que SUBTOTALES evalúe cada fila individualmente.

Leo propone un enfoque más moderno: usar MAP para crear un vector binario de visibilidad, filtrar el rango original y contar los únicos:

`
=FILAS(
UNICOS(
FILTRAR(
A2:A21;
MAP(A2:A21; LAMBDA(x; SUBTOTALES(103; x)))
)
)
)
`

MAP itera celda a celda y SUBTOTALES(103; x) devuelve 1 si la celda es visible, 0 si está oculta. Luego FILTRAR se queda solo con las visibles y UNICOS + FILAS hace el conteo.

Una tercera variante combina SI con MAP para el mismo resultado sin FILTRAR:

`
=FILAS(
UNICOS(
SI(
MAP(A2:A21; LAMBDA(x; SUBTOTALES(3; x)));
A2:A21
)
)
) - 1
`

Otro ángulo: sumar recíprocos en vez de extraer únicos

Todas las fórmulas anteriores construyen la lista de valores distintos y la cuentan. Hay un camino alternativo que evita UNICOS por completo: si un valor aparece n veces, basta con sumar 1/n por cada una de sus apariciones visibles para que ese valor aporte exactamente 1 al total.

Gerson lo plantea combinando SUBTOTALES + DESREF con CONTAR.SI:

`
=SUMA(SUBTOTALES(3;DESREF(A1;FILA(A2:A11)-FILA(A1);0)) / CONTAR.SI(A2:A11;A2:A11))
`

CONTAR.SI(rango;rango) devuelve la frecuencia de cada valor dentro de su propio rango, así que la división convierte cada aparición en una fracción. Las filas ocultas aportan 0 porque SUBTOTALES las anula antes de dividir.

La misma idea, escrita con funciones modernas y sin DESREF:

`
=SUMA(MAP(A2:A21; LAMBDA(a; SUBTOTALES(103;a) / SUMA(N(A2:A21=a)))))
`

Aquí SUMA(N(rango=a)) hace el papel de CONTAR.SI calculando la frecuencia del valor de cada celda, y SUBTOTALES(103;a) actúa como interruptor de visibilidad. Un detalle a tener en cuenta: al trabajar con divisiones, el resultado puede arrastrar decimales de coma flotante, así que conviene redondear si se va a comparar con un número exacto.

La clave de todas las soluciones es la misma: SUBTOTALES es la única función nativa de Excel que "ve" qué filas están ocultas por filtro. Combinada con MAP o DESREF` para evaluar celda a celda, se desbloquea un mundo de posibilidades para funciones dinámicas que respeten los filtros manuales.

La pregunta que parece fácil

Miki lanzó a la comunidad una duda que suena inocente: ¿cómo contar valores únicos en una columna cuando hay filtros manuales aplicados a la tabla?

El problema tiene dos capas que se dan de bruces la una con la otra:

  • UNICOS y CONTAR.SI cuentan estupendamente valores distintos, pero ignoran por completo si una fila está oculta por un filtro.
  • AGREGAR, que sí respeta los filtros, no tiene equivalente a "contar únicos" entre sus diecinueve funciones disponibles.

Es decir: la función que sabe contar únicos no ve los filtros, y la que ve los filtros no sabe contar únicos.

La clave: SUBTOTALES es la única que "ve" los filtros

Nacho apuntó la línea de ataque, y es el concepto central de todo el caso. SUBTOTALES es la única función nativa de Excel que sabe si una fila está oculta por un filtro.

El truco consiste en usarla no para su propósito habitual (calcular totales que respetan filtros), sino como detector de visibilidad celda a celda. Si consigues un vector de unos y ceros que diga qué filas se ven, el resto es filtrar y contar únicos con normalidad.

A partir de ahí, la comunidad desarrolló tres implementaciones.

Enfoque 1: la versión clásica con DESREF

Gerson propone la solución tradicional, la que funcionaba mucho antes de que existieran las matrices dinámicas:

=FILAS(
    UNICOS(
        SI(
            SUBTOTALES(3; DESREF(A1; FILA(A2:A20)-1; ));
            A2:A20
        )
    )
) - 1

La pieza ingeniosa es DESREF(A1; FILA(A2:A20)-1; ). En lugar de pasarle a SUBTOTALES un rango entero (que devolvería un único número), DESREF genera una referencia por cada fila, obligando a SUBTOTALES a evaluarlas de una en una.

SUBTOTALES con la función 3, que corresponde a CONTARA, devuelve 1 si la celda es visible y 0 si el filtro la oculta. El SI deja pasar solo las visibles, UNICOS quita repetidos y FILAS cuenta.

¿Y el menos uno del final? Las filas ocultas devuelven FALSO, que UNICOS considera un valor distinto más. Ese ajuste descuenta esa entrada fantasma.

Enfoque 2: la versión moderna con MAP

Leo propone el mismo concepto con herramientas actuales, y el resultado se lee mucho mejor:

=FILAS(
    UNICOS(
        FILTRAR(
            A2:A21;
            MAP(A2:A21; LAMBDA(x; SUBTOTALES(103; x)))
        )
    )
)

MAP hace lo que DESREF hacía a la fuerza: recorre el rango celda a celda y aplica SUBTOTALES a cada una por separado. El resultado es un vector limpio de unos y ceros.

Aquí se usa la función 103 en lugar de la 3. Ambas cuentan celdas no vacías, pero las de la serie 100 ignoran además las filas ocultas manualmente, no solo las filtradas. Es la opción más estricta y normalmente la que quieres.

Con el vector de visibilidad, FILTRAR se queda solo con las filas visibles, UNICOS elimina repetidos y FILAS cuenta. Sin ajuste final, porque FILTRAR descarta las filas ocultas en vez de convertirlas en FALSO.

Enfoque 3: MAP sin FILTRAR

Una tercera variante combina las dos ideas anteriores, usando MAP para la visibilidad pero SI en lugar de FILTRAR:

=FILAS(
    UNICOS(
        SI(
            MAP(A2:A21; LAMBDA(x; SUBTOTALES(3; x)));
            A2:A21
        )
    )
) - 1

Vuelve a aparecer el menos uno, por el mismo motivo que en la primera versión: SI sin rama falsa deja FALSO en las filas ocultas, y UNICOS lo cuenta como un valor más.

Sirve bien de puente didáctico entre las otras dos: moderniza el detector de visibilidad pero mantiene la estructura clásica.

Funciones clave

  • SUBTOTALES — la única función nativa que distingue filas visibles de filas ocultas por filtro. Con función 3 o 103 sobre una sola celda, actúa como detector de visibilidad.
  • DESREF — genera una referencia por fila para forzar la evaluación individual. El recurso clásico, antes de MAP.
  • MAP — aplica una LAMBDA elemento a elemento. Sustituto natural y mucho más legible de DESREF para este patrón.
  • FILTRAR — se queda con las filas visibles. Evita el ajuste del menos uno que exige el SI.
  • UNICOS y FILAS — la pareja de siempre para contar valores distintos.

Conclusión

El aprendizaje que se lleva uno de este caso va más allá de contar únicos. Es este: SUBTOTALES aplicado celda a celda te devuelve un vector de visibilidad, y con ese vector puedes hacer que cualquier función dinámica respete los filtros manuales de la tabla.

Contar únicos es solo el primer ejemplo. La misma técnica sirve para promediar únicos, para concatenar los valores visibles o para alimentar un AGRUPARPOR que solo vea lo filtrado.

Casos así son los que mejor representan a la comunidad de InflueXcel: alguien pregunta por un recuento y acaba saliendo un patrón reutilizable en decenas de escenarios distintos.

Más casos con estas funciones

Más contenido de Excel en InflueXcel