Traducir el blog

Cómo calcular la edad y el día de la semana antes de 1900

Esta entrada del blog es la segunda de la trilogía sobre el cálculo de fechas anteriores al año 1900 con funciones en VBA. La trilogía explica:

A) Cómo calcular fechas antes de 1900 en Excel y VBA

B) Cómo calcular la edad y el día de la semana antes de 1900

C) Calendario Perpetuo desde antes de 1900


En esta entrada explicaré cómo calcular la edad y el día de la semana y a restar fechas anteriores al año 1900:

1) Formatos de celdas con fechas

2) Día de la semana en Excel y en VBA

3) Calcular diferencia de fechas en días

4) Calcular la edad en años

5) Plantilla con fechas Excel y VBA

 

1) Formatos de celdas con fechas

En las celdas de Excel se permiten fechas desde el 1 de enero de 1900 aunque, como ya sabemos por el primer artículo de esta trilogía, la primera fecha válida es el 1 de marzo de 1900.



La competencia se ha adelantado a Excel, pues permite fechas con números de serie negativos en sus celdas:

  • LibreOffice Calc permite fechas desde el día 15 de octubre de 1582, que es el primer día del Calendario Gregoriano.

  • Google Sheets permite las fechas del Calendario Gregoriano y desde el 1 de enero de -1, que deberían ser convertidas al Calendario Juliano.

Excel obliga a usar macros en VBA para poder tratar los números de serie negativos, como variables tipo Date en VBA, como se comentó en el primer artículo de esta trilogía, y es lo que vamos a hacer a continuación.

Para saber más sobre fechas en Excel puedes leer estos dos artículos en inglés:

How to Work with Dates Before 1900 in Excel

How to calculate ages before 1/1/1900 in Excel


Pero lo mejor es seguir leyendo...


2) Día de la semana en Excel y en VBA

Ya sabemos todos que para obtener el nombre del día de la semana en Excel, a partir de una celda con una fecha, la fórmula apropiada es:

=TEXTO(fecha;"dddd")

Pero esta fórmula sólo funciona para fechas a partir del 1 de marzo de 1900.

En el archivo (a descargar en el apartado 5) he preparado un ejercicio con las fechas en Excel y VBA que me sirvió para ayudar a responder sobre este asunto en el foro de ayudaexcel.com:

Calcular el día de la semana en fechas anteriores a 1900

Un usuario necesitaba saber el día de la semana (lunes, martes, miércoles...) de fechas anteriores a 1900, para lo que preparé un archivo con 3 macros en un módulo VBA.

La función ObtenerDíaSemanaISO() devuelve el día de la semana, si se le pasa una cadena de texto en formato ISO 8601, llamando a las funciones ObtenerNúmDíaSemanaISO() y ObtenerSerieFechaISO()

Es fácil convertir una string con una fecha en formato de texto al formato estándar ISO, lo que se puede ver en la hoja 'Fechas' del archivo que se puede descargar en el apartado 5) de esta entrada.

Si la fecha está en formato fecha, o en formato fecha sin convertir a ISO 8601, se deben usar las siguientes funciones:

Para obtener el número de serie de una fecha:

=ObtenerSerieFechaVBA($A2;ESNUMERO($A2))

Para obtener el día de la semana de una fecha:

=ObtenerDíaSemanaVBA($A2;ESNUMERO($A2))

Los cálculos están en la hoja 'Día Semana':

Como el año 1900 no fue bisiesto, devuelve error para el 29 de febrero.


3) Calcular diferencia de fechas en días

Para calcular la diferencia entre dos fechas en días se puede usar una función no documentada, herencia de Lotus 123, que se puede consultar en el siguiente enlace:

Calcular la diferencia entre dos fechas

La función SIFECHA, en inglés DATEDIF, permite calcular la diferencia en días, semanas, meses y años entre dos fechas. Por ejemplo, para calcular los días:

=SIFECHA("1-01-2014";"6-05-2016";"d")

El tercer argumento indica, con la letra "d", que la diferencia está expresada en días.

La forma más fácil de obtener los días es restar las fechas:

