Manipular fechas y horas
Objetivos del capítulo
Cuando tiene que redactar contratos, facturas o recordatorios, la gestión de fechas es esencial. La manipulación de fechas es siempre un tema importante, tanto en las fórmulas de Excel como en la programación VBA.
Este capítulo tiene como objetivo recordarle los aspectos que debe conocer en lo que concierne a las fechas en sus hojas de Excel, así como las principales funciones relacionadas con las fechas.
Al final del capítulo, podrá realizar algunos ejercicios para validar sus nuevos conocimientos.
Recordatorio sobre la gestión general de fechas
Cuando se trabaja con Windows, las fechas que se reconocen van del 1 de enero de 100 al 31 de diciembre de 9999. El calendario utilizado para estas fechas corresponde al calendario gregoriano.
En Excel, las fechas se gestionan del 1 de enero de 1900 al 31 de diciembre de 9999 y estos valores se denominan número de serie. El valor 1 corresponde al 1 de enero de 1900; el valor 2, al 2 de enero de 1900...; el valor 50000, al 21 noviembre de 2036, etc.
Cuando utilice fechas, recuerde que a Excel le interesa sobre todo este número de serie. Los problemas relacionados con los formatos (09/07/2022, 2022-07-09, 2022-09-07, etc.) pueden resolverse volviendo a este número de serie.
El valor entero corresponde a la fecha y la parte decimal, a las horas.
Gestión de fechas en VBA Excel
No confundir valor y formato
Un punto importante, antes de avanzar más en este capítulo, es la distinción entre lo que se ve en una celda y su valor correspondiente (número de serie). Mucha gente comete el error de centrarse únicamente en el formato o en el texto que aparece en una celda, en lugar de priorizar la fecha «real» disponible en ella.
Es cierto que para las personas que solo trabajan de forma local en su propia empresa, sin archivos que enviar internacionalmente, esto puede parecer innecesario, pero, cuando usted recibe archivos con una fecha del 05/06/24, ¡es importante que se asegure de que se trata del 5 de junio de 2024, el 6 de mayo de 2024 o el 24 de junio de 2005! Como cada usuario tiene su propia configuración regional, no hay certitud simplemente leyendo un formato de visualización. El valor que realmente contiene la celda se mostrará si hace clic en el botón Mostrar fórmulas de la pestaña Fórmulas. Y si obtiene el 45448, ¡sabrá que es el 5 de junio de 2024.
Priorizar los años con cuatro cifras
Cuando trabaja con fechas, normalmente dispone de tres valores que determinan una fecha: su año, su mes y su día. Mientras que los días y los meses solo pueden escribirse con dos dígitos (y aún se encuentran entradas de un solo dígito para los días inferiores...
El tipo Date
Como vio en el capítulo Variables y constantes, el tipo de variable que permite manipular fechas y horas es el tipo Date. La declaración de una variable de este tipo es la siguiente.
Dim dt As Date
Ejemplo 1: declarar una variable de tipo Date
La sintaxis de las fechas en VBA se realiza con el carácter #, como en los siguientes ejemplos:
Dim dtSola As Date, dtSoloHora As Date, dtCompleta As Date
dtSola = #7/19/2024#
dtSoloHora = #9:30:00 AM#
dtCompleta = #10/15/2024 7:30:00 PM#
Ejemplo 2: asignación de valores de tipo Date
Funciones Date y Now
Entre las primeras funciones VBA relacionadas con la fecha que debe conocer, Date() y Now() son las más utilizadas.
Función fecha del día: Date()
Cuando necesite trabajar con la fecha del día, la función Date() de VBA le proporciona ese valor. Esta función no toma parámetros y puede utilizarse con o sin paréntesis.
Dim dtFechaActual As Date
dtFechaActual = Date 'si hoy estamos a 25 julio 2024,
entonces la variable tomará el valor #2024/07/25#.
Ejemplo 3: usar la función Date()
La fecha corresponde a la del sistema. Se puede utilizar de varias maneras, como veremos en los siguientes párrafos.
Función fecha y hora del sistema: Now()
Por ejemplo, cuando se trabaja usando un tratamiento específico varias veces al día, se necesita la hora exacta del sistema, además de la fecha actual. La función Now() cumple esta tarea. No toma parámetros y devuelve la fecha actual, más la hora del sistema.
Dim dtHoraSistema As Date
dtHoraSistema = Now
Ejemplo 4: usar la función Now()
Más adelante, será posible trabajar sobre las diferentes partes de estas fechas y horas devueltas por estas dos funciones.
Crear una fecha o una hora: las funciones DateSerial() y TimeSerial()
Si no está seguro de la sintaxis completa de las fechas, y para evitar intercambiar accidentalmente meses y días, puede utilizar ciertas funciones que devuelven una fecha según los parámetros proporcionados.
Asignar una fecha precisa: DateSerial()
La función que permite devolver una fecha específica es DateSerial(). Esta función toma como parámetros tres valores: el año, el mes y el día. Su sintaxis general es la siguiente:
DateSerial(Año As Integer, Mes As Integer, Día As Integer)
Ejemplo 5: sintaxis general de la función DateSerial()
Por lo tanto, todo lo que tiene que hacer es proporcionar la información y luego asignar el valor de tipo Date a su variable.
Dim dt1Abril2024 As Date
dt1Abril2024 = DateSerial(2024,4,1)
Ejemplo 6: usar la función DateSerial()
Esta función tiene, además, la particularidad de devolver siempre una fecha válida, siempre que la fecha correspondiente esté dentro del rango reconocido por VBA.
Debug.Print DateSerial(2025, 2, 29) ' devolverá el 1 marzo 2025
Debug.Print DateSerial(2024, -5, 10) ' devolverá el 10 julio 2023
Debug.Print DateSerial(2024, 0, 25) ' devolverá el 25 diciembre 2023
Debug.Print DateSerial(2024, 0, 50) ' devolverá...
Suma y resta de fechas
Cuando quiera calcular una fecha en el pasado o en el futuro, hay dos métodos a su disposición. Si solo trabaja con días u horas para sumar o restar, puede utilizar fácilmente la suma numérica. Si necesita calcular según bases de calendario: un mes, un trimestre, un año... la función DateAdd() tendrá su lugar en la panoplia de funciones de VBA que debe conocer.
Por suma numérica
Como ya sabe, el modo de funcionamiento para las fechas se hace por medio de valor entero para los días. Así, para añadir un día a una fecha y conocer la fecha del día siguiente, basta con efectuar la operación con el símbolo de suma +, como en el siguiente ejemplo.
Dim dt As Date
dt = Date + 1
'la variable contiene ahora la fecha de mañana
Ejemplo 10: sumar un valor numérico a una fecha
Del mismo modo, si quiere conocer la fecha y la hora 8 horas antes de una fecha, se hace con el símbolo de resta -, como en el siguiente ejemplo.
Dim dt As Date
dt = #3/5/2024 9:35:00 PM# - (8 / 24) 'recuerde, una hora = 1/24 de día,
un minuto = 1/(24*60) y un segundo = 1/(24*60*60)
' la variable dt contendrá, entonces, el valor #2024-03-05 1:35PM#
Ejemplo 11: restar un valor numérico de una fecha
Si bien sumar y restar horas o días es algo natural y sencillo, puede resultar más...
Partes de una fecha o de una hora
Al programar manipulando fechas, también puede ser necesario conocer sus partes, como el año, el mes, el día del mes o incluso el día de la semana, lo contrario de lo que permiten las funciones DateSerial() y TimeSerial(). He aquí algunas funciones que le serán muy útiles para obtener dicha información.
Año, mes o día de una fecha: Year(), Month(), Day()
Cuando se trata de conocer una parte de una fecha, las tres funciones más sencillas son Year(), Month() y Day() que toman cada una de ellas una fecha como parámetro y devuelven el año, el mes y el día del mes como valores enteros, respectivamente. Su sintaxis general es la siguiente:
Dim iAño As Integer, iMes As Integer, iDia As Integer
Dim dt As Date
'asignar a dt una fecha
iAño = Year(dt)
iMes = Month(dt)
iDia = Day(dt)
Ejemplo 14: usar las funciones Year(), Month() y Day() en una fecha
Así, con la fecha del 26 de julio de 2024, se les asignarán a las variables los siguientes valores:
Dim iAño As Integer, iMes As Integer, iDia As Integer
Dim dt As Date
dt = #7/26/2024#
iAño = Year(dt) '2024
iMes = Month(dt) '7
iDia = Day(dt) '26
Ejemplo 15: valores devueltos por las funciones Year(), Month() y Day()
Los valores devueltos por la función Month() van de 1 a 12 y los devueltos por la función Day(), de 1 a 31.
Día de la semana de una fecha: WeekDay()
Cuando necesite saber si una fecha cae en lunes, miércoles o durante un fin de semana, VBA le proporciona la función WeekDay(). Esta función tiene la siguiente sintaxis general:
WeekDay(fecha, [PrimerDiaDeLaSemana])
Ejemplo 16: sintaxis general de la función WeekDay()
El primer parámetro de esta función es la fecha sobre la que se quiere trabajar, y el segundo parámetro es el primer día de la semana. Si la semana empieza el lunes, el martes será el día 2, mientras que, si empieza el domingo, el martes será el día 3.
Los valores posibles de este segundo parámetro son los siguientes:
Constante VBA |
Valor numérico |
Descripción |
vbUseSystem |
0 |
Utilizar el parámetro API NLS |
vbSunday |
1 |
Domingo (predefinido)) |
vbMonday |
2 |
Lunes |
vbTuesday |
3 |
Martes... |
Formatear el despliegue de la fecha en forma de texto: FormatDateTime() y Format()
En muchos casos, querrá mostrar sus fechas en un formato determinado, por ejemplo, para nombrar archivos. Las funciones FormatDateTime() y Format() le permiten obtener el resultado esperado en forma de cadena.
Función específica: FormatDateTime()
La primera función dedicada al formato de fechas es FormatDateTime(). La sintaxis general de esta función es la siguiente:
FormatDateTime(valor, [NombreDelFormato As vbDateTimeFormat])
Ejemplo 23: sintaxis general de la función FormatDateTime()
La función devuelve una cadena, como en el siguiente ejemplo:
Debug.Print FormatDateTime(#2024/07/29 10:35:14#, vbShortDate)
'muestra 2024/07/29
Ejemplo 24: usar la función FormatDateTime()
Entre los formatos disponibles para las fechas, puede utilizar las siguientes constantes VBA:
Constante |
Descripción |
Ejemplo con la fecha 19/01/2010 20:34:05 |
vbGeneralDate |
Muestra una fecha y/u hora. Para los números reales, muestra la fecha y la hora. Si no hay parte decimal, muestra solo una fecha. Si no hay parte entera, muestra solo la hora. La forma de mostrar la fecha y la hora depende de los parámetros de su sistema. |
2010-01-19 20:34:05 |
vbLongDate |
Muestra una fecha utilizando el formato de fecha completo especificado en la configuración regional de su ordenador. |
19 enero 2010 |
vbShortDate |
Muestra una fecha utilizando el formato de fecha... |
Transformar un valor en fecha u hora: IsDate(), DateValue(), TimeValue() y CDate()
Entre los últimos puntos que podrían ser útiles para manipular fechas y horas, estas funciones permiten transformar los tipos de datos como cadenas o valores numéricos en el tipo de datos Date.
¿Es este texto una fecha válida?: IsDate()
Antes de intentar transformar una cadena en un tipo Date, es pertinente asegurarse de que la cadena corresponde a una fecha válida. La función IsDate() está hecha para eso. La sintaxis general de esta función es la siguiente:
Function IsDate(ValorAProbar) As Boolean
Ejemplo 27: sintaxis general de la función IsDate()
Esta función devuelve un booleano. Si el ValorPorProbar puede interpretarse como una fecha, hora o fecha y hora válidas, la función devuelve True.
Algunos ejemplos de valores que se pueden comprobar con IsDate():
Debug.Print IsDate("23-ene") 'Verdadero
Debug.Print IsDate("29-feb") 'Falso
Debug.Print IsDate("15:10:45") 'Verdadero
Debug.Print IsDate("35:10:00") 'Falso
Ejemplo 28: ejemplos de valores devueltos por la función IsDate()
Recuperar la fecha, la hora o la cadena completa: DateValue(), TimeValue() y CDate()
Una vez que sepa que el valor que está probando es de tipo Date, tiene varias funciones para convertir el valor...
Ejercicios
Mostrar la fecha y la hora actuales del sistema
Hora del sistema
Cree la macro MostrarFechaYHoraAhora.
Esta macro mostrará al usuario la fecha y la hora actuales del sistema.
Ejecute la macro MostrarFechaYHoraAhora (ahora).
Fecha actual
Cree la macro MostrarFechaActual.
Esta macro mostrará al usuario la fecha actual.
Ejecute la macro MostrarFechaActual (hoy).
Crear una fecha y una hora
Uso de DateSerial
Escriba la función PrimerDiaDelAño, de ámbito público, que devuelva una fecha.
Esta función toma como parámetro un valor entero iAño.
Esta función debe devolver el 1 de enero del año iAño proporcionado como parámetro.
Cree la macro MostrarPrimerDiaDelAño.
Esta macro mostrará el valor devuelto por la función PrimerDiaDelAño, a la que se le pasa el año 2024.
Ejecute la macro MostrarPrimerDiaDelAño (1 de enero de 2024).
Uso de TimeSerial
Cree la función MenosCuarto, de ámbito público, que devuelva una fecha.
Esta función toma como parámetro un valor entero, entre 0 y 23, llamado iHora.
Esta función debe devolver la hora indicada en el parámetro, menos 15 minutos.
Cree la macro MostrarMenosCuarto.
Esta macro mostrará lo que devuelve la función MenosCuarto tres veces, proporcionándole sucesivamente los valores 10, 13 y 0.
Ejecute la macro MostrarMenosCuarto (09:45:00, 12:45:00 y 23:45:00).