Análisis de datos

Eliminar filas en blanco en Google Sheets (2026)

ModelMonkey12 de junio de 202610 min de lectura

Pero "limpiar" y "borrar" no son la misma operación. Elegir mal en un modelo con múltiples pestañas puede costarte una tarde entera reparando referencias rotas.

Por qué las filas en blanco son un problema de modelos financieros

La mayoría de los artículos sobre este tema lo tratan como un problema de formato. En FP&A es un problema de integridad de datos.

Una exportación típica de un ERP o de un CRM inserta filas separadoras en blanco entre secciones. Tu SUMIFS las incluye silenciosamente en su rango, lo que generalmente no importa, hasta que usas algo sensible a la posición como INDEX u OFFSET, o hasta que intentas jalar datos limpios a otra pestaña con una referencia de rango. Ahí es cuando los blancos corrompen el resultado.

Un reporte trimestral para el board que consolida actuals de tres pestañas, cada una con 15-20 filas separadoras dispersas en 400 filas de datos, produce subtotales incorrectos con una frecuencia que sorprende a la mayoría de los analistas. El mecanismo es siempre el mismo: SUMIFS evalúa el rango incluyendo los huecos, y cualquier fórmula sensible a posición como INDEX o OFFSET se desplaza en silencio. No tienes que imaginar el escenario: si estás consolidando pestañas de exportación sin limpiar, ya lo has visto.

Método 1: fórmula FILTER (no destructivo, recomendado para modelos enlazados)

Si tu fuente de datos es una pestaña de importación, una hoja compartida o cualquier cosa con fórmulas que otros también modifican, no borres filas. Crea en cambio una pestaña Datos_Limpios que elimine los blancos por fórmula.

=FILTER('Exportacion_Raw'!A2:G500, 'Exportacion_Raw'!A2:A500<>"")

Esto devuelve cada fila donde la columna A no está vacía. Es un arreglo dinámico: todo el resultado se genera desde una sola celda y se expande automáticamente cuando se agregan filas.

Para los casos en que una fila se considera "en blanco" solo si varias columnas clave están vacías (frecuente en exportaciones de transacciones donde algunos campos son opcionales):

=FILTER('Exportacion_Raw'!A2:G500,
  ('Exportacion_Raw'!A2:A500<>"") * ('Exportacion_Raw'!C2:C500<>""))

La multiplicación funciona como AND: ambas condiciones deben cumplirse. Si necesitas OR (mantener la fila si cualquiera de las columnas clave tiene datos):

=FILTER('Exportacion_Raw'!A2:G500,
  ('Exportacion_Raw'!A2:A500<>"") + ('Exportacion_Raw'!C2:C500<>""))

Con la pestaña limpia lista, tu SUMIFS puede referenciarla de forma segura en todo el modelo:

=SUMIFS('Datos_Limpios'!D:D,
  'Datos_Limpios'!B:B, ">="&Supuestos!$B$3,
  'Datos_Limpios'!B:B, "<="&Supuestos!$C$3,
  'Datos_Limpios'!A:A, "Ingresos")

Sin huecos. Sin desplazamiento de posiciones. La pestaña de supuestos sigue controlando los rangos de fechas.

Método 2: IMPORTRANGE + FILTER para consolidaciones entre archivos

A junio de 2026, FILTER no funciona directamente entre archivos separados de Google Sheets, solo entre pestañas dentro del mismo archivo (Google Sheets Help, "FILTER function", consultado el 12 de junio de 2026, support.google.com/docs/answer/3093197). Este es el caso más frecuente en consolidaciones reales: el archivo maestro de la holding jala de archivos separados de cada subsidiaria o unidad de negocio.

El patrón correcto es anidar IMPORTRANGE dentro de FILTER:

=FILTER(
  IMPORTRANGE("url_del_archivo_fuente","Exportacion_Raw!A2:G500"),
  IMPORTRANGE("url_del_archivo_fuente","Exportacion_Raw!A2:A500")<>"")

El segundo argumento de FILTER debe ser un arreglo del mismo largo que el primero, por eso ambos IMPORTRANGE deben apuntar exactamente al mismo rango de filas. Si el primer argumento va de A2:G500, el criterio también va de A2:A500, no de A1:A500.

Para una consolidación de tres empresas donde cada una vive en su propio archivo:

// En el archivo maestro de consolidación - pestaña Datos_Limpios_MX
=FILTER(
  IMPORTRANGE("url_mx","Transacciones!A2:G1000"),
  IMPORTRANGE("url_mx","Transacciones!A2:A1000")<>"")

// Pestaña Datos_Limpios_CO
=FILTER(
  IMPORTRANGE("url_co","Transacciones!A2:G1000"),
  IMPORTRANGE("url_co","Transacciones!A2:A1000")<>"")

