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

Anuncios

CREAR UNA FECHA CON DATESERIAL EN VBA

Hola a todos:

En muchas ocasiones cuando estamos programando en VBA necesitamos crear o componer fechas a partir de columnas independientes en las que se guardan años, meses y días, por ejemplo:

CREAR UNA FECHA CON DATESERIAL EN VBA

Esto lo podemos hacer de dos formas, o bien componemos la fecha y aplicamos formato fecha con la función CDate o bien lo hacemos con DateSerial:

En este código ejecutaremos las dos formas:

Option Explicit
Sub CREAR_FECHA()
'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 y formateamos con Cdate
.Cells(i, 4) = CDate(.Cells(i, 1) & "/" & .Cells(i, 2) & "/" & .Cells(i, 3))
'Componemos fecha con dateserial
.Cells(i, 5) = DateSerial(.Cells(i, 1), .Cells(i, 2), .Cells(i, 3))
Next i
End With
End Sub

Aunque en la práctica el resultado será el mismo, siempre es interesante realizarlo con DateSerial, dado que nos permitirá posteriormente realizar modificaciones en las fechas, como añadir o restar días, meses o años, además de ser más eficiente que la primera.

La función DateSerial, compone la fecha indicando (Año, Mes, Día).

El resultado es el mismo:

CREAR UNA FECHA CON DATESERIAL EN VBA_1

Y eso es todo, espero que os haya resultado útil.

Descarga el archivo de ejemplo pulsando en: CREAR UNA FECHA CON 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

TRABAJAR CON FECHAS PARA RECONSTRUIR HISTÓRICOS

Hola a todos!.

Después de varios días sin publicar en la web, por fin tengo un poco de tiempo para escribir un breve post.

Muchas de las consultas que me envían las suelo resolver muy rápido cuando no son demasiado complejas o cuando son para resolver una parte específica de una rutina o una función. Hoy quiero publicar una de esas consultas, que aunque es sencilla y puede resultar obvia, hay que tener en cuenta que muchos lectores están empezando con Excel tanto en fórmulas como en macros, y siempre está bien detenerse en este tipo de ejercicios.

En este caso, un lector me enviaba una serie de fechas de un histórico pero que solo las fechas de inicio y me preguntaba la forma de obtener automáticamente la fecha final del periodo, esta es la información de partida:

TRABAJAR CON FECHAS PARA RECONSTRUIR HISTORICOS

Pues bien, este trabajo lo podemos hacer de una manera sencilla con una fórmula:

=SI(A2=A3;FECHA(AÑO(B3);MES(B3);DIA(B3)-1);"")

O incluso más sencillo todavía:

=SI(A2=A3;B3-1;"")

Y obtenemos el siguiente resultado:

TRABAJAR CON FECHAS PARA RECONSTRUIR HISTORICOS1

Como podéis ver, obtenemos la fecha fin y cuando llegamos a la última fecha del ID lo dejamos en blanco dado que la fecha debe quedar abierta.

La razón de utilizar la función fecha en la fórmula es para mostrar cómo podemos traducir esta función en lenguaje VBA. Es decir, en VBA no podemos usar directamente la función DATE dado que no permite introducir los argumentos de año, mes y día. Para poder trasladar la función fecha a VBA debemos usar DateSerial, aquí os dejo la macro:

Sub FECHAS()
'Declaramos variables
Dim i As Integer, Fin As Integer
Dim fecha As Date
'Trabajamos en la hoja2
With Sheets("Hoja2")
Fin = Application.CountA(.Range("A:A"))
'calculamos la fecha de cierre del registro actual
For i = 2 To Fin
fecha = .Cells(i + 1, 2)
If .Cells(i, 1) = .Cells(i + 1, 1) Then
.Cells(i, 3) = DateSerial(Year(fecha), Month(fecha), Day(fecha) - 1)
Else
.Cells(i, 3) = ""
End If
Next i
End With

End Sub

De esta forma podemos introducir las funciones Year, Month y Day con la variable “fecha”. Una vez ejecutada la macro, este es el resultado:

TRABAJAR CON FECHAS PARA RECONSTRUIR HISTORICOS2

Aunque a nivel VBA es una rutina sencilla, seguro que en algún momento os puede resultar útil, ya sea el uso de DateSerial o de la propia función fecha().

Aunque no lo comenté al principio, en este ejemplo es obvio que antes de aplicar la fórmula o ejecutar la macro, si los datos están desordenados, debemos ordenar primero por fecha y luego por ID.

Descarga el archivo de ejemplo pulsando en: TRABAJAR CON FECHAS PARA RECONSTRUIR HISTÓRICOS

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

Donate Button with Credit Cards

¡¡Muchas gracias!!