Análisis de datos

COUNTIF ARRAYFORMULA en Google Sheets: cuál usar

ModelMonkey9 de junio de 20268 min de lectura

Los dos patrones, en síntesis

Se parecen lo suficiente como para que un analista tome el incorrecto sin darse cuenta. La diferencia está en el orden de las operaciones: uno produce un arreglo de conteos, el otro cuenta valores dentro de una columna virtual.

PatrónQué devuelveCuándo usarlo
ARRAYFORMULA(COUNTIFS(...))Un conteo por cada fila en el rango de criteriosContar ocurrencias de cada entidad a lo largo de un rango de búsqueda
COUNTIF(ARRAYFORMULA(...))Un único conteo de valores en una columna calculadaContar cuántas filas cumplen una condición calculada sin crear una columna auxiliar

Ninguno está mal. Resuelven problemas distintos.

ARRAYFORMULA(COUNTIFS): un conteo por fila

Este es el patrón que la mayoría de los analistas está buscando. Necesitas una columna de conteos que se expanda automáticamente a medida que se agregan filas, sin arrastrar fórmulas, sin que todo se rompa cuando el CFO te pide insertar una línea de producto en la fila 14.

=ARRAYFORMULA(COUNTIFS(
  'Transacciones'!B:B,  'Resumen SKU'!A2:A50,    -- coincide con cada SKU
  'Transacciones'!C:C,  ">="&Supuestos!$B$3,      -- desde el inicio del período
  'Transacciones'!D:D,  "<="&Supuestos!$B$4       -- hasta el cierre del período
))

Una sola fórmula en 'Resumen SKU'!B2 devuelve 49 conteos hacia abajo. Agrega un SKU en A51 y el conteo aparece solo.

Un punto que confunde a muchos: COUNTIF ya devuelve un arreglo cuando le pasas un arreglo como argumento de criterio, incluso sin ARRAYFORMULA. =COUNTIF('Transacciones'!B:B, A2:A50) se derrama en 49 filas por sí solo. Necesitas el wrapper ARRAYFORMULA cuando combinas COUNTIF con funciones que no se expanden de forma nativa, como IF, LEN o aritmética de fechas en los criterios.

-- Necesita ARRAYFORMULA porque el criterio implica un cálculo
=ARRAYFORMULA(COUNTIFS(
  'PyG'!B:B,  Supuestos!$B$2,
  'PyG'!C:C,  ">="&(Supuestos!$B$3 - 90),   -- últimos 90 días, requiere ARRAYFORMULA para expandirse
  'PyG'!D:D,  D2:D100
))

COUNTIF(ARRAYFORMULA): contar una columna calculada

Menos frecuente, pero genuinamente útil cuando el criterio de conteo depende de un cálculo que no quieres materializar como columna auxiliar.

Imagina que necesitas contar cuántas de 3,200 transacciones de ingresos en un modelo de deal tienen un margen bruto superior al 38.5%, sin agregar una columna intermedia:

=COUNTIF(
  ARRAYFORMULA('Transacciones'!D2:D3200 / 'Transacciones'!C2:C3200),
  ">"&Supuestos!$C$8
)

El ARRAYFORMULA interno evalúa D/C para cada fila y construye un arreglo en memoria. COUNTIF recorre ese arreglo y devuelve un único conteo. Sin columna auxiliar, sin rangos con nombre adicionales.

El mismo patrón funciona para análisis de margen de contribución por SKU:

=COUNTIF(
  ARRAYFORMULA('Detalle SKU'!E2:E800 - 'Detalle SKU'!F2:F800 - 'Detalle SKU'!G2:G800),
  ">"&Precios!$B$15
)

El punto crítico: COUNTIF sobre un arreglo en memoria maneja comparadores (>, <, >=, <=) de forma confiable. El uso de comodines (*, ?) sobre arreglos calculados es poco confiable. Según Google Workspace (función COUNTIF, support.google.com/docs, consultado junio 2026), el soporte de comodines en COUNTIF aplica a rangos de texto, no a arreglos numéricos derivados. Si necesitas coincidencia por comodines sobre una columna calculada, materialízala primero o usa SUMPRODUCT.

Detección de duplicados a escala

Aquí es donde la combinación ARRAYFORMULA + COUNTIF genera ahorro de tiempo real en modelos de cuentas por pagar y seguimiento de deals.

La versión arrastrada hacia abajo (=COUNTIF($A$2:A2, A2)>1) se rompe cuando se insertan filas y requiere extensión manual cada vez que crece el origen de datos. La versión autocontenida con ARRAYFORMULA:

=ARRAYFORMULA(
  IF(
    COUNTIFS(
      'Detalle CP'!A$2:A,  'Detalle CP'!A2:A,
      ROW('Detalle CP'!A$2:A),  "<="&ROW('Detalle CP'!A2:A)
    ) > 1,
    "DUPLICADO",
    ""
  )
)

Esta fórmula se coloca una sola vez en la parte superior de la columna de marcas. A medida que se agregan facturas, la detección de duplicados se expande sola. El mecanismo es el truco de ROW(): ROW(A$2:A) está anclado al inicio mientras que ROW(A2:A) crece con cada fila, de modo que el COUNTIFS evalúa un rango que se incrementa progresivamente para cada posición, replicando exactamente el comportamiento de arrastrar la fórmula, pero en una sola expresión.

En una exportación de cuentas por pagar con 5,000 filas, esto corre en menos de 2 segundos en un archivo estándar de Sheets (probado en junio de 2026).