// Pestaña Datos_Limpios_PE
=FILTER(
  IMPORTRANGE("url_pe","Transacciones!A2:G1000"),
  IMPORTRANGE("url_pe","Transacciones!A2:A1000")<>"")

Cada pestaña Datos_Limpios_[país] recibe datos limpios desde su archivo fuente. El P&L consolidado entonces jala de las tres pestañas limpias, no de los archivos originales directamente. Cuando el equipo de contabilidad de México actualiza su archivo, el consolidado se recalcula solo.

Una advertencia sobre rendimiento: cada IMPORTRANGE es una llamada externa, y anidar dos por país en un consolidado de tres países significa seis llamadas cada vez que el archivo recalcula. En la práctica esto es manejable para exportaciones de hasta 2,000 filas por fuente, pero si tienes exportaciones más grandes conviene importar primero a una pestaña intermedia y filtrar desde ahí en lugar de anidar todo en una sola fórmula.

Cómo conectar la capa limpia a un modelo de tres estados

La pestaña Datos_Limpios resuelve algo más que los SUMIFS del P&L. El problema real en modelos enlazados es que el P&L y el Balance General jalas de la misma fuente sucia, y cuando esa fuente tiene filas en blanco dispersas, las referencias entre estados dejan de ser consistentes.

El patrón que funciona es centralizar toda la lógica de limpieza en una sola pestaña y que tanto el P&L como el BS consuman de ahí:

Estructura de pestañas:

Exportacion_Raw  →  Datos_Limpios  →  P&L
                                   →  Balance_General
                                   →  Flujo_de_Caja

El P&L y el BS nunca tocan Exportacion_Raw directamente. Todas sus referencias apuntan a Datos_Limpios.

Este patrón tiene una regla crítica que no siempre se documenta: el P&L y el BS deben filtrar con exactamente el mismo criterio, no versiones ligeramente diferentes de la misma lógica. Cualquier diferencia produce un descuadre entre estados que es difícil de rastrear porque las dos fórmulas parecen correctas por separado.

// En P&L - ingresos del período
=SUMIFS('Datos_Limpios'!D:D,
  'Datos_Limpios'!A:A, "Ingreso",
  'Datos_Limpios'!B:B, ">="&Supuestos!$B$3,
  'Datos_Limpios'!B:B, "<="&Supuestos!$C$3)

// En Balance_General - cuentas por cobrar al cierre
=SUMIFS('Datos_Limpios'!D:D,
  'Datos_Limpios'!A:A, "CxC",
  'Datos_Limpios'!B:B, "<="&Supuestos!$C$3)

Ambas fórmulas usan los mismos rangos de Datos_Limpios y los mismos parámetros de fecha desde Supuestos. Si recibes una exportación nueva del ERP, solo actualizas Exportacion_Raw y los tres estados se recalculan automáticamente sin tocar ninguna fórmula.

Esto es lo que hace que un modelo aguante una revisión de inversionistas cuando piden actualizar los números en la sala: las referencias entre pestañas no se rompen porque todas apuntan a la misma capa limpia, no a la exportación con huecos. Justificar la pestaña extra ante alguien externo que revisa el modelo también es más fácil cuando puedes explicar que centraliza la lógica de limpieza y que sin ella los estados se descuadran.

Método 3: ordenar y borrar (rápido, destructivo, válido para limpiezas puntuales)

Si los datos fuente son tuyos y estás haciendo una limpieza de una sola vez antes de construir el modelo, el truco de ordenar es el camino más rápido:

  1. Selecciona tu rango de datos (incluyendo encabezados).
  2. Datos → Ordenar rango → Ordena por la columna que con mayor probabilidad esté vacía en las filas en blanco.
  3. Los blancos quedan al fondo.
  4. Selecciona y elimina las filas en blanco del fondo.
  5. Vuelve a ordenar por la columna que necesites.

En un dataset de 500 filas tarda menos de 2 minutos. El riesgo es evidente: reordenaste los datos de forma permanente y, si algo más en el archivo referenciaba números de fila específicos, esas referencias ya no son válidas. Revisa las dependencias antes de ordenar. En Sheets puedes buscar el nombre de la pestaña con Ctrl+H para encontrar referencias directas a filas.

Comparativa: qué método usar en cada escenario

EscenarioMétodo recomendado
Exportación de ERP o CRM, fuente compartida o auditadaFórmula FILTER (no destructivo)
Limpieza puntual antes de construir el modeloOrdenar y borrar
Datos en archivos separados (consolidación multi-empresa)IMPORTRANGE + FILTER en pestaña dedicada
Datos limpios para múltiples pestañas downstreamFILTER en una pestaña dedicada Datos_Limpios
Blancos definidos por múltiples columnas, no solo unaFILTER con lógica de multiplicación/suma

