16/02/2026
En el vasto universo de la programación, la manipulación de fechas es una tarea recurrente y fundamental. Ya sea para calcular la edad de una persona, determinar el tiempo transcurrido desde un evento, o gestionar plazos de proyectos, la capacidad de restar y comparar fechas es indispensable. En el contexto de Visual Basic for Applications (VBA), la herramienta de automatización por excelencia para las aplicaciones de Microsoft Office, dominar estas operaciones te abrirá un abanico de posibilidades para crear soluciones más dinámicas y eficientes. Este artículo te guiará a través de los métodos más efectivos para restar fechas en VBA, desglosando cada técnica con ejemplos claros y consejos prácticos.

- La Función DateDiff: Tu Aliada para Diferencias Precisas
- Resta Directa de Fechas: Cuando Necesitas la Diferencia en Días
- Manejo de Componentes de Tiempo en la Resta de Fechas
- Mejores Prácticas y Consideraciones Adicionales
- Comparación con la Resta de Fechas en Otros Lenguajes .NET
- Preguntas Frecuentes (FAQ)
- ¿Cuál es la diferencia entre DateDiff("d", fecha1, fecha2) y fecha2 - fecha1?
- ¿Cómo puedo restar meses de una fecha específica en VBA?
- ¿Qué pasa si mis fechas no tienen componentes de tiempo (solo fecha)?
- ¿Es posible obtener la diferencia en años y meses y días simultáneamente, como "X años, Y meses y Z días"?
- Conclusión
La Función DateDiff: Tu Aliada para Diferencias Precisas
La función DateDiff es, sin duda, la herramienta más potente y versátil que VBA ofrece para calcular la diferencia entre dos fechas. Esta función te permite obtener la diferencia en diversas unidades de tiempo, desde segundos hasta años, lo que la hace increíblemente flexible para casi cualquier escenario.
Sintaxis de DateDiff
La sintaxis básica de DateDiff es la siguiente:
DateDiff(intervalo, fecha1, fecha2, [primer_dia_semana], [primera_semana_año])intervalo: Una expresión de cadena que especifica la unidad de tiempo que deseas utilizar para calcular la diferencia. Este es el corazón de la función y define qué tipo de resultado obtendrás.fecha1: La primera fecha que se utiliza en el cálculo.fecha2: La segunda fecha que se utiliza en el cálculo. La función calcula la diferencia restandofecha1defecha2. Sifecha1es posterior afecha2, el resultado será un número negativo.primer_dia_semana(opcional): Una constante que especifica el primer día de la semana. Afecta los cálculos de intervalo "w" (día de la semana) y "ww" (semana del año). Si se omite, el domingo es el predeterminado.primera_semana_año(opcional): Una constante que especifica la primera semana del año. Afecta los cálculos de intervalo "ww" (semana del año). Si se omite, la primera semana es aquella en la que cae el 1 de enero.
Intervalos Comunes para DateDiff
El parámetro intervalo es clave para obtener el resultado deseado. Aquí te presentamos una tabla con los intervalos más comunes y su significado:
| Intervalo | Descripción | Ejemplo de Uso |
|---|---|---|
"yyyy" | Años | DateDiff("yyyy", #1/1/2020#, #1/1/2023#) (Resultado: 3) |
"q" | Trimestres | DateDiff("q", #1/1/2023#, #7/1/2023#) (Resultado: 2) |
"m" | Meses | DateDiff("m", #1/15/2023#, #3/10/2023#) (Resultado: 1) |
"d" | Días | DateDiff("d", #1/1/2023#, #1/5/2023#) (Resultado: 4) |
"w" | Días de la semana (cuenta domingos) | DateDiff("w", #1/1/2023#, #1/7/2023#) (Resultado: 1) |
"ww" | Semanas | DateDiff("ww", #1/1/2023#, #1/15/2023#) (Resultado: 2) |
"h" | Horas | DateDiff("h", #1/1/2023 10:00:00#, #1/1/2023 14:30:00#) (Resultado: 4) |
"n" | Minutos | DateDiff("n", #1/1/2023 10:00:00#, #1/1/2023 10:45:00#) (Resultado: 45) |
"s" | Segundos | DateDiff("s", #1/1/2023 10:00:00#, #1/1/2023 10:01:30#) (Resultado: 90) |
Ejemplos Prácticos con DateDiff
Calcular la Edad en Años
Sub CalcularEdad() Dim fechaNacimiento As Date Dim fechaActual As Date Dim edad As Long fechaNacimiento = #15/05/1990# fechaActual = Date ' Obtiene la fecha actual del sistema edad = DateDiff("yyyy", fechaNacimiento, fechaActual) ' Ajuste si aún no ha pasado el cumpleaños en el año actual If Month(fechaNacimiento) > Month(fechaActual) Or _ (Month(fechaNacimiento) = Month(fechaActual) And Day(fechaNacimiento) > Day(fechaActual)) Then edad = edad - 1 End If MsgBox "La persona tiene " & edad & " años." End Sub En este ejemplo, vemos cómo DateDiff("yyyy", ...) calcula la diferencia en años completos, pero es importante notar que solo cuenta los límites de los años. Para una edad precisa, se requiere un ajuste adicional si el cumpleaños de la persona aún no ha ocurrido en el año actual.
Calcular Días Restantes para un Plazo
Sub DiasRestantes() Dim fechaFinProyecto As Date Dim diasRestantes As Long fechaFinProyecto = #31/12/2024# ' Fecha de finalización del proyecto diasRestantes = DateDiff("d", Date, fechaFinProyecto) ' Date es la fecha actual If diasRestantes >= 0 Then MsgBox "Faltan " & diasRestantes & " días para el fin del proyecto." Else MsgBox "El proyecto finalizó hace " & Abs(diasRestantes) & " días." End If End SubAquí, "d" nos da la diferencia exacta en días. Si la fecha de fin de proyecto ya pasó, el resultado será negativo, indicando cuántos días han transcurrido desde la finalización.
Resta Directa de Fechas: Cuando Necesitas la Diferencia en Días
VBA también te permite restar directamente dos variables de tipo Date. El resultado de esta operación es un número de tipo Double que representa la cantidad de días completos (y fracciones de día) entre las dos fechas.
Sintaxis y Comportamiento
resultado = fecha2 - fecha1 Donde fecha1 y fecha2 son expresiones de tipo Date.
Si solo te interesan los días completos, puedes usar la función Int() para truncar el valor decimal. Si necesitas la diferencia con precisión de horas, minutos o segundos, tendrás que multiplicar el resultado decimal por el factor de conversión adecuado.
Ejemplos de Resta Directa
Diferencia en Días Completos
Sub RestaDirectaDias() Dim fechaInicio As Date Dim fechaFin As Date Dim duracionDias As Double fechaInicio = #10/01/2023# fechaFin = #20/01/2023# duracionDias = fechaFin - fechaInicio MsgBox "La duración es de " & duracionDias & " días." ' Resultado: 10 End SubDiferencia Incluyendo Horas y Minutos
Cuando las fechas incluyen componentes de tiempo, la resta directa puede ser muy útil para obtener la diferencia total en días y fracciones. La clave es que el tipo de dato Date almacena tanto fecha como hora.

Sub RestaDirectaConTiempo() Dim fechaHora1 As Date Dim fechaHora2 As Date Dim diferenciaTotal As Double ' Esto contendrá días y fracciones de día Dim horas As Long Dim minutos As Long Dim segundos As Long fechaHora1 = #1/1/2023 10:00:00 AM# fechaHora2 = #2/1/2023 02:30:00 PM# diferenciaTotal = fechaHora2 - fechaHora1 ' Para obtener el número de horas, minutos y segundos a partir de la fracción horas = Int(diferenciaTotal * 24) minutos = Int((diferenciaTotal * 24 - horas) * 60) segundos = Int(((diferenciaTotal * 24 - horas) * 60 - minutos) * 60) MsgBox "Diferencia: " & diferenciaTotal & " días (aprox. " & horas & " horas, " & minutos & " minutos, " & segundos & " segundos)." End SubEste método es particularmente útil cuando la precisión en fracciones de día es relevante, y puedes desglosar esa fracción en horas, minutos o segundos multiplicando por los factores de conversión (24 para horas, 24*60 para minutos, 24*60*60 para segundos).
Manejo de Componentes de Tiempo en la Resta de Fechas
Es crucial entender cómo los componentes de tiempo afectan los cálculos de fechas en VBA.
DateDiff: Cuando utilizas intervalos como "h", "n", o "s",DateDiffconsidera la parte de la hora. Si usas "d", "m", "q", "yyyy", generalmente ignora las horas, minutos y segundos, o los redondea según el contexto del intervalo (por ejemplo, para "m" o "yyyy", cuenta el número de veces que el límite del mes o año se cruza).- Resta Directa: La resta directa de dos fechas siempre considera la parte de la hora, retornando un valor
Doubleque representa la diferencia exacta en días y fracciones de día.
Si necesitas comparar solo la parte de la fecha, ignorando la hora, puedes usar la función DateValue() para obtener solo la fecha de una variable Date, o Int() en el caso de la resta directa para obtener solo los días completos.
Sub IgnorarHoraEnResta() Dim fecha1 As Date Dim fecha2 As Date Dim diasSinHora As Long fecha1 = #1/1/2023 10:00:00 AM# fecha2 = #1/2/2023 02:00:00 PM# ' Usando DateDiff para días, ignora la hora diasSinHora = DateDiff("d", fecha1, fecha2) ' Resultado: 1 ' Usando resta directa y DateValue para ignorar la hora diasSinHora = DateValue(fecha2) - DateValue(fecha1) ' Resultado: 1 MsgBox "Días sin hora: " & diasSinHora End SubMejores Prácticas y Consideraciones Adicionales
Validación de Datos
Siempre valida que las fechas que estás utilizando sean válidas. Intentar operar con una cadena que no representa una fecha o un valor Null puede generar errores en tiempo de ejecución. Puedes usar la función IsDate() para verificar si una expresión se puede convertir a Date.
Sub ValidarFechaAntesDeRestar() Dim fechaStr As String Dim fechaValida As Date fechaStr = "2023-10-26" ' O puede ser un valor de celda, input de usuario, etc. If IsDate(fechaStr) Then fechaValida = CDate(fechaStr) MsgBox "Fecha válida: " & fechaValida ' Proceder con los cálculos de fecha Else MsgBox "La cadena '" & fechaStr & "' no es una fecha válida." End If End SubEl Tipo de Dato Date
En VBA, el tipo de dato Date es fundamental. Internamente, VBA almacena las fechas como números Double, donde la parte entera representa la fecha (el número de días desde el 30 de diciembre de 1899) y la parte decimal representa la hora (fracción de un día). Comprender esto te ayuda a entender por qué la resta directa de fechas devuelve un Double.
Consideraciones de Localización
VBA es sensible a la configuración regional del sistema operativo en cuanto al formato de las fechas (por ejemplo, día/mes/año vs. mes/día/año). Al ingresar fechas directamente en el código con #fecha#, VBA las interpretará según la configuración del sistema. Es una buena práctica utilizar formatos universales como "yyyy/mm/dd" o "mm/dd/yyyy" si es posible, o confiar en la función CDate() para la conversión de cadenas a fechas, ya que esta también respeta la configuración regional.
Comparación con la Resta de Fechas en Otros Lenguajes .NET
Aunque este artículo se centra en VBA, es interesante ver cómo lenguajes hermanos en el ecosistema .NET de Microsoft, como C# y Visual Basic .NET (VB.NET), manejan la resta de fechas. Esto demuestra la evolución de las bibliotecas y el enfoque en la programación orientada a objetos.

C# y VB.NET: El Tipo TimeSpan
En C# y VB.NET, la resta de dos objetos DateTime (el equivalente a Date en VBA) no devuelve un número simple, sino un objeto TimeSpan. Este objeto TimeSpan está diseñado específicamente para representar un intervalo de tiempo y tiene propiedades para acceder a la diferencia en días, horas, minutos, segundos, milisegundos e incluso 'ticks' (unidades de 100 nanosegundos).
La información proporcionada anteriormente sobre C# ilustra esto perfectamente:
// Ejemplo en C# var prevDate = new DateTime(2021, 7, 15); var today = DateTime.Now; var diffOfDates = today - prevDate; // Esto devuelve un objeto TimeSpan Console.WriteLine("Difference in Days: {0}", diffOfDates.Days); Console.WriteLine("Difference in Hours: {0}", diffOfDates.Hours); // ... y así sucesivamente Esta aproximación con TimeSpan es más explícita y encapsula mejor la lógica de un intervalo de tiempo, a diferencia de la aproximación de VBA que devuelve un número Double que luego debe ser interpretado o convertido. Aunque VBA no tiene un objeto TimeSpan nativo, la función DateDiff y la resta directa ofrecen toda la funcionalidad necesaria para la mayoría de los casos.
Preguntas Frecuentes (FAQ)
¿Cuál es la diferencia entre DateDiff("d", fecha1, fecha2) y fecha2 - fecha1?
DateDiff("d", fecha1, fecha2) devuelve el número de límites de día que se cruzan entre fecha1 y fecha2. Por ejemplo, la diferencia entre "2023-01-01 23:00" y "2023-01-02 01:00" sería 1 día. La resta directa fecha2 - fecha1 devuelve la diferencia exacta en días como un número Double. Para el mismo ejemplo, el resultado sería aproximadamente 0.0833 (2 horas / 24 horas). Utiliza DateDiff("d", ...) si quieres días completos ignorando la hora, y la resta directa si necesitas la precisión de la hora también.
¿Cómo puedo restar meses de una fecha específica en VBA?
Para restar o añadir meses a una fecha, puedes usar la función DateAdd. Aunque su nombre es "DateAdd", si usas un número negativo para la cantidad, efectivamente restarás.
Sub RestarMeses() Dim fechaOriginal As Date Dim fechaHace6Meses As Date fechaOriginal = #15/10/2023# fechaHace6Meses = DateAdd("m", -6, fechaOriginal) MsgBox "Fecha original: " & fechaOriginal & vbCrLf & _ "Fecha hace 6 meses: " & fechaHace6Meses ' Resultado: 15/04/2023 End Sub¿Qué pasa si mis fechas no tienen componentes de tiempo (solo fecha)?
Si tus fechas solo contienen la parte de la fecha (es decir, la hora es 00:00:00), tanto DateDiff("d", ...) como la resta directa (que devolverá un número entero) funcionarán perfectamente para obtener la diferencia en días. Si introduces fechas sin especificar la hora, VBA asume que la hora es medianoche (00:00:00).
¿Es posible obtener la diferencia en años y meses y días simultáneamente, como "X años, Y meses y Z días"?
Sí, es posible, pero requiere una combinación de llamadas a DateDiff y lógica adicional. No hay una función única que lo haga directamente. Por ejemplo:
Sub DiferenciaCompleta() Dim fecha1 As Date Dim fecha2 As Date Dim anos As Long Dim meses As Long Dim dias As Long Dim tempFecha As Date fecha1 = #15/05/1990# fecha2 = Date ' Hoy anos = DateDiff("yyyy", fecha1, fecha2) tempFecha = DateAdd("yyyy", anos, fecha1) If tempFecha > fecha2 Then ' Si ya nos pasamos con los años, restamos uno anos = anos - 1 tempFecha = DateAdd("yyyy", anos, fecha1) End If meses = DateDiff("m", tempFecha, fecha2) tempFecha = DateAdd("m", meses, tempFecha) If tempFecha > fecha2 Then ' Si ya nos pasamos con los meses, restamos uno meses = meses - 1 tempFecha = DateAdd("m", meses, tempFecha) End If dias = DateDiff("d", tempFecha, fecha2) MsgBox "La diferencia es: " & anos & " años, " & meses & " meses y " & dias & " días." End SubEste enfoque calcula primero los años, luego los meses restantes desde esa fecha "ajustada", y finalmente los días restantes. Es una solución común para calcular la duración exacta de periodos.
Conclusión
Restar fechas en VBA es una habilidad esencial para cualquier desarrollador que trabaje con datos temporales. La función DateDiff te ofrece una flexibilidad incomparable para obtener diferencias en diversas unidades de tiempo, mientras que la resta directa de variables Date es ideal para cálculos de días exactos, incluyendo fracciones. Comprender las particularidades de cada método y cómo manejar los componentes de tiempo te permitirá crear soluciones robustas y precisas. Recuerda siempre validar tus datos y considerar las mejores prácticas para asegurar la fiabilidad de tus cálculos. Con estas herramientas y técnicas, estarás bien equipado para manejar cualquier desafío relacionado con la manipulación de fechas en tus proyectos de VBA.
Si quieres conocer otros artículos parecidos a Dominando la Resta de Fechas en VBA puedes visitar la categoría Cálculos.
