Работа с датой и временем

Для хранения даты и времени в языке VBA предназначен тип данных Date. Объявить переменную позволяет следующий код:

Dim d As Date

При присваивании значения дата и время должны быть расположены внутри символов #, в следующих форматах:

d = #8/20/2012# ' #месяц/день/год#
Debug.Print d  ' 20.08.2012
d = #8/20/2012 10:48:12 AM#
Debug.Print d  ' 20.08.2012 10:48:12
d = #8/20/2012 10:48:12 PM#
Debug.Print d  ' 20.08.2012 22:48:12
d = #10:48:12 PM# ' AM - до полудня, а PM - после полудня
Debug.Print d  ' 22:48:12

Значение даты должно быть в диапазоне от 1 января 100 года до 31 декабря 9999 года, а значение времени в диапазоне от 0:00:00 до 23:59:59. Дата и время хранятся в виде вещественного числа. Целая часть представляет количество дней, а дробная часть — время. Числу 0 соответствует дата 30 декабря 1899 года, положительные значения представляют даты после этого дня, а отрицательные — до этого дня. Пример:

d = 1
Debug.Print d ' 31.12.1899
d = 41150
Debug.Print d ' 29.08.2012
d = -8500
Debug.Print d ' 21.09.1876

Задать значение даты и времени позволяют также следующие функции:

  • DateSerial(<Год>, <Месяц>, <День>) — задает значение для даты:
Debug.Print DateSerial(2012, 9, 19) ' 19.09.2012
  • TimeSerial(<Часы>, <Минуты>, <Секунды>) — задает значение для времени:
Debug.Print TimeSerial(14, 5, 12) ' 14:05:12
  • DateValue(<Строка с датой>) — преобразует строку с датой в значение типа Variant (Date). Если строку преобразовать невозможно, то возникает ошибка. Пример:
Debug.Print DateValue("9/19/2012")        ' 19.09.2012
Debug.Print DateValue("19 Сентября 2012") ' 19.09.2012
Debug.Print DateValue("19.09.2012")       ' 19.09.2012
  • TimeValue(<Строка со временем>) — преобразует строку со временем в значение типа Variant (Date). Пример:
Debug.Print TimeValue("17:12:35")   ' 17:12:35

Получение текущей даты и времени

Получить текущую дату и время позволяют следующие функции:

  • Time() — возвращает системное время:
Dim d As Date
d = Time
Debug.Print d  ' 20:32:44

Функция Time() возвращает значение типа Variant (Date). Чтобы получить значение типа String следует использовать функцию Time$(). Пример:

Debug.Print Time$  ' 20:32:44
  • Date() — возвращает системную дату:
d = Date
Debug.Print d  ' 18.09.2012

Функция Date() возвращает значение типа Variant (Date). Чтобы получить значение типа String следует использовать функцию Date$(). Пример:

Debug.Print Date$  ' 09-18-2012
  • Now() — возвращает системную дату и время (тип Variant (Date)):
d = Now
Debug.Print d  ' 18.09.2012 20:32:44
  • Timer() — возвращает количество секунд (число, имеющее тип Single), прошедших с начала суток:
Debug.Print Timer ' 75029,61

Получение отдельных составляющих даты и времени

Получить значения отдельных составляющих даты и времени позволяют следующие функции:

  • Day(<Дата>) — возвращает день месяца (значение типа Variant (Integer)):