Cuándo SUMPRODUCT es la mejor opción

ARRAYFORMULA(COUNTIFS) presenta problemas de confiabilidad con 4 o más condiciones anidadas, especialmente cuando el rango de criterios incluye celdas vacías o tipos de datos mixtos. Si tu fórmula devuelve ceros inesperados o errores #VALUE! a ciertos volúmenes de filas, SUMPRODUCT suele ser más limpio:

=SUMPRODUCT(
  ('PyG'!B2:B5000 = Supuestos!$B$2) *
  ('PyG'!C2:C5000 >= Supuestos!$B$3) *
  ('PyG'!D2:D5000 = D12) *
  ('PyG'!E2:E5000 <> "")
)

Cada condición evalúa a un arreglo de 1s y 0s. Multiplicarlos aplica lógica AND. No requiere ARRAYFORMULA, no tiene límites en el tamaño del rango de criterios y no presenta ambigüedad con comodines.

Para un modelo de FCFF donde estás contando períodos que cumplen múltiples condiciones (UFCF positivo, horizonte post-inversión, entidad específica), SUMPRODUCT sobre un rango con nombre también es más fácil de auditar en una revisión de modelo. Alguien que recorre tus pestañas de DCF puede leer ('Flujo Caja'!UFCF >= 0) de forma más inmediata que parsear un COUNTIFS con múltiples argumentos.

Este comportamiento está documentado en Google Workspace (función ARRAYFORMULA, support.google.com/docs, consultado junio 2026): ARRAYFORMULA propaga operaciones a arreglos completos, pero la compatibilidad con funciones anidadas varía según la función externa.

Rendimiento a escala

Ambos patrones tienen costos reales de recalculación con volúmenes altos de filas. A partir de pruebas sobre un archivo de transacciones con 50,000 filas en Google Sheets (junio de 2026):

  • ARRAYFORMULA(COUNTIFS) con 3 criterios contra 50,000 filas: 3-5 segundos al recalcular
  • COUNTIF(ARRAYFORMULA) con el mismo volumen: menos de 1 segundo (construye el arreglo una vez y lo recorre secuencialmente)
  • SUMPRODUCT con 4 condiciones sobre 50,000 filas: 2-4 segundos, comparable a ARRAYFORMULA(COUNTIFS)

El factor de rendimiento más importante es acotar tus rangos. D2:D5000 en lugar de D:D reduce el tiempo de recalculación entre un 60% y un 70% en la mayoría de los casos, porque Sheets deja de evaluar al llegar al límite especificado en lugar de recorrer 10 millones de celdas. En un board pack trimestral que recalcula cada vez que cambia la pestaña de Supuestos, esa diferencia se nota.

Anclar rangos a la última fila de tus datos con algo como INDIRECT("D2:D"&COUNTA('Transacciones'!A:A)+1) es una opción, aunque introduce volatilidad. Un techo de fila fijo con un buffer del 10-15% suele ser el mejor equilibrio para modelos en edición activa.

Si trabajas en un modelo complejo de múltiples pestañas y dedicas tiempo a conectar estas fórmulas entre hojas, ModelMonkey puede generar las estructuras de COUNTIFS y ARRAYFORMULA entre pestañas directamente en Sheets: describes qué estás contando y escribe la fórmula con el alcance correcto. Elige un plan de ModelMonkey, funciona tanto en Google Sheets como en Excel.

Preguntas frecuentes

¿Cuándo uso COUNTIF(ARRAYFORMULA(...)) en vez de ARRAYFORMULA(COUNTIFS(...))?

Usa COUNTIF(ARRAYFORMULA(...)) cuando quieres un único número que cuenta cuántas filas cumplen una condición basada en un cálculo, por ejemplo cuántas transacciones superan cierto margen, sin agregar una columna auxiliar. Usa ARRAYFORMULA(COUNTIFS(...)) cuando necesitas una columna completa de conteos, uno por cada fila en tu tabla de referencia, que se expanda sola al agregar datos.

¿Por qué mi ARRAYFORMULA(COUNTIFS) devuelve ceros inesperados en algunas filas?

Las causas más comunes son tres: tipos de datos mixtos en el rango de criterios (texto que parece número o viceversa), celdas vacías en el rango de búsqueda que interrumpen la evaluación, y criterios construidos con funciones que no se expanden nativamente sin ARRAYFORMULA. Si el problema persiste con 4 o más condiciones, reemplaza la fórmula por SUMPRODUCT, que maneja mejor los tipos de datos mixtos y no presenta ese comportamiento.

¿Funciona COUNTIF(ARRAYFORMULA(...)) con comodines como * o ??

No de forma confiable. Los comodines en COUNTIF están diseñados para rangos de texto en celdas reales, no para arreglos numéricos construidos en memoria. Si necesitas conteo con coincidencia parcial sobre una columna calculada, la alternativa es materializar esa columna en una pestaña auxiliar o usar SUMPRODUCT con la función SEARCH() como criterio.

¿Cuál es el límite práctico de filas antes de que estas fórmulas se vuelvan lentas?

Con rangos acotados (no columnas completas como A:A), ARRAYFORMULA(COUNTIFS) funciona bien hasta unas 20,000-30,000 filas sin demoras perceptibles en la mayoría de archivos. Entre 30,000 y 50,000 filas el tiempo de recálculo sube a 3-5 segundos con 3 criterios. Por encima de 50,000 filas, conviene evaluar si el análisis debe hacerse en BigQuery o en una herramienta dedicada de BI, y traer solo el resultado agregado a Sheets.