Remkomplekty.ru

IT Новости из мира ПК
13 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Vba excel текущая дата и время

Урок 15 по VBA — функции работы с датой и временем

И так, в этой по своей природе унылой публикации я кратко рассмотрю vba функции даты и времени, которые позволяют получить или установить параметры даты и времени, задать таймер выполнения заданного блока кода или сценария в целом. Также в конце статьи будет затронута функция vba языка format. Которая отвечает за форматирование данных.

Функции VBA даты и времени

Date () – позволяет получить значение текущей даты, установленной в системе.

Time () – вернет установленное в системе время

Now () – комбинированная функция, так как она позволяет получить значение системной даты и времени.

DateAdd (интервал, число, дата) – позволяет прибавить к заданной дате (параметр “дата”) указанное количество лет, кварталов, месяцев или секунд. На выходе мы получим следующее значение: дата + (число * интервал).

DateDiff (интервал, дата, дата2) – позволяет получить разницу между заданными датами, например. В годах, месяцах и так далее, разница определяется параметром “интервал”.

DatePart (интервал, дата) – позволяет получить заданную часть даты, например, только значение года, месяца или дня недели. Результат возврата регулируется параметром “интервал”.

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

DateValue (строка) – аналог предыдущей функции, но тут в качестве параметра мы передаем не числа. А строковое значение, на основе которого будет возвращаться дата, vba работа с датами.

Day (дата) – позволяет получить значение текущего дня (если отсутствует параметр “дата”) или для заданной даты.

Year (дата) – позволяет получить значение текущего года (если отсутствует параметр “дата”) или для заданной даты.

Month (дата) – позволяет получить значение текущего месяца (если отсутствует параметр “дата”) или для заданной даты.

Weekday (дата) – позволяет получить значение текущей недели (если отсутствует параметр “дата”) или для заданной даты.

Hour (время) – позволяет получить текущее значение часов (если отсутствует параметр “время”) или для заданного времени, vba дата и время.

Minute (время) – позволяет получить текущее значение минут (если отсутствует параметр “время”) или для заданного времени.

Second (время) – позволяет получить текущее значение секунд (если отсутствует параметр “время”) или для заданного времени.

Timer () – удобная функция для определения промежутка времени, ушедшего на выполнение заданного блока кода. Сама функция возвращает целое количество секунд, которые прошли начиная с полуночи.

TimeSerial (часы, минуты, секунды) – позволяет получить время, заданное тремя параметрами

TimeValue (строка) – работает аналогично предыдущей функции, но для получения времени, передается не целое значение, а строковое.

MonthName (числовое значение) – VBA функция позволяет получить название месяца, в качестве параметра указываем номер месяца.

WeekDay (дата) — задает возвращает имя месяца словами по его номеру. Возвращаемое значение зависит от региональных настроек. Если они русские, то вернется русское название месяца.

Помимо указанных выше vba функций даты и времени, можно использовать и такие вариации:

Date (дата) – позволяет задать системную дату

Time (время) – позволяет задать системное время.

В приведенных выше функциях даты и времени vba языка используется параметр “интервал”, который может принимать следующие значения:

VBA функции форматирование данных

Для форматирования данных в языке VBA используется функция Format , которая позволяет сформировать данные любого встроенного типа, используя заданный образец. Общий синтаксис функции format:

