Buscar..


Calendario

VBA soporta 2 calendarios: gregoriano y hijri

La propiedad Calendar se utiliza para modificar o mostrar el calendario actual.

Los 2 valores para el calendario son:

Valor Constante Descripción
0 vbCalGreg Calendario gregoriano (predeterminado)
1 vbCalHijri Calendario hijri

Ejemplo

Sub CalendarExample()
    'Cache the current setting.
    Dim Cached As Integer
    Cached = Calendar

    ' Dates in Gregorian Calendar
    Calendar = vbCalGreg
    Dim Sample As Date
    'Create sample date of 2016-07-28
    Sample = DateSerial(2016, 7, 28)

    Debug.Print "Current Calendar : " & Calendar
    Debug.Print "SampleDate = " & Format$(Sample, "yyyy-mm-dd")
    
    ' Date in Hijri Calendar
    Calendar = vbCalHijri
    Debug.Print "Current Calendar : " & Calendar
    Debug.Print "SampleDate = " & Format$(Sample, "yyyy-mm-dd")
    
    'Reset VBA to cached value.
    Cached = Calendar
End Sub

Este Sub imprime lo siguiente;

Current Calendar : 0
SampleDate = 2016-07-28
Current Calendar : 1
SampleDate = 1437-10-23

Funciones de base

Recuperar sistema DateTime

VBA admite 3 funciones incorporadas para recuperar la fecha y / o la hora del reloj del sistema.

Función Tipo de retorno Valor de retorno
Ahora Fecha Devuelve la fecha y hora actual.
Fecha Fecha Devuelve la parte de fecha de la fecha y hora actual
Hora Fecha Devuelve la parte de tiempo de la fecha y hora actuales
Sub DateTimeExample()

    ' -----------------------------------------------------
    ' Note : EU system with default date format DD/MM/YYYY
    ' -----------------------------------------------------
    
    Debug.Print Now   ' prints 28/07/2016 10:16:01 (output below assumes this date and time)
    Debug.Print Date  ' prints 28/07/2016
    Debug.Print Time  ' prints 10:16:01
    
    ' Apply a custom format to the current date or time
    Debug.Print Format$(Now, "dd mmmm yyyy hh:nn")  ' prints 28 July 2016 10:16
    Debug.Print Format$(Date, "yyyy-mm-dd")         ' prints 2016-07-28
    Debug.Print Format$(Time, "hh") & " hour " & _
                Format$(Time, "nn") & " min " & _
                Format$(Time, "ss") & " sec "       ' prints 10 hour 16 min 01 sec
    
End Sub

Función de temporizador

La función de Timer devuelve un solo que representa el número de segundos transcurridos desde la medianoche. La precisión es una centésima de segundo.

Sub TimerExample()

    Debug.Print Time    ' prints 10:36:31  (time at execution)
    Debug.Print Timer   ' prints 38191,13  (seconds since midnight)

End Sub

Debido a que las funciones Now y Time son solo precisas a segundos, el Timer ofrece una manera conveniente de aumentar la precisión de la medición del tiempo:

Sub GetBenchmark()
       
    Dim StartTime  As Single
    StartTime = Timer       'Store the current Time
    
    Dim i As Long
    Dim temp As String
    For i = 1 To 1000000    'See how long it takes Left$ to execute 1,000,000 times
        temp = Left$("Text", 2)
    Next i
    
    Dim Elapsed As Single
    Elapsed = Timer - StartTime
    Debug.Print "Code completed in " & CInt(Elapsed * 1000) & " ms"

End Sub

IsDate ()

IsDate () comprueba si una expresión es una fecha válida o no. Devuelve un Boolean .

Sub IsDateExamples()

    Dim anything As Variant
       
    anything = "September 11, 2001"

    Debug.Print IsDate(anything)    'Prints True
            
    anything = #9/11/2001#

    Debug.Print IsDate(anything)    'Prints True
   
    anything = "just a string"

    Debug.Print IsDate(anything)    'Prints False

    anything = vbNull
    
    Debug.Print IsDate(anything)    'Prints False
    
End Sub

Funciones de extraccion

Estas funciones toman una Variant que se puede convertir en una Date como parámetro y devuelven un Integer representa una parte de una fecha u hora. Si el parámetro no se puede convertir en una Date , se producirá un error de tiempo de ejecución 13: No coincide el tipo.

Función Descripción Valor devuelto
Año() Devuelve la parte del año del argumento de fecha. Entero (100 a 9999)
Mes() Devuelve la parte del mes del argumento de fecha. Entero (1 a 12)
Día() Devuelve la parte del día del argumento de fecha. Entero (1 a 31)
Día laborable() Devuelve el día de la semana del argumento fecha. Acepta un segundo argumento opcional que define el primer día de la semana. Entero (1 a 7)
Hora() Devuelve la parte de hora del argumento de fecha. Entero (0 a 23)
Minuto() Devuelve la porción de minutos del argumento de fecha. Entero (0 a 59)
Segundo() Devuelve la segunda parte del argumento de fecha. Entero (0 a 59)

