10 diciembre, 2023

AÑADIR A UNA FECHA AÑOS, MESES Y DÍAS UTILIZANDO DATEADD O DATESERIAL EN VBA

Hola a todos!, qué tal estáis?

Como continuación al post anterior en el que comentaba cómo se pueden crear fechas utilizando la función DateSerial, en el post de hoy vamos a continuar trabajando con esta función pero para realizar otra tarea, es decir, para añadir o (restar) años, meses y días a una fecha.

Efectivamente, con esta función vamos a poder realizar nuestro objetivo. Imaginad que, como indicamos en el post anterior, hemos creado unas fechas a partir de las columnas de año, mes y día y resulta que vamos a utilizar la columna E para añadir o restar días, meses o años:

AÑADIR A UNA FECHA AÑOS, MESES Y DÍAS UTILIZANDO DATEADD O DATESERIAL EN VBA

Para realizar esto, lo vamos a poder hacer con DateSerial y también con otra función DateAdd (os dejo los enlaces a Microsoft).

Por lo tanto, vamos a crear dos columnas para los días, meses y año, una para cada función:

AÑADIR A UNA FECHA AÑOS, MESES Y DÍAS UTILIZANDO DATEADD O DATESERIAL EN VBA_1

Aquí os dejo la macro que realiza nuestro trabajo:

Option Explicit
Sub AÑADE()
'Declaramos variables
Dim Fin As Long, i As Long
With Sheets("Hoja1")
Fin = Application.CountA(.Range("A:A"))
'con un for vamos realizando los cálculos
For i = 2 To Fin
'Componemos fecha con dateserial
.Cells(i, 4) = DateSerial(.Cells(i, 1), .Cells(i, 2), .Cells(i, 3))
'Añadimos días don dateserial y dateadd
.Cells(i, 6) = DateSerial(Year(.Cells(i, 4)), Month(.Cells(i, 4)), Day(.Cells(i, 4)) + .Cells(i, 5))
.Cells(i, 7) = DateAdd("D", .Cells(i, 5), .Cells(i, 4))
'Añadimos meses don dateserial y dateadd
.Cells(i, 8) = DateSerial(Year(.Cells(i, 4)), Month(.Cells(i, 4)) + .Cells(i, 5), Day(.Cells(i, 4)))
.Cells(i, 9) = DateAdd("M", .Cells(i, 5), .Cells(i, 4))
'Añadimos años don dateserial y dateadd
.Cells(i, 10) = DateSerial(Year(.Cells(i, 4)) + .Cells(i, 5), Month(.Cells(i, 4)), Day(.Cells(i, 4)))
.Cells(i, 11) = DateAdd("YYYY", .Cells(i, 5), .Cells(i, 4))
Next i
End With
End Sub

Como podéis observar las dos funciones nos sirven para añadir o restar días, meses o años a nuestra fecha inicial.

Sin embargo, si bien con la función DateSerial podemos sumar en la misma sentencia los días, los meses y los años, (en este ejemplo lo hago por separado):

.Cells(i, 6) = DateSerial(Year(.Cells(i, 4)), Month(.Cells(i, 4)), Day(.Cells(i, 4)) + .Cells(i, 5))

Es decir, podríamos sumar al mismo tiempo los años o los meses. Y esto lo podríamos hacer también con DateAdd, pero programando: AÑADIR AÑOS, MESES Y DÍAS A UNA FECHA EN VBA 

Aunque para este ejemplo, me gustaría tratar el comportamiento de ambas funciones por separado.

En caso de Dateserial, basta con sumar a la función que corresponda los días, los meses o los años.

En al caso de DateAdd debemos especificar si se trata de Años («YYYY»), meses («M») o días «D».

Como podéis ver en el resultado de la macro, el resultado es idéntico en ambos casos, pero existe una diferencia. Esta la vamos a encontrar en los años bisiestos.

AÑADIR A UNA FECHA AÑOS, MESES Y DÍAS UTILIZANDO DATEADD O DATESERIAL EN VBA_2

Por ejemplo, para la fecha 29/02/2016 que fue año bisiesto, donde Febrero tuvo 29 días, ambas funciones ofrecen el mismo resultado cuando aplicamos a días y meses, pero en el caso de añadir años, la cosa cambia:

Por ejemplo, si añadimos a esa fecha 1 año, el resultado con DateSerial es 01/03/2017 mientras que con DateAdd es: 28/02/2017 ¿cuál es el correcto?

Si restamos 1 año, con DateSerial el resultado es: 01/03/2015, mientras que con DateAdd es: 28/02/2015 ¿cuál es el correcto?

Si añadimos 365 años, el resultado es 01/03/2381 con DateSerial y 28/02/2381 con DateAdd. ¿Cuál es el correcto?.

Probablemente no se pueda hablar de correcto o incorrecto, sino adecuado y no adecuado. Y en cualquier caso, el resultado que sería más lógico es el que nos devuelve la función DateSerial, es decir el día 1 del mes siguiente, dado que si no se trata de año bisiesto el día 29 de febrero no existe y por lo tanto equivaldría al 1 de marzo.

Sin embargo es más una cuestión de criterio que de resultado, aunque me parece interesante indicarlo en este post y ponerlo de manifiesto para que lo tengáis en cuenta en vuestros cálculos a la hora de añadir años a una fecha y las funciones a emplear.

Descarga el archivo de ejemplo pulsando en: AÑADIR A UNA FECHA AÑOS, MESES Y DÍAS UTILIZANDO DATEADD O DATESERIAL EN VBA

¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.

Donate Button with Credit Cards

¡¡Muchas gracias!!

Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies

Comparte este post

Si te ha gustado o tienes alguna duda, puedes dejar aquí tu comentario.

Este sitio web utiliza cookies para que usted tenga la mejor experiencia de usuario. Si continúa navegando está dando su consentimiento para la aceptación de las mencionadas cookies y la aceptación de nuestra política de cookies, pinche el enlace para mayor información.plugin cookies

ACEPTAR
Aviso de cookies