El error frecuente: filas parcialmente en blanco

Una "fila en blanco" no siempre está completamente vacía. En un modelo de headcount, la fila de un colaborador que salió puede tener su nombre en la columna A pero vacíos los datos de compensación en las columnas D a G. Tu FILTER sobre la columna A no va a atrapar ese caso.

La solución es definir "en blanco" basándote en la columna que impulsa tus cálculos, no en la columna de etiqueta:

=FILTER('Headcount'!A2:H200,
  'Headcount'!D2:D200<>"")

Aquí la columna D es el salario base. Si está vacía, la fila no importa para el modelo de compensación, sin importar qué haya en el campo de nombre. Este enfoque funciona bien para modelos de margen de contribución donde los SKUs pueden tener nombre pero sin datos de ingresos, o para modelos de pipeline donde los negocios existen pero no tienen fecha de cierre.

Si estás haciendo sensibilidad de runway sobre el ritmo de contratación y algunas filas de headcount son condicionales (contratar solo si cierra la Serie B), filtra esas filas explícitamente en lugar de dejarlas en blanco:

=FILTER('Headcount'!A2:H200,
  ('Headcount'!D2:D200<>"") * ('Headcount'!G2:G200="Confirmado"))

La columna G es el estatus de contratación. Solo las contrataciones confirmadas con datos de salario entran al modelo.

Automatizar la limpieza con IA desde Sheets

Si limpias exportaciones desordenadas con regularidad, el asistente de IA de ModelMonkey puede aplicar la lógica de FILTER, crear la pestaña Datos_Limpios y conectarla con tus fórmulas existentes, todo desde el panel lateral de Sheets, sin necesidad de escribir nada tú mismo.

Ver planes de ModelMonkey - funciona tanto en Google Sheets como en Excel.


Preguntas frecuentes

¿FILTER elimina las filas en blanco del archivo original? No. FILTER devuelve los resultados en una nueva celda o rango sin modificar la fuente. Para eliminar filas del archivo original de forma permanente, necesitas el método de ordenar y borrar.

¿Qué pasa si mis filas "en blanco" tienen espacios invisibles o fórmulas que devuelven cadena vacía? La condición <>"" no atrapa celdas que contienen solo espacios. Si tus exportaciones incluyen ese caso, usa TRIM en la columna de filtro: TRIM('Exportacion_Raw'!A2:A500)<>"". Para celdas con fórmulas que devuelven "", el comportamiento depende de si la fórmula está presente: FILTER las trata como no vacías porque la celda tiene contenido. La solución es limpiar la columna fuente con IFERROR(...,"") y luego aplicar <>"".

¿Puedo usar FILTER para eliminar filas en blanco entre archivos de Google Sheets? No directamente. Primero necesitas traer los datos al archivo activo con IMPORTRANGE, y luego aplicar FILTER sobre ese resultado: =FILTER(IMPORTRANGE("url","Hoja1!A2:G500"), IMPORTRANGE("url","Hoja1!A2:A500")<>""). El segundo argumento de FILTER debe ser un arreglo del mismo largo que el primer argumento, así que ambos IMPORTRANGE deben apuntar al mismo rango de filas.

¿Hay algún límite de rendimiento para IMPORTRANGE + FILTER en consolidaciones grandes? Sí. Cada IMPORTRANGE es una llamada externa que agrega latencia. Para exportaciones de más de 2,000 filas por fuente, es más eficiente importar primero a una pestaña intermedia sin FILTER, y luego aplicar FILTER sobre esa pestaña local. Eso reduce las llamadas externas a una por fuente en lugar de dos, y el recálculo es notablemente más rápido cuando alguien abre el archivo maestro de consolidación.

¿Cómo conecto la pestaña Datos_Limpios con XLOOKUP downstream? Apunta XLOOKUP directamente a las columnas de la pestaña limpia: =XLOOKUP(A2,'Datos_Limpios'!B:B,'Datos_Limpios'!E:E,"No encontrado"). Como FILTER en Datos_Limpios es un arreglo dinámico que se actualiza automáticamente, XLOOKUP siempre busca en el conjunto de datos ya limpio sin necesidad de ajustes adicionales.

¿Cómo justifico la pestaña Datos_Limpios ante alguien externo que revisa el modelo? La explicación directa es que centraliza la lógica de limpieza en un solo lugar. Sin ella, el P&L y el Balance General tendrían que filtrar por separado, y cualquier diferencia mínima entre esas dos lógicas produce un descuadre entre estados. La pestaña extra es la garantía de que ambos estados consumen exactamente la misma versión de los datos.