Format (Выражение, [“формат”, [первый день недели, [первая неделя года]]]) – тут параметр “выражение” является любым допустимым значением. Формат – необязательный параметр, который задает формат данных, должен заключаться в кавычки. Остальные два параметра также являются необязательными, и задают день недели, который нужно считать первым, и первую неделю года.

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

  • General Number – числовое значение без выделения разрядов тысяч, например, 12150,2003
  • Currency – денежный формат, выделяются тысячные разряды и два знака после запятой, например, 255,33р.
  • Fixed – числовое значение без выделения разрядов тысяч и двумя знаками после запятой, например, 22439,12.
  • Standart – числовое значение, которое умножается на 100, при этом, остаются два знака после запятой и символ процента, например, 55,63%.
  • Scientific – числовой формат для научных вычисление, например, 5,23Е+03
  • Yes/No – данный параметр определяет, что функция вернет “Да” если форматированное выражение содержит строку Нет, или ненулевое значение и “Нет” в противном случае.
  • True/False – аналог предыдущего параметра, но для строк “Истина” и “Ложь”.
  • On/Off – для строк вида “Вкл” и “Выкл”.
  • General Date – форматирование выражения в соответствии с установленными в системе стандартами даты и времени, например, 10.11.02 12:25:50
  • Long Date – вывод полного формата даты, в зависимости от установок в системе, например, 10 октября 2013 г, vba функции даты.
  • Medium Date – средний формат дат, например, 10-Окт-13.
  • Short Date – короткий вывод формата даты, например, 10.10.13.
  • Long Time – вывод в формате времени (часы, минуты, секунды), например, 12:20:40.
  • Medium Time – 12 часовой формат времени (часы, минуты), например, 05:30.
  • Short Time — 24 часовой формат времени (часы, минуты), например, 17:30.

Спасибо за внимание. Автор блога Владимир Баталий

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

Функция GetRealTime выполняет HTTP-запрос к заданному серверу,
и из заголовка Date ответа сервера берёт текущее время и дату.

Сделано на примере сервера Яндекса (их сайт почти всегда доступен, и работает очень быстро)

Функция полезна, когда надо получить реальную дату (а не ту, которая выставлена на компе), — например, для вычисления оставшегося времени использования trial-версии программы.

Код функции GetRealTime:

  • 10662 просмотра

Комментарии

GMT_Time = CDate(Replace(GMT_Time, m$, mv$)) вместо того, что с Format?
Антону в сообщении от «8 Сен 2014 — 13:21» не пришлось бы изобретать

Добрый день,
Скажите пожалуйста, а как сделать так, что бы отображалось только время, без даты?

Еще раз добрый день,

Я вроде разобрался. Если заменить «.» на «/» в строке:
GMT_Time = Replace(GMT_Time, » » & m$ & » «, «.» & Format(mv$, «00») & «.»)
. то работает в обоих кодировках

С уважением к вам и вашей работе,
Антон

Добрый день, Игорь!

Извините, совсем не хотел вас обидеть. Я часто полюзуюсь вашими макросами и они отличные. Clear/Clean — моя опечатка, добавлял вручную, пока писал вам сообщение. В коде был Clear.

Я бы не стал лезть в макрос, если он бы у меня работал. Я только сейчас разобрался, в чем было несоответствие. Ваш макрос работает, если в Панели управления Windows выбран русский язык (Языки и региональные настройки — наверно так она должна называться в русском Windows). Я же использую раскладку UK, но с обычным представлением даты DD/MM, а не наоборот как у британцев. При этой кодировке я получаю вместо даты — «00:00:00»

Читать еще:  Копирование листов в excel vba

Как можно изменить ваш макрос, чтобы он отображал дату вне зависимости от языковых настроек?

С уважением к вам и вашей работе,
Антон

Антон, вот есть на сайте функция, она работает (в этом можно убедиться)
Вы, зачем-то, её переделываете, допуская синтаксические ошибки, — а потом жалуетесь, что не работает.
Нафига переделывать то, что работает? 5 строк сэкономили?

зачем менять Err.Clear на Err.Clean .
зачем вырезать из функции 2 нужные строки?

оставьте функцию как есть (если хотите, чтобы все работало), — и не занимайтесь ерундой.

Игорь, еще раз добрый день!

Проверил вашу фунцию GetRealTime такой как она есть в Excel2003 и 2010
получил ответ — 00:00:00
Отключил игнирорование ошибок — получил «Run-time error ’13’. Type mismatch»

Очень нужна ваша помощь!
Мне очень нужно получить реальную дату из инета в формате «дата», напр. 05/09/14

Заранее огромное спасибо!

С уважением, Антон

Добрый день, Игорь!

Очень нужна ваша помощь со следующим кодом (код ваш, но был немножко подредактирован)