=ENTERO(Fecha1 - Fecha2)

De cualquiera de las maneras, si intentamos calcular los días para una o dos fechas anteriores al año 1900, nos dará error de valor: #¡VALOR! pues Excel no funciona con números de serie de fecha negativos.

Para años anteriores a 1900 se deben usar macros en VBA con la función:

= DateDiff("d", dtFecha1, dtFecha2)

Y eso se ha hecho en el archivo descargable, en el módulo "ModRestarFechas1900":

Function RestarFechas(sFecha1 As String, sFecha2 As String) As Long

que usa las funciones DateValue y DateDiff para calcular el número de días entre fechas desde el 1 de enero del año 100 hasta el 31 de diciembre de 9999, como se puede ver en la hoja 'Edad':

En color de fondo naranja, las fechas con dos cifras para el año, que se tranforma en los años 1930 y 1980. En color amarillo la fecha actual con la función: =HOY()

Si "Fecha Final" está vacía, toma esa fecha como la actual.

La columna con el cálculo de la Edad se explica en el siguiente apartado.


4) Calcular la edad en años

El cálculo de la edad en años se puede hacer con la siguiente fórmula para dos celdas de Excel:

=ENTERO(FRAC.AÑO(A1;B1))

Otra fórmula es usar el tercer argumento para años "y" de la función no documentada que ya conocemos:

=SIFECHA(A1;B1;"y")

Pero seguimos teniendo el problema de que las fechas en las celdas sólo sirven para números de serie positivos de fechas. 

Para años anteriores a 1900 se deben usar macros en VBA con la función:

DateDiff("yyyy", dtFecha1, dtFecha2)

Y eso se ha hecho en el archivo descargable, en el módulo "ModRestarFechas1900":

Function ObtenerEdad(sFechaNacimiento As String, sFechaCálculo As String) As Long

que usa las funciones DateValue y DateDiff para calcular el número de años entre fechas, desde el 1 de enero del año 100 hasta el 31 de diciembre de 9999, como se puede ver en la hoja 'Edad'.

Esta función me sirvió para ayudar en el foro de ayudaexcel.com:

Cómo restar dos fechas si alguna es anterior al año 1900


5) Plantilla con fechas Excel y VBA

Descarga la plantilla totalmente gratuita, con las macros visibles y las hojas protegidas sin contraseña, desde Google (con el botón "Excel Download") o desde el enlace a Microsoft OneDrive:

Fechas anteriores a 1900 PW1.xlsm 


La voz del usuario de Excel

He votado y comentado la siguiente sugerencia "Dates prior to 1900" en Excel UserVoice para poder usar fechas con número de serie negativo en las celdas. La sugerencia lleva desde el 27 de septiembre de 2015. En 5 años Microsoft Excel no ha dicho ni pío, cuando la competencia de Google Sheets y LibreOffice Calc funcionan perfectamente con todo el Calendario Gregoriano.

¿Me ayudas a que esta sugerencia sea popular, votando también?

Microsoft Excel UserVoice: Dates prior to 1900

Actualización 2022-06-06: Esa página provoca el Error 404: Page Not Found.

Microsoft ha borrado intencionadamente UserVoice, y ha desaparecido todo el historial de sugerencias enviadas por los usuarios de Office, con lo que se han perdido todos los votos de los últimos años.

Desde hace 7 meses Microsoft ha creado un nuevo portal de Feedback (en inglés), donde compartir comentarios y ayudar a hacer mejoras y crear nuevos productos, con lo que he vuelto a escribir un comentario y votar por esta sugerencia:

Dealing with dates before 1900 · Community (microsoft.com)

Atento a la próxima entrada donde explicaré cómo hacer un calendario para meses anteriores al año 1900.

Cómo calcular fechas antes de 1900 en Excel y VBA

🔝To translate this blog post to your language, select it in the top left Google box.


Desde que me dedico en serio a los cálculos me ha apasionado la conversión de fechas, con sus días y sus horas.

Esta entrada del blog es la primera parte de una trilogía sobre el cálculo de fechas anteriores al año 1900 con funciones en VBA. La trilogía explicará:

A) Cómo calcular fechas antes de 1900 en Excel y VBA

B) Cómo calcular la edad y el día de la semana antes de 1900

C) Calendario Perpetuo desde antes de 1900

En esta entrada explicaré lo que interesa conocer sobre las fechas en Excel y en VBA para poder calcular correctamente las fechas anteriores y posteriores al año 1900:

1) Fechas correctas y erróneas en Excel

2) Fechas correctas y erróneas en VBA

3) Calendario Gregoriano

4) Fechas según norma ISO 8601

5) Listado de fechas curiosas

6) Plantilla con fechas Excel y VBA

En esta imagen se puede ver cómo se pretenden calcular las fechas anteriores y posteriores al 1 de marzo de 1900, tanto con fórmulas en Excel como con macros  en VBA.

Esta tabla está en la hoja 'Fechas' de la plantilla que se puede descargar al final de esta entrada y donde se puede obtener la fórmula que convierte las fechas en formato ISO 8601. Los números de serie y días de la semana de enero y febrero de 1900 con calculados incorrectamente por Excel, lo que se explica si lees más abajo.


1) Fechas correctas y erróneas en Excel

Excel es una herramienta invaluable para calcular fechas, eso sí, para días desde el 1 de marzo de 1900 hasta el 31 de diciembre de 9999.

En una celda de Excel las fechas se guardan como la parte entera positiva de un número decimal y se define como el número de serie de un día, comenzando en el número de serie 1, que corresponde con el día 1 de enero de 1900, que es incorrectamente calculado por Excel.

Los meses de enero y febrero de 1900 no se deben usar en los cálculos, pues hay un error conocido en Excel para esos dos meses, ya que se definió erróneamente 1900 como año bisiesto, por lo que el primer día correcto para usarlo en los cálculos de fechas en las celdas, fórmulas y funciones de Excel es el 1 de marzo de 1900, con el número de serie 61.

Ver el siguiente enlace donde se explica el error cometido por los desarrolladores de Excel:

En esta tabla se muestran los números de serie admitidos por Excel para el rango de fechas correctas:

Las horas se guardan en la parte decimal del número. De las horas no hablaré en esta entrada por lo que, si quieres saber más sobre las horas, abre el siguiente enlace:


2) Fechas correctas y erróneas en VBA

Para calcular fechas anteriores al 1 de marzo de 1900 vienen en nuestra ayuda las funciones de fecha de VBA, ya que permiten cálculos con fechas anteriores al 1 de marzo de 1900, gracias a que trabajan con números de serie negativos para fechas anteriores al año 1900.

El primer número de serie negativo es el -1 que se corresponde con la fecha del 29 de diciembre de 1899.

El último número de serie negativo es el -657.434 que se corresponde con la fecha del 1 de enero del año 100.

El rango de fechas posible de un tipo de dato Date en VBA es desde el 1 de enero de 100 hasta el 31 de diciembre de 9999.

En esta tabla se muestran los números de serie admitidos por VBA para el rango de fechas correctas:

Para calcular el número de serie en VBA he definido la siguiente función:

=ObtenerSerieFechaISO($B2)

Para calcular el nombre del día de la semana en VBA he definido la siguiente función:

=ObtenerDíaSemanaISO($B2)

El formato de fecha en la celda B2 debe ser según norma ISO 8601, explicada en el apartado 4).


3) Calendario Gregoriano

En este artículo en adelante siempre se representarán las fechas en el Calendario Gregoriano (enlace aquí) ya que el Calendario Juliano (enlace aquí) prácticamente sólo lo usan los historiadores.

Para calcular según el Calendario Juliano se puede estudiar el siguiente enlace:


4) Fechas según norma ISO 8601

Desde este momento voy a seguir la norma internacional ISO 8601 para representar las fechas en formato texto, cosa muy recomendable para fechas anteriores al 1 de marzo de 1900. Este formato de fechas se puede consultar en el siguiente enlace:

La norma ISO 8601 ayuda a eliminar las dudas que pueden surgir de las diversas convenciones, culturas y zonas horarias de días y fechas que afectan a una operación global. Ofrece una forma de presentar fechas y horas claramente definidas y comprensibles tanto para las personas como para las máquinas.

