Поиск…


Календарь

VBA поддерживает 2 календаря: григорианский и хиджры

Свойство Calendar используется для изменения или отображения текущего календаря.

2 значения для Календаря:

Значение постоянная Описание
0 vbCalGreg Григорианский календарь (по умолчанию)
1 vbCalHijri Календарь Hijri

пример

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

Этот Sub печатает следующее:

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

Базовые функции

Получить систему DateTime

VBA поддерживает 3 встроенные функции для извлечения даты и / или времени из часов системы.

функция Тип возврата Возвращаемое значение
Сейчас Дата Возвращает текущую дату и время
Дата Дата Возвращает часть даты текущей даты и времени
Время Дата Возвращает временную часть текущей даты и времени
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

Функция таймера

Функция Timer возвращает значение Single, представляющее количество секунд, прошедших с полуночи. Точность составляет сотую доли секунды.

Sub TimerExample()

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

End Sub

Поскольку функции «В Now Time и « Time являются точными до нескольких секунд, Timer предлагает удобный способ повысить точность измерения времени:

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 () проверяет, является ли выражение допустимой датой или нет. Возвращает 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

Функции экстракции

Эти функции принимают Variant который может быть передан в Date как параметр и возвращает Integer представляющее часть даты или времени. Если параметр не может быть применен к Date , это приведет к ошибке времени выполнения 13: несоответствие типа.

функция Описание Возвращаемое значение
Год() Возвращает часть года аргумента даты. Целое число (от 100 до 9999)
Месяц() Возвращает месячную часть аргумента date. Целое число (от 1 до 12)
День() Возвращает дневную часть аргумента date. Целое число (от 1 до 31)
WeekDay () Возвращает день недели аргумента даты. Принимает необязательный второй аргумент, определяющий первый день недели Целое число (от 1 до 7)
Час() Возвращает часовую часть аргумента date. Целое число (от 0 до 23)
Минута () Возвращает минутную часть аргумента date. Целое число (от 0 до 59)
Во-вторых () Возвращает вторую часть аргумента date. Целое число (от 0 до 59)

Примеры:

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

Функция DatePart ()

DatePart() также является функцией, возвращающей часть даты, но работает по-разному и предоставляет больше возможностей, чем функции выше. Он может, например, вернуться в квартал года или в Неделю года.

Синтаксис:

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

интервальный аргумент может быть:

интервал Описание
«Гггг» Год (от 100 до 9999)
«У» День года (от 1 до 366)
«М» Месяц (от 1 до 12)
«Д» Четверть (от 1 до 4)
"WW" Неделя (от 1 до 53)
«Ж» День недели (от 1 до 7)
«Г» День месяца (от 1 до 31)
"час" Час (от 0 до 23)
«П» Минута (от 0 до 59)
"S" Второй (от 0 до 59)

firstdayofweek не является обязательным. это константа, указывающая первый день недели. Если не указано, предполагается vbSunday .

firstweekofyear не является обязательным. это константа, указывающая первую неделю года. Если не указано, первая неделя считается неделей, в которой происходит 1 января.

Примеры:

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

Функции вычисления

DateDiff ()

DateDiff() возвращает Long представляющий количество интервалов времени между двумя указанными датами.

Синтаксис

DateDiff ( interval, date1, date2  [, firstdayofweek] [, firstweekofyear] )
  • интервал может быть любым из интервалов, определенных в функции DatePart()
  • date1 и date2 являются две даты , которые вы хотите использовать в расчетах
  • firstdayofweek и firstweekofyear являются необязательными. Обратитесь к функции DatePart() для объяснений

Примеры

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

DateAdd ()

DateAdd() возвращает Date к которой была добавлена ​​указанная дата или временной интервал.

Синтаксис

DateAdd ( interval, number, date  ) 
  • интервал может быть любым из интервалов, определенных в функции DatePart()
  • number Числовое выражение, которое представляет собой количество интервалов, которые вы хотите добавить. Это может быть положительным (для получения дат в будущем) или отрицательным (для получения дат в прошлом).
  • date - Date или литерал, представляющий дату, в которую добавлен интервал

Примеры :

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

Преобразование и создание

CDate ()

CDate() преобразует что-то из любого типа данных в тип данных 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

Обратите внимание, что VBA также имеет слабо типизированный CVDate() который функционирует так же, как и CDate() от возвращаемого Variant типизированной датой вместо строго типизированной Date . Версия CDate() должна быть предпочтительной при переходе к параметру Date или присвоении переменной Date , а CVDate() должна быть предпочтительной при переходе к параметру Variant или присвоении переменной Variant . Это позволяет избежать неявного литья типов.


DateSerial ()

DateSerial() используется для создания даты. Он возвращает Date для указанного года, месяца и дня.

Синтаксис:

DateSerial ( year, month, day ) 

Имеются действительные аргументы год, месяц и день. Целые числа (год от 100 до 9999, месяц от 1 до 12, день от 1 до 31).

Примеры

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

Обратите внимание, что DateSerial() принимает «недействительные» даты и вычисляет действительную дату из него. Это можно использовать творчески для хорошего:

Положительный пример

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

Однако при попытке создать дату из неутвержденного пользовательского ввода чаще возникает гореча:

Отрицательный пример

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow