VBA
Манипуляция времени по времени
Поиск…
Календарь
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