El formato de fechas ISO 8601 es así: AAAA-MM-DD 

En inglés: YYYY-MM-DD

Las cifras están separadas por guiones "-" y las letras representan el año, mes y día, rellenadas con ceros por la izquierda:

  • AAAA o YYYY: son las 4 cifras del año.
  • MM: son las 2 cifras del mes.
  • DD: son las 2 cifras de día.

Por ejemplo, el día 2000-02-29 fue el 29 de febrero de 2000.


5) Listado de fechas curiosas

La siguiente tabla está en la hoja 'Año<1900' de la plantilla que se puede descargar al final de esta entrada.

Para no cometer errores, conocidos como bugs en inglés, en el cálculo de fechas se deben tener en cuenta las siguientes fechas, según norma ISO 8601:

  • 9999-12-31 (Nº Serie: 2.958.465) es el último día correcto en Excel y en VBA. A partir de ese día Excel y VBA dejarán de funcionar... (tal y como los conocemos hoy en día).
  • 1900-03-01 (Nº Serie: 61) es el primer día correcto, por lo que puede ser tratado por las funciones de fecha y hora de Excel.
  • 1900-02-29 (Nº Serie: 60 en Excel; 61 en VBA) es una fecha errónea tanto en Excel como en VBA pues el año 1900 no fue bisiesto.
  • 1900-01-01 (Nº Serie: 1 en Excel; 2 en VBA) es el primer día erróneo en Excel y el segundo día correcto en VBA con un número de serie positivo.
  • 1899-12-31 (Nº Serie VBA: 1) es el primer número de serie positivo en VBA. En Excel no existen números de serie negativos.
  • 1899-12-30 (Nº Serie VBA: 0) es el número de serie cero en VBA. 
  • 1899-12-29 (Nº Serie VBA: -1) es el primer número de serie negativo en VBA. 
  • 1752-09-14 (Nº Serie VBA: -53.797) fue el primer día Gregoriano en Inglaterra.
  • 1582-12-20 (Nº Serie VBA: -115.792) fue el primer día Gregoriano en Francia.
  • 1582-10-15 (Nº Serie VBA: -115.858) fue el primer día Gregoriano en España, decretado en Roma por el papa Gregorio XIII, que dio nombre al Calendario Gregoriano.
  • 0100-01-01 (Nº Serie VBA: -657.434)  es el primer día correcto para las funciones de fecha en VBA.
  • 0099-12-31 Fecha interpretada por Excel y VBA por compatibilidad. Cuando el año se representa con 2 cifras de la 30 a la 99 se interpreta como los años 1930 a 1999.
  • 0000-01-01 Fecha interpretada por Excel y VBA por compatibilidad. Cuando el año se representa con 2 cifras de la 00 a la 29 se interpreta como los años 2000 a 2029.

Con estas fechas ¿qué quiero decir?

¡Que no todo vale cuando calculamos con las funciones de fecha!

¡Tanto si hablamos de Excel como de las macros en VBA!

No solo tenemos que tener en cuenta las limitaciones de los números de serie de fechas en Excel, o el límite del año 100 en VBA, sino que debemos asegurar que las fechas se corresponden con fechas del Calendario Gregoriano según el primer día en que se decretó su uso en cada país (en la lista anterior he incluido los 3 días más importantes en que se pasó a usar el Calendario Gregoriano y se dejó de usar el Calendario Juliano.


6) Plantilla con fechas Excel y VBA

Descarga la plantilla totalmente gratuita, con las macros visibles y las hojas protegidas sin contraseña, desde Google (con el botón "Excel Download") o desde el enlace a Microsoft OneDrive:

Fechas anteriores a 1900 PW1.xlsm 

Con ella ya puedes experimentar el placer de dominar las fechas en Excel y en VBA. Puedes escribir un comentario si tienes alguna duda.

Atento a la próxima entrada donde explicaré cómo calcular la edad y el día de la semana si alguna fecha es anterior al año 1900.

Mi lista de blogs