Debug.Print Day(#9/20/2012#)  ' 20
  • Month(<Дата>) — возвращает месяц (значение типа Variant (Integer)):
Debug.Print Month(#9/20/2012#)  ' 9
  • Year(<Дата>) — возвращает год (значение типа Variant (Integer)):
Debug.Print Year(#9/20/2012#)  ' 2012
  • Weekday(<Дата>[, <Первый день недели>]) — возвращает день недели (значение типа Variant (Integer)). Во втором параметре указывается первый день недели (константы vbMonday, vbTuesday, vbWednesday, vbThursday, vbFriday, vbSaturday, vbSunday (значение по умолчанию)). Пример:
Debug.Print Weekday(#9/20/2012#)            ' 5
Debug.Print Weekday(#9/20/2012#, vbMonday)  ' 4
  • Hour(<Время>) — возвращает часы (значение типа Variant (Integer)):
Debug.Print Hour(#10:10:57 PM#) ' 22
  • Minute(<Время>) — возвращает минуты (значение типа Variant (Integer)):
Debug.Print Minute(#10:10:57 PM#) ' 10
  • Second(<Время>) — возвращает секунды (значение типа Variant (Integer)):
Debug.Print Second(#10:10:57 PM#) ' 57
  • DatePart() — возвращает указанный компонент даты. Формат функции:
DatePart(<Компонент>, <Дата>[, <Первый день недели>[,
         <Первая неделя года>]])

В первом параметре задается строка с одним из значений: yyyy (год), q (квартал), m (месяц), y (день года), d (день месяца), w (день недели), ww (неделя), h (часы), n (минуты) и s (секунды), а во втором параметре — значение даты. В третьем параметре указывается первый день недели (константы vbMonday, vbTuesday, vbWednesday, vbThursday, vbFriday, vbSaturday, vbSunday (значение по умолчанию)), а в четвертом параметре — первая неделя года (константы vbFirstJan1 (значение по умолчанию), vbFirstFullWeek, vbFirstFourDays и vbUseSystem). Пример:

Dim d As Date
d = #8/20/2012 10:48:12 PM#
Debug.Print DatePart("yyyy", d)        ' 2012
Debug.Print DatePart("q", d)           ' 3
Debug.Print DatePart("m", d)           ' 8
Debug.Print DatePart("y", d)           ' 233
Debug.Print DatePart("d", d)           ' 20
Debug.Print DatePart("w", d)           ' 2
Debug.Print DatePart("w", d, vbMonday) ' 1
Debug.Print DatePart("ww", d)          ' 34
Debug.Print DatePart("h", d)           ' 22
Debug.Print DatePart("n", d)           ' 48
Debug.Print DatePart("s", d)           ' 12
  • WeekdayName(<Номер>[, <Флаг>[, <Первый день недели>]]) — возвращает название дня недели в виде строки. В первом параметре указывается порядковый номер дня в неделе. Если во втором параметре задано значение False (значение по умолчанию), то возвращается полное название дня недели, а если True — то сокращенное. В третьем параметре указывается первый день недели (константы vbMonday, vbTuesday, vbWednesday, vbThursday, vbFriday, vbSaturday, vbSunday и vbUseSystemDayOfWeek (значение по умолчанию)). Пример:
Debug.Print WeekdayName(1, False, vbMonday) ' понедельник
Debug.Print WeekdayName(1, True, vbMonday)  ' Пн
  • MonthName(<Номер>[, <Флаг>]) — возвращает название месяца в виде строки. Если во втором параметре задано значение False (значение по умолчанию), то возвращается полное название месяца, а если True — то сокращенное. Пример:
Debug.Print MonthName(1, False) ' Январь
Debug.Print MonthName(1, True)  ' янв

Манипуляции датой и временем

Благодаря тому, что дата и время хранятся в виде вещественного числа, мы можем над двумя значениями выполнять арифметические операции сложения и вычитания. Например, прибавим и вычтем 10 дней:

d = #8/20/2012# + 10
Debug.Print d  ' 30.08.2012
d = #8/20/2012# - 10
Debug.Print d  ' 10.08.2012

Теперь прибавим и вычтем 10 минут:

d = #8/20/2012# + #12:10:00 AM#
Debug.Print d  ' 30.08.2012
d = #8/20/2012# - #12:10:00 AM#

Добавить или вычесть указанный интервал позволяет функция DateAdd(). Функция возвращает новую дату. Формат функции:

DateAdd(<Интервал>, <Значение>, <Дата>)

В первом параметре задается строка с одним из значений: yyyy (год), q (квартал), m (месяц), y (день года), d (день месяца), w (день недели), ww (неделя), h (часы), n (минуты) и s (секунды), а во втором параметре — значение интервала. Третий параметр задает начальное значение даты. Пример:

Dim d As Date
d = #8/20/2012 10:48:12 PM#
Debug.Print DateAdd("yyyy", 1, d)        ' 20.08.2013 22:48:12
Debug.Print DateAdd("yyyy", -1, d)       ' 20.08.2011 22:48:12
Debug.Print DateAdd("q", 1, d)           ' 20.11.2012 22:48:12
Debug.Print DateAdd("m", 1, d)           ' 20.09.2012 22:48:12
Debug.Print DateAdd("y", 1, d)           ' 21.08.2012 22:48:12
Debug.Print DateAdd("d", 1, d)           ' 21.08.2012 22:48:12
Debug.Print DateAdd("w", 1, d)           ' 21.08.2012 22:48:12
Debug.Print DateAdd("ww", 1, d)          ' 27.08.2012 22:48:12
Debug.Print DateAdd("h", 1, d)           ' 20.08.2012 23:48:12
Debug.Print DateAdd("n", 1, d)           ' 20.08.2012 22:49:12
Debug.Print DateAdd("s", 1, d)           ' 20.08.2012 22:48:13

Получить количество интервалов между двумя датами позволяет функция DateDiff(). Формат функции:

DateDiff(<Интервал>, <Дата1>, <Дата2>[,<Первый день недели>[,
         <Первая неделя года>]])

В первом параметре задается строка с одним из значений: yyyy (год), q (квартал), m (месяц), y (день года), d (день месяца), w (день недели), ww (неделя), h (часы), n (минуты) и s (секунды). В четвертом параметре указывается первый день недели (константы vbMonday, vbTuesday, vbWednesday, vbThursday, vbFriday, vbSaturday, vbSunday (значение по умолчанию)), а в пятом параметре — первая неделя года (константы vbFirstJan1 (значение по умолчанию), vbFirstFullWeek, vbFirstFourDays и vbUseSystem). Пример:

Dim d As Date
d = #8/20/2012 10:48:12 PM#
Debug.Print DateDiff("yyyy", d, #8/30/2020#) ' 8
Debug.Print DateDiff("q", d, #8/30/2013#)    ' 4
Debug.Print DateDiff("m", d, #8/30/2013#)    ' 12
Debug.Print DateDiff("y", d, #8/30/2013#)    ' 375
Debug.Print DateDiff("d", d, #8/30/2013#)    ' 375
Debug.Print DateDiff("w", d, #8/30/2013#)    ' 53
Debug.Print DateDiff("ww", d, #8/30/2013#)   ' 53
Debug.Print DateDiff("h", d, #8/20/2012 11:48:12 PM#) ' 1
Debug.Print DateDiff("n", d, #8/20/2012 10:50:12 PM#) ' 2
Debug.Print DateDiff("s", d, #8/20/2012 10:48:50 PM#) ' 38

Форматирование даты и времени

Получить форматированный вывод даты и времени позволяют следующие функции:

  • Format() — возвращает строковое представление даты в соответствии со строкой формата. Подробное описание функции приведено в разд. 5.6. Пример:
Dim d As Date
d = #8/20/2012 10:48:12 PM#
Debug.Print Format(d, "dd/mm/yyyy")  ' 20.08.2012
Debug.Print Format(d, "hh:nn:ss")    ' 22:48:12
  • FormatDateTime(<Дата>[, <Формат>]) — возвращает строковое представление даты в соответствии со значением параметра <Формат>. Параметр <Формат> может принимать следующие значения:
  • vbGeneralDate — дата в сокращенном формате, а время в полном формате;
  • vbShortDate — сокращенный формат даты;
  • vbLongDate — полный формат даты;
  • vbShortTime — сокращенный формат времени;
  • vbLongTime — полный формат времени.

Форматы зависят от региональных настроек компьютера. Пример:

Dim d As Date
d = #8/20/2012 10:48:12 PM#
Debug.Print FormatDateTime(d) ' 20.08.2012 22:48:12
Debug.Print FormatDateTime(d, vbGeneralDate)
' 20.08.2012 22:48:12
Debug.Print FormatDateTime(d, vbShortDate) ' 20.08.2012
Debug.Print FormatDateTime(d, vbLongDate)  ' 20 Август 2012 г.
Debug.Print FormatDateTime(d, vbShortTime) ' 22:48
Debug.Print FormatDateTime(d, vbLongTime)  ' 22:48:12

Засыпание скрипта

В ряде случаев возникает необходимость прервать выполнение скрипта на некоторое время. При этом другие процессы должны выполняться. Произвести данное действие позволяет функция DoEvents(). В момент вызова функции управление передается операционной системе. Управление возвращается приложению только после обработки всех ожидающих событий.

Создадим процедуру Sleep(), которая будет приостанавливать выполнение скрипта на указанное в параметре количество секунд:

Sub Sleep(Pause As Integer)
   Dim Start
   Start = Timer
   Do While Timer < Start + Pause
      DoEvents
   Loop
End Sub

Прервев выполнение программы на 10 секунд и замерим время выполнения:

Debug.Print Timer
Sleep 10 ' "Засыпаем" на 10 секунд
Debug.Print Timer

Изменение системной даты и времени

Изменить системную дату позволяет инструкция Date. Формат инструкции:

Date = <Новая дата>

Пример:

Date = #9/20/2012#

Для изменения системного времени предназначена инструкция Time. Формат инструкции:

Time = <Новое время>

Пример:

Time = #11:50:00 PM#

Visual Basic for Applications (VBA)
Статьи по Visual Basic for Applications (VBA)

Помощь сайту

Yandex-деньги: 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов