Evitar 1/1/1900 al apilar tablas con fechas vacías usando APILARV

Fernando tiene varias tablas auxiliares que combina con APILARV en una tabla resumen. El problema: cuando un campo de fecha está vacío, aparece una fecha de enero de 1900, la que todo el mundo llama «el 1/1/1900». Excel guarda las fechas como números, un vacío llega a APILARV como 0, y el 0 con formato de fecha se ve como 00/01/1900: el día anterior al 1 de enero de 1900.

Solución rápida con SI (Leo): envuelve el resultado de APILARV en SI para sustituir los ceros por vacío:

``
=LET(
apil; APILARV(tabla1; tabla2; tabla3);
SI(apil = 0; ""; apil)
)
`

La comparación con cero va escrita a propósito: así los textos (conceptos, nombres) pasan intactos. Y ojo, que también vacía los importes que valen cero de verdad; si los hay, aplica el SI solo a la columna de fecha.

Pero Fernando tiene un segundo problema: ¿qué pasa cuando una tabla auxiliar está completamente vacía (sin datos ese mes)? APILARV falla si intentas apilar un rango sin filas.

Solución dinámica con REDUCE + INDIRECTO (Perú): recorre los nombres de las tablas con REDUCE, comprueba si cada una tiene datos, y solo apila las que contengan filas:

`
=LET(
nombres; {"tabla1"; "tabla2"; "tabla3"};
EXCLUIR(
REDUCE(0; nombres; LAMBDA(a; n;
SI(CONTARA(INDIRECTO(n)) > 0;
APILARV(a; TOMAR(INDIRECTO(n); -CONTARA(INDIRECTO(n&"[campo]"))));
a
)
)); 1
)
)
`

Joan Recasens aporta un truco de formato como alternativa cosmética: el formato personalizado dd/mm/aaaa;;; oculta visualmente los ceros sin cambiar la fórmula.

Nota (corregido el 26/9/2026): en el hilo la fórmula salió como SI(apil; apil; ""). Funciona mientras todas las columnas sean números o fechas, pero en cuanto hay una de texto la llena de #¡VALOR!, porque SI no sabe si un texto es verdadero o falso. Comparar con cero, SI(apil = 0; ""; apil)`, lo evita. Comprobado en Excel.

Apilas varias tablas auxiliares con APILARV para montar un resumen y, donde debería haber una fecha vacía, aparece una de enero de 1900: la que todo el mundo llama el 1/1/1900. Fernando llevó el caso a la comunidad y la conversación acabó resolviendo dos problemas distintos: el cosmético y el estructural.

Por qué aparece 1/1/1900

Excel almacena las fechas como números: el día 1 es el 1 de enero de 1900. Cuando APILARV toma una celda vacía de un campo de fecha, la interpreta como cero, y ese cero formateado como fecha se muestra como 00/01/1900: un «día cero» de enero, el anterior al 1, que casi todo el mundo lee como el 1 de enero.

No es un fallo de APILARV: es la consecuencia natural de que un hueco valga cero y de que el formato de la columna sea de fecha.

Solución rápida: convertir los ceros en vacío

Leo ataca el síntoma con un SI que envuelve el resultado completo:

=LET(
    apil; APILARV(tabla1; tabla2; tabla3);
    SI(apil = 0; ""; apil)
)

La comparación con cero va escrita a propósito. En el hilo salió la versión corta, SI(apil; apil; ""), que aprovecha que un número vale falso cuando es cero. Pero en cuanto una de las tablas tiene una columna de texto (un concepto, un nombre), esa columna se llena de #¡VALOR!, porque SI no sabe si un texto es verdadero o falso. Comparar con cero no tiene ese problema: los textos pasan intactos.

Ojo con una consecuencia: esto también convierte en vacío cualquier importe que valga cero legítimamente. Si tu tabla mezcla fechas y números donde el cero es un valor válido, aplica el SI solo a las columnas de fecha en lugar de a la matriz entera.

El segundo problema: tablas completamente vacías

Fernando descubre entonces un obstáculo mayor. Si una de las tablas auxiliares no tiene ninguna fila (ese mes no hubo movimientos), APILARV falla directamente. No hay nada que apilar y la fórmula entera se cae.

Esto ya no es cosmético: rompe el resumen.

Solución dinámica: REDUCE con INDIRECTO

Perú propone recorrer los nombres de las tablas y apilar solo las que tengan datos:

=LET(
    nombres; {"tabla1"; "tabla2"; "tabla3"};
    EXCLUIR(
        REDUCE(0; nombres; LAMBDA(a; n;
            SI(CONTARA(INDIRECTO(n)) > 0;
                APILARV(a; TOMAR(INDIRECTO(n); -CONTARA(INDIRECTO(n & "[campo]"))));
                a
            )
        )); 1
    )
)

Cómo funciona:

  • La constante matricial nombres guarda los nombres de las tablas como texto
  • REDUCE los recorre arrastrando un acumulador a que arranca en 0
  • INDIRECTO(n) convierte cada nombre de texto en una referencia real a esa tabla
  • CONTARA(INDIRECTO(n)) > 0 comprueba si la tabla tiene contenido
  • Si lo tiene, APILARV la añade al acumulado; si no, devuelve el acumulado sin tocar y sigue
  • TOMAR(...; -CONTARA(...)) recorta la tabla a sus últimas filas realmente rellenas
  • EXCLUIR(...; 1) elimina la primera fila, que es el 0 inicial del acumulador

La gracia del enfoque es que la lista de tablas está en la propia fórmula como texto. Añadir una tabla nueva al resumen es añadir su nombre a la constante matricial, sin tocar la lógica.

INDIRECTO tiene fama de lenta y de romperse al mover cosas, y es merecida. Pero en este escenario concreto (una lista de nombres que hay que resolver en tiempo de cálculo) es la herramienta que hace posible la iteración.

La alternativa cosmética: formato personalizado

Joan Recasens aporta la solución más barata de todas para el problema original, sin tocar una sola fórmula. Aplica a las celdas este formato personalizado:

dd/mm/aaaa;;;

Los tres puntos y coma finales dividen el formato en cuatro secciones: positivos, negativos, ceros y texto. Al dejar vacías las tres últimas, los ceros no se muestran.

Es puramente visual: el valor sigue siendo cero y seguirá contando en cualquier fórmula que lo referencie. Para un informe destinado a imprimirse o presentarse, cumple perfectamente. Para datos que van a alimentar otros cálculos, mejor arreglarlo en la fórmula.

Funciones clave

  • APILARV — apila tablas verticalmente; falla si una está vacía
  • LET — nombra el resultado apilado para no repetirlo
  • REDUCE — recorre la lista de tablas decidiendo cuáles apilar
  • INDIRECTO — convierte un nombre de tabla en texto en una referencia usable
  • CONTARA — detecta si una tabla tiene contenido
  • TOMAR — recorta a las últimas filas con datos
  • EXCLUIR — quita el valor inicial del acumulador

Conclusión

El caso enseña a separar dos preguntas que se confunden a menudo: qué valor tiene una celda y cómo se muestra. Un formato personalizado arregla lo segundo en diez segundos; solo la fórmula arregla lo primero.

En la comunidad de InflueXcel este tipo de matices salen solos, porque cada uno aporta la solución desde su forma de trabajar.

Más casos con estas funciones

Más contenido de Excel en InflueXcel