Function Ctrlkb() As Date
On Error Resume Next: Err.Clean: Dim http As Object, URL$, colum$, m$, mv$: Set http = CreateObject(«Microsoft.XMLHTTP»)
URL$ = «http://ya.ru/»: http.Open «GET», URL$, False: http.Send: colum = http.GetResponseHeader(«Date»)
Set http = Nothing: If Not (colum Like «. *# . #### ##:##:##*GMT*») Then Exit Function
colum = Trim(Split(colum, «,»)(1)): colum = Trim(Split(colum, «GMT»)(0)): colum = Trim(Left(colum, 11)): Ctrlkb = CDate(colum)
End Function

На некоторых машинах нормально выдает дату нужном формате «Дата» 🙂

на других — «0:00:00»
Отключаем «On Error Resume Next: Err.Clean»
получаем «Run-time error ’13’. Type mismatch»
или «Run-time error ’70’. Permission denied»

Может быть что либо отключено в Excel?

С уважением, Антон

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

Добавьте первой строкой в функцию

Здравствуйте,
столкнулся с проблемой: данный макрос автоматически не обновляет дату из интернета.
Ф-ция getrealtime(3) находится на скрытом и закрытом от редактирования листе. Аналогичная ф-ция сегодня() работает на таком листе. Как можно настроить getrealtime для автоматического обновления даты при открытии файла, а не только при вводе в ячейку? Причем передсчет формул включен, но тоже не помогает.

Vba excel текущая дата и время

malaxov
Многовато лишнего, зачем то идет копирование выделенной ячейки? (в той что только что вставили дату)

если просто вставить дату и активировать правую ячейку то

Private Sub CommandButton2_Click()
ActiveCell.FormulaR1C1 = «=TODAY()» ‘вставляем дату
ActiveCell.Offset(0, 1).Activate ‘активируем соседнюю справа ячейку
End Sub

V3
Многовато лишнего, зачем то идет копирование выделенной ячейки?

Дык, он хочет не формулу, а значение вставить.

Private Sub CommandButton2_Click()
ActiveCell = Date ‘вставляем дату
ActiveCell.Offset(0, 1).Activate ‘активируем соседнюю справа ячейку
End Sub

И еще такой небольшой вопросик: данный макрос используется в таком файле, в который нужно вносить платежки. Для облегчения труда «оператора платежек» добавлены две кнопки — «добавить строку» и «сегодня» (которая вставляет дату и отодвигает курсор для ввода суммы). А как предусмотреть такую возможность для автоматического расчета комиссии, т.е. в ячейку G10 вводится сумма, а макрос автоматически определяет ту ячейку, где занесена комиссия (в данном случае это E4), т.е. первую заполненную в столбце E выше от ряда занесения суммы, а затем умножает вводимую сумму на значение комиссии, делит произведение на 100 и записывает значение в соответствующую соседнюю ячейку. А также желательно было бы, чтобы макрос применялся только к столбцам, где заполненной является самая первая ячейка в ряду. В данном случае в ячейке G1 занесены значение месяца и года.
Сложная задачка? 🙂

К сообщению приложены файлы: 1.png, 700×500, 59Кb

Что вот так если в G внесены данные ищем ближайшее верхнее по столбцу Е перемножаем и делим на 100
записывает значение в соответствующую соседнюю ячейку это в какую? я положил данные в столбец Н
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address Like «*G*» Then
While Target.Offset(-i, -2).Value = Empty
i = i + 1
Wend
Target.Offset(0, 1).Value = Target.Value * Target.Offset(-i, -2).Value / 100
End If
End Sub

желательно было бы, чтобы макрос применялся только к столбцам, где заполненной является самая первая ячейка в ряду
Первая ячейка объединненая и она определяется верхней левой ячейкой т.е. ее адрес не G1, а F1. Надо проверять есть ли какая либо запись в ней? я правильно понимаю

Добавление от 02.07.2006 22:38:

Подправил согласно комментариям
Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Address Like «*G*» And Cells(1, 7).Value <> Empty Then
While Target.Offset(-i, -2).Value = Empty And Target.Offset(-i, -2).Row > 1
i = i + 1
Wend
Target.Offset(0, 1).Value = Target.Value * Target.Offset(-i, -2).Value / 100
End If

Пара условий:
1. Не вводить текст в столбец G, должны вводиться цифры, не предусмотрена проверка на ввод
2. Нельзя выделять несколько ячеек в столбце G и нажимать Del, не предусмотрена проверка выделения и изменения сразу нескольких ячеек
3. Сделана проверка только есть данные в столбце Е или нет (иначе можно выйти выше первой строки)

Работа с датами в Visual Basic / Excel

Очень новичок в работе с Visual Basic / Excel. Я пытаюсь написать быстрый скрипт, который вводит текущее время в один столбец и позволяет пользователю ввести, сколько days/hours/minutes пройдет до Нового времени, и вывести это в другом столбце.

Я уверен, что это не лучший способ сделать это, но то, что у меня есть до сих пор, заключается в следующем. Я отказался от возни с датами, и я просто работаю со временем:

Я получаю ошибку, конечно. Если бы кто-нибудь мог пролить свет на лучший способ сделать это, наряду с функциями, которые я неправильно использую, я был бы очень признателен!

Edit: я бы, конечно, хотел, чтобы сценарий также обрабатывал дни.

3 Ответа

Я думаю, что это возможно, просто используя функции ячейки в Excel, если я правильно вас понял.

Например, вот что вы увидите.

и это то, что находится в каждой ячейке (предполагая, что верхняя левая ячейка-A1).

Описание каждой функции:

  • NOW() возвращает текущую дату и время, отформатированные как дата и время.
  • DATE(year,month,day) возвращает число, представляющее дату в коде даты-времени MS Excel.
  • TIME(hours,minutes,seconds) преобразует часы, минуты и секунды, заданные в виде чисел, в серийный номер Excel, отформатированный в формате времени.

Рассечение уравнения в последней ячейке:

  • A2 -это ячейка, содержащая текущую дату / время (по состоянию на последний расчет рабочего листа).
  • B2 -это введенное пользователем значение для дней.
  • TIME(C2,D2,0) — это функция TIME(), принимающая введенные пользователем значения для часов и минут из ячеек C2 и D2 соответственно.

Это что-то вроде вашей предполагаемой функциональности.

Если вы хотите использовать VBA, единственная проблема с вашим кодом-это функция «Time». Вместо этого вы можете использовать CDate :

Когда вы ‘Dim’ таким образом, вы должны записать тип данных для каждой переменной. То, как у вас есть это MinutesLeft, является двойным, и все (по умолчанию)является вариантом.

Функция времени, которую вы ищете, — это TimeSerial.

Читать еще:  Tab в excel

Даты хранятся в виде числа дней, прошедших с определенной даты. Чтобы добавить дни к дате, вы можете просто сложить числа вместе.

Похожие вопросы:

Есть ли какой-либо инструмент или код, который позволил бы мне отображать Excel 2003 Sheet or part of it в форме Visual Basic 6.0, чтобы он мог редактироваться в среде выполнения vb 6.0?

я хочу получить значение столбца A excel sheet1 в некоторую переменную visual basic, а затем после изменения этого значения отправить обратно в следующий лист2

У меня есть Button1_click, чтобы открыть файл Excel, но файл excel скрывается за visual basic. Как просмотреть файл excel и сделать его режимом редактирования, хотя программа visual basic запущена?

Работа на хосте Windows 7 Enterprise x64 с установленной 64-разрядной версией Microsoft Office Professional Plus 2016. Я хотел бы создать Visual Basic script vbscript (файл на моем рабочем столе.

Я пытаюсь использовать Visual Basic в пределах Excel, чтобы использовать макрос, связанный с кнопкой, для фильтрации таблицы, отображающей все строки с датами сегодня или раньше, чем сегодня. Когда.

Я хочу вызвать макрос Excel [т. е. решатель Excel] с помощью visual basic 6.

Я никогда не использовал Visual Basic раньше, но мог бы сделать с указателем на то, с чего начать. У меня есть 750 excel электронных таблиц, которые содержат различные объемы данных разных типов.

Я недавно начал программировать с .NET visual basic, используя visual basic studio. Я также использую excel VBA, чтобы сделать некоторые macros. Я был бы очень признателен, если бы кто-то мог.

Похоже, что Visual Basic не может ссылаться на листы в соответствии с измененными пользователем именами листов. На вкладках рабочего листа можно изменить их имена, но, похоже, Visual Basic.

В Excel 2016 есть опция под (щелкните правой кнопкой мыши линия на диаграмме) > форматировать ряд данных > сглаженная линия, которая делает линию на линейном графике 2D гладкой. При создании.

Visual Basic и «Проблема 2000»: особенности работы с датами в VB

В какой степени Visual Basic

В какой степени Visual Basic соответствует требованиям 2000 года? Ответ Microsoft такой:

  1. 32-разрядные версии (4.0 — 6.0) — соответствуют с незначительными проблемами;
  2. 16-разрядные версии (1.0 — 4.0) — не соответствуют;
  3. версии для DOS (QB 4.5, PDS 7.1) — не будут тестироваться.

Мое мнение несколько иное: Microsoft сильное преувеличивает опасность проблем в VB. На мой взгляд их просто нет во всех перечисленных версиях, но нужно знать особенности разных версий и соблюдать определенные правила при написании программного кода.

Преобразование из двухзначного в четырехзначное представление

Главное проблемой (по мнению Microsoft) является различия правилах преобразования года из двухзначного в четырехзначное представление. Впрочем, эти правила она сама же и меняет — четыре раза за последние пять лет.

Все версии Visual Basic for Windows до версии 3.0 включительно (а также более ранние DOS-овские варианты: VB 1.0 for DOS, QB 4.5 и PDS 7.1) двузначное представление года всегда преобразовывали в четырехзначное простым добавлением 1900. Программы такого преобразования встроены в состав внутренних библиотек продуктов и поэтому не зависят от версии операционной системы и значения текущей даты.

Отмечу от себя, что в версиях QB и PDS проблема преобразования года вообще никогда не была актуальной. Ведь единственным оператором языка, где использовалось это правило, в то время был только DATE$ — программная запись системной даты в MS-DOS. Такая функция в обычных приложениях практически не применялась. Для обычной работы с датами нужно было писать собственные процедуры, и их качество уже зависело от программиста (об этом будет разговор дальше).

В период создания VB 4.0 появился первый вариант VBA (в составе Excel 4.0) и механизм OLE Automation. В этой связи основные функции преобразования дат были переданы библиотекам OLE Automation (а не внутренним библиотекам пакетов), которым пользовались VB 4.0 и VBA. Исключением была только функция DateSerial, которая осталась внутри самого VB 4.0. (для ее реализации возможностей библиотек OLE Automation в те времена не хватало). Тогда же было изменено правило преобразования года: для двухзначного формата использовалось значение текущей системной даты. То есть сегодня при работе в VB 4.0 (16 бит) 99 сегодня будет означать 1999, а через год — 2099.

Первоначальный 32-разрядный вариант VB 4.0 использовал тот же алгоритм, что и 16-разрядный. В нем использовалась 32-разрядная Automation библиотека OleAut32.dll версии 2.10, которая входила в состав пакета. Однако позднее Microsoft решила изменить правило, введя окно в диапазоне 1930-2029 гг.: года 0-29 стали относиться к 21 веку, 30-99 — к 20-му. Однако такое изменения было выполнено только для 32-разрядного варианта OleAut32.dll (начиная с версии 2.20.4049). Таким образом VB 4.0 с новой библиотекой стал обрабатывать двухзначное представление года по новым правилам, кроме (ВНИМАНИЕ!) встроенной функции DateSerial, которая по-прежнему ориентировалась на текущее значение системной даты.

В VB и VBA (Office 97) 5.0 функция DateSerial работает уже по новым правилам (1930-2029), так как здесь используется не внутренняя библиотека пакета, а единая OleAut32.dll. Эта версия библиотеки входит в состав многих продуктов (не только Microsoft), выпущенных в 1996 году и позднее.

В сентябре прошлого года Microsoft выпустила VB 6.0, в котором был реализован тот же механизм преобразования года, что и в VB 5.0. Но не расслабляйтесь: это относится только к первым рабочим вариантам (в частности, как сообщает Microsoft, с датой до 1 августа 1998 года). В состав уже осенних релизов VB 6.0 будет включена новая версия библиотек OLE Automation, где алгоритм вычисления года опять изменен.

Но эта информация, приведенная на Web-узле Microsoft по состоянию на 6 марта 1999 года, не очень точна. Лично у меня установлен коробочный VB 6.0, приобретенный в октябре 1998 года с номером версии 6.00.8176 и датой 25.06.98. В его состав входит OleAut32.dll версии 2.30.4261 с той же датой и она уже работает по новым правилам: диапазон 100-летнего промежутка определяется установками в диалоговом окне «Control Panel|Regional Settings|Date» в Windows 98 (рис. 1 — установлен диапазон 1937-2036). Так же работает стандартная библиотека, входящая в состав Windows 98. Новая библиотека OleAut32.dll входит в состав многих новых продуктов, но для Windows 95 она может использовать диапазон, установленный по умолчанию — 1930-2029.

Обновление OleAut32.dll соответственно изменяет работу с датами в VB 4.0 и VB/VBA 5.0.

Очевидное и простое решение

Вы еще успеваете следить за изменениями алгоритма преобразования даты? Короче говоря, чтобы определить, каким образом VB-приложение делает из двухзначного года его четырехзначное представление нужно знать версию VB (для 4.0 еще и разрядность — 16 или 32), версию библиотеки OleAut32.dll и версию Windows (нужно знать еще и региональные установки, но об этом поговорим позднее). Убедиться, как же работает это преобразование на вашем компьютере, можно с помощью одной строчки кода:

Читать еще:  Excel workbooks open имяфайла

Решение проблемы очевидно — нужно сделать собственную простую подпрограмму преобразования формата даты и не зависеть ни прихотей Microsoft. Для примера создайте форму, на которой разместите окно ввода Text1, метку Label1 и командную кнопку Command1 (рис. 2). Напишите программный код для процедур Command1_Click и ConvertYear (листинг 1). Запустите приложение. Далее вводите исходную дату в текстовом окне и после щелчка кнопки вы увидите в поле метки преобразованный вариант (в данном случае в диапазоне 1951-2050 гг.)

Процедуру ConverYear можно разместить в BAS-модуле или даже в классе (поместив потом в OLE-сервер) и использовать в любом месте вашего приложения. Переменную YearWindow% можно объявить глобальной или передавать в качестве параметра и менять ее значение динамически в процессе работы приложения.

Срок работоспособности программ

В материалах Microsoft указано, что срок работоспособности VB (включая последнюю версию 6.0) — до 2030 года, а не до 2035 года, как это записано в требованиях 2000 корпорации (см. «Проблема Y2K и продукты Microsoft»). Именно поэтому VB 5.0 и 6.0 причислены к категории «соответствуют с незначительными проблемами». В чем причина таких временных границ, мне выяснить не удалось (даже после обращения с этим вопросом в Microsoft). Однако работа в тестовом режиме с QB 4.5 и VB 3.0-6.0 в течение недели с датой «март 2079 года» не выявила никаких проблем.

Работа с датами

Начиная с первой версии, в VB была введен понятие типа данных для хранения даты и тогда же появились специальные операции для работы с ними. Однако до версии 3.0 для этого просто использовался тип Variant (подтип 7) и только, начиная с 4.0, был введен специальный тип Date.

Переменная типа Date физически представляет собой вещественное число двойной точности (восемь байтов) формата IEEE, в котором хранится дата для диапазона от 1 января 100 года до 31 декабря 9999 года и время от 0:00:00 до 23:59:59. Сама дата равна целой части этого числа и соответствует порядковому номеру суток, начиная от 30 декабря 1899 года. (0 — это 30.12.1899, значения до и после этой даты имеют соответственно отрицательное и положительное значение.) Времени соответствует дробная часть числа: полночь — 0,0, а полдень — 0,5.

Если вы запустите на выполнение код (для российских региональных установок):

то получите такой результат:

ПРИМЕЧАНИЕ. Возможность использования алгоритма, применяемого Microsoft для расчета дат и дней недели, до 15 октября 1582 года вызывает серьезные возражения. Подробнее — см. статью «Y2K: как вести календарь?»

Для определения даты можно использовать любые символьные или числовые выражения, а также литералы (выражения заключенный в скобки #), которые могут быть интерпретированы как корректное обозначение даты, например:

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

Для работы с датами в VB имеется целый ряд специальный функций. Версия 5.0 включает такой набор: Now, CDate, CVDate, DateValue, Date, Date$, Format, DateAdd, DateDiff, DatePart, IsDate, Day, Month, Weekday, Year. В VB6 добавлены еще несколько дополнительных функций, которые позволяют преобразовывать дату и отдельные ее элементы в строковое выражение: MonthName, WeekdayName, FormatDateTime. (Следует иметь в виду, что по умолчанию отсчет дней недели в VB ведется, начиная с воскресенья.)

Национальные особенности

При работе с датой нужно учитывать влияние региональных установок. Проблема заключается в том, что при использовании национальных параметров (в нашем случае российских) VB в одних случаях использует эти установки, в других — исходные, американские. Поэтому не стоит удивляться, что некоторые примеры, приведенные в справочной системе будут работать на вашем компьютере не так, как это сказано в их описании.

Мы рассмотрим здесь только несколько примеров, которые должны показать, то при работе с датами нужно внимательно изучить их специфику и, в частности, учесть возможное влияние изменения региональных установок на работу программы. Сейчас разговор будет идти на примере, международной Windows 98 в российскими параметрами.

Вывод даты всегда выполняется в формате, определенным в региональных установках (для России — ДД.ММ.ГГ), но с их вводом есть проблемы. Для примера введите:

В первых трех случаях будет напечатано одно и тоже — 02.04.99. А в четвертом будет ошибка программы — английское строковое выражение является недействительным. В варианте США первые два выражения будут ошибочными, а двух последних будут выдано — 02/04/99 (2 февраля!) и 04/02/99 (2 апреля).

Еще больше неожиданностей ждет тех, кто предпочитает иметь дело с литералами. Дело в том, что VB при работе с ними использует только встроенный американский вариант, игнорируя региональные установки. Попытка ввести D = #2 апреля 1999# или D = #2.04.99# сразу же вызовет сообщение об ошибке. В то же время при работе с российскими (!) установками строки

cразу будут преобразованы в

что будет соответствовать 2 апреля (а не 4 февраля). Для примера выполните такой код:

В русском варианте будет напечатано:

В американском варианте будет напечатано:

Еще один вопрос: использование значения текущей даты, которое определяется с помощью функций Date и Date$. Первая возвращает значение даты в числовом виде, вторая — в символьном, который имеет формат «MM-DD-YYYY» независимо от региональных установок. Выполните такой код (для текущей даты 2 апреля):

В русском варианте будет напечатано:

В американском варианте будет напечатано:

Возможные проблемы

Ключевая проблема заключается в том, что работы с датами часто приходится использовать, кроме специального типа данных Date, еще и символьный формат строковых переменные. Тип String обычно используется для ввода данных, и часто применяется в пользовательских процедурах для какой-то специальной обработки. Строковый формат наверняка понадобится, если вы захотите работать с датами юлианского календаря (см. «Y2K: как вести календарь?»). Типичной проблемы является аварийное завершение программы в момент преобразования даты (неверного формата) из символьного представления в тип Date.

С учетом всего сказанного сформулируем следующие СОВЕТЫ:

  • Пишите свои приложения с учетом возможного изменения региональных установок даты (Regional Settings | Date) в Windows. Определить тип текущих установок, можно с помощью функции Win32 API EnumCalendarInfo.
  • Перед преобразованием даты из символьного вида в тип Date (особенно после ввода даты из внешнего источника, например, пользователем в диалоге) проверьте выражение на допустимое значение:
  • Помните, что текущая системная дата задается оператором Date$ в соответствии с региональными установками. Однако чтение системной даты функцией Date$ всегда выполняется в формате «MM-DD-YYYY» независимо от региональных установок.
  • Для преобразования года из двухзначного значения в четырехзначное напишите свою процедуру и забудьте о колебаниях Microsoft в этом вопросе, в том числе по поводу соответствия разных версий VB требованиям 2000 года.
Ссылка на основную публикацию
ВсеИнструменты
Adblock
detector
×
×