¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. Macros y lenguaje VBA
  3. Manipular fechas y horas
Extrait - Macros y lenguaje VBA Descubra la programación en Excel (nueva edición)
Extractos del libro
Macros y lenguaje VBA Descubra la programación en Excel (nueva edición) Volver a la página de compra del libro

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 44751, al 9 de julio de 2022, 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/22, ¡es importante que se asegure de que se trata del 5 de junio de 2022, el 6 de mayo de 2022 o el 22 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 44717, ¡sabrá que es el 5 de junio de 2022!

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/2021# 
dtSoloHora = #9:30:00 AM# 
dtCompleta = #10/15/2020 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 2022, 
entonces la variable tomará el valor #2022/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 dt1Abril2022 As Date 
dt1Abril2022 = DateSerial(2022,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(2022, 2, 29)  ' devolverá el 1 marzo 2022 
Debug.Print DateSerial(2023, -5, 10) ' devolverá el 10 julio 2022 
Debug.Print DateSerial(2022, 0, 25)  ' devolverá el 25 diciembre 2021 
Debug.Print DateSerial(2022, 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/2022 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 #2022-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 2022, 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/2022# 
iAño = Year(dt)  '2022 
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(#2022/07/29 10:35:14#, vbShortDate) 
'muestra 2022/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 Capitulo12_Ejercicio1A.

Esta macro mostrará al usuario la fecha y la hora actuales del sistema.

 Ejecute la macro Capitulo12_Ejercicio1A (ahora).

Fecha actual

 Cree la macro Capitulo12_Ejercicio1B.

Esta macro mostrará al usuario la fecha actual.

 Ejecute la macro Capitulo12_Ejercicio1B (fecha actual).

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 Capitulo12_Ejercicio2A.

Esta macro mostrará el valor devuelto por la función PrimerDiaDelAño, a la que se le pasa el año 2022.

 Ejecute la macro Capitulo12_Ejercicio2A (1 de enero de 2022).

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 Capitulo12_Ejercicio2B.

Esta macro mostrará lo que devuelve la función MenosCuarto tres veces, proporcionándole sucesivamente los valores 9, 13 y 0.

 Ejecute la macro Capitulo12_Ejercicio2B (08:45:00, 12:45:00 y 23:45:00).

Suma y resta de fechas

Hasta...