Ejemplos:

Sub ExtractionExamples()

    Dim MyDate As Date
    
    MyDate = DateSerial(2016, 7, 28) + TimeSerial(12, 34, 56)

    Debug.Print Format$(MyDate, "yyyy-mm-dd hh:nn:ss") ' prints 2016-07-28 12:34:56

    Debug.Print Year(MyDate)                           ' prints 2016
    Debug.Print Month(MyDate)                          ' prints 7
    Debug.Print Day(MyDate)                            ' prints 28
    Debug.Print Hour(MyDate)                           ' prints 12
    Debug.Print Minute(MyDate)                         ' prints 34
    Debug.Print Second(MyDate)                         ' prints 56
    
    Debug.Print Weekday(MyDate)                        ' prints 5
    'Varies by locale - i.e. will print 4 in the EU and 5 in the US
    Debug.Print Weekday(MyDate, vbUseSystemDayOfWeek)
    Debug.Print Weekday(MyDate, vbMonday)              ' prints 4
    Debug.Print Weekday(MyDate, vbSunday)              ' prints 5
    
End Sub

Función DatePart ()

DatePart() es también una función que devuelve una parte de una fecha, pero funciona de manera diferente y permite más posibilidades que las funciones anteriores. Puede, por ejemplo, devolver el trimestre del año o la semana del año.

Sintaxis:

DatePart ( interval, date  [, firstdayofweek] [, firstweekofyear] )

argumento de intervalo puede ser:

Intervalo Descripción
"yyyy" Año (100 a 9999)
"y" Día del año (1 a 366).
"metro" Mes (1 a 12)
"q" Trimestre (1 a 4)
"ww" Semana (1 a 53)
"w" Día de la semana (1 a 7)
"re" Día del mes (1 a 31)
"h" Hora (0 a 23)
"norte" Minuto (0 a 59)
"s" Segundo (0 a 59)

Firstdayofweek es opcional. Es una constante que especifica el primer día de la semana. Si no se especifica, se asume vbSunday .

Firstweekofyear es opcional. Es una constante que especifica la primera semana del año. Si no se especifica, se supone que la primera semana es la semana en que ocurre el 1 de enero.

Ejemplos:

Sub DatePartExample()

    Dim MyDate As Date
    
    MyDate = DateSerial(2016, 7, 28) + TimeSerial(12, 34, 56)

    Debug.Print Format$(MyDate, "yyyy-mm-dd hh:nn:ss") ' prints 2016-07-28 12:34:56
    
    Debug.Print DatePart("yyyy", MyDate)              ' prints 2016
    Debug.Print DatePart("y", MyDate)                 ' prints 210
    Debug.Print DatePart("h", MyDate)                 ' prints 12
    Debug.Print DatePart("Q", MyDate)                 ' prints 3
    Debug.Print DatePart("w", MyDate)                 ' prints 5
    Debug.Print DatePart("ww", MyDate)                ' prints 31

End Sub

Funciones de calculo

DateDiff ()

DateDiff() devuelve un valor Long representa el número de intervalos de tiempo entre dos fechas especificadas.

Sintaxis

DateDiff ( interval, date1, date2  [, firstdayofweek] [, firstweekofyear] )
  • intervalo puede ser cualquiera de los intervalos definidos en la función DatePart()
  • fecha1 y fecha2 son las dos fechas que desea utilizar en el cálculo
  • primerdíadelasemana y firstweekofyear son opcionales. Consulte la función DatePart() para obtener explicaciones.

Ejemplos

Sub DateDiffExamples()

    ' Check to see if 2016 is a leap year.
    Dim NumberOfDays As Long
    NumberOfDays = DateDiff("d", #1/1/2016#, #1/1/2017#)
    
    If NumberOfDays = 366 Then
        Debug.Print "2016 is a leap year."              'This will output.
    End If
           
    ' Number of seconds in a day
    Dim StartTime As Date
    Dim EndTime As Date
    StartTime = TimeSerial(0, 0, 0)
    EndTime = TimeSerial(24, 0, 0)
    Debug.Print DateDiff("s", StartTime, EndTime)       'prints 86400

End Sub

FechaAgregar ()

DateAdd() devuelve una Date a la que se ha agregado una fecha o un intervalo de tiempo específico.

Sintaxis

DateAdd ( interval, number, date  ) 
  • intervalo puede ser cualquiera de los intervalos definidos en la función DatePart()
  • número Expresión numérica que es el número de intervalos que desea agregar. Puede ser positivo (para obtener fechas en el futuro) o negativo (para obtener fechas en el pasado).
  • fecha es una Date o literal que representa la fecha a la que se agrega el intervalo

Ejemplos:

Sub DateAddExamples()

    Dim Sample As Date
    'Create sample date and time of 2016-07-28 12:34:56
    Sample = DateSerial(2016, 7, 28) + TimeSerial(12, 34, 56)
    
    ' Date 5 months previously (prints 2016-02-28):
    Debug.Print Format$(DateAdd("m", -5, Sample), "yyyy-mm-dd")
    
    ' Date 10 months previously (prints 2015-09-28):
    Debug.Print Format$(DateAdd("m", -10, Sample), "yyyy-mm-dd")
    
    ' Date in 8 months (prints 2017-03-28):
    Debug.Print Format$(DateAdd("m", 8, Sample), "yyyy-mm-dd")

    ' Date/Time 18 hours previously (prints 2016-07-27 18:34:56):
    Debug.Print Format$(DateAdd("h", -18, Sample), "yyyy-mm-dd hh:nn:ss")
    
    ' Date/Time in 36 hours (prints 2016-07-30 00:34:56):
    Debug.Print Format$(DateAdd("h", 36, Sample), "yyyy-mm-dd hh:nn:ss")

End Sub

Conversión y Creación

CDate ()

CDate() convierte algo de cualquier tipo de datos a un tipo de Date

Sub CDateExamples()

    Dim sample As Date

    ' Converts a String representing a date and time to a Date
    sample = CDate("September 11, 2001 12:34")
    Debug.Print Format$(sample, "yyyy-mm-dd hh:nn:ss")      ' prints 2001-09-11 12:34:00
    
    ' Converts a String containing a date to a Date
    sample = CDate("September 11, 2001")
    Debug.Print Format$(sample, "yyyy-mm-dd hh:nn:ss")      ' prints 2001-09-11 00:00:00

    ' Converts a String containing a time to a Date
    sample = CDate("12:34:56")
    Debug.Print Hour(sample)                        ' prints 12
    Debug.Print Minute(sample)                      ' prints 34
    Debug.Print Second(sample)                      ' prints 56
    
    ' Find the 10000th day from the epoch date of 1899-12-31
    sample = CDate(10000)
    Debug.Print Format$(sample, "yyyy-mm-dd")       ' prints 1927-05-18
    
End Sub

Tenga en cuenta que VBA también tiene un CVDate() escrito de forma CVDate() que funciona de la misma manera que la función CDate() , aparte de devolver una Variant tipo de fecha en lugar de una Date tipo muy fuerte. La versión CDate() debe ser preferida cuando se pasa a un parámetro de Date o se asigna a una variable de Date , y la versión CVDate() debe preferir cuando se pasa a un parámetro de Variant o se asigna a una variable de Variant . Esto evita la conversión implícita de tipos.


DateSerial ()

DateSerial() función DateSerial() se utiliza para crear una fecha. Devuelve una Date para un año, mes y día especificados.

Sintaxis:

DateSerial ( year, month, day ) 

Con año, mes y día los argumentos son enteros válidos (año de 100 a 9999, mes de 1 a 12, día de 1 a 31).

Ejemplos

Sub DateSerialExamples()

    ' Build a specific date
    Dim sample As Date
    sample = DateSerial(2001, 9, 11)
    Debug.Print Format$(sample, "yyyy-mm-dd")                   ' prints 2001-09-11
    
    ' Find the first day of the month for a date.
    sample = DateSerial(Year(sample), Month(sample), 1)
    Debug.Print Format$(sample, "yyyy-mm-dd")                   ' prints 2001-09-11
    
    ' Find the last day of the previous month.
    sample = DateSerial(Year(sample), Month(sample), 1) - 1
    Debug.Print Format$(sample, "yyyy-mm-dd")                   ' prints 2001-09-11
    
End Sub

Tenga en cuenta que DateSerial() aceptará fechas "no válidas" y calculará una fecha válida a partir de ellas. Esto puede ser usado creativamente para bien:

Ejemplo positivo

Sub GoodDateSerialExample()

    'Calculate 45 days from today
    Dim today As Date
    today = DateSerial (2001, 9, 11)
    Dim futureDate As Date
    futureDate = DateSerial(Year(today), Month(today), Day(today) + 45)
    Debug.Print Format$(futureDate, "yyyy-mm-dd")            'prints 2009-10-26

End Sub

Sin embargo, es más probable que cause dolor al intentar crear una fecha a partir de una entrada de usuario no validada:

Ejemplo negativo

Sub BadDateSerialExample()

    'Allow user to enter unvalidate date information
    Dim myYear As Long
    myYear = InputBox("Enter Year")                                         
            'Assume user enters 2009
    Dim myMonth As Long
    myMonth = InputBox("Enter Month")                                       
            'Assume user enters 2
    Dim myDay As Long
    myDay = InputBox("Enter Day")                                           
            'Assume user enters 31
    Debug.Print Format$(DateSerial(myYear, myMonth, myDay), "yyyy-mm-dd")   
            'prints  2009-03-03

End Sub


Modified text is an extract of the original Stack Overflow Documentation
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow