обчислення дат

обчислення дат

Ця книга допоможе освоїти інтегроване середовище розробки VBA і навчитися програмувати в VBA з використання об'єктів, їх властивостей, методів і подій. Обговорювані прийоми програмування ілюструються прикладами, які можна відразу ж випробувати на практиці. Отримані знання ви зможете застосувати як для настроювання й удосконалення популярний офісних додатків, включаючи додатки Office XP, так і для створення власних додатків.

Книга розрахована на тих, хто збирається швидко і без зайвих зусиль навчитися програмувати для Windows, використовуючи VBA.

Книга: VBA для чайників

обчислення дат

Як ви знаєте, час - поняття відносне. Тому головне - отримати дату і час в такому вигляді, щоб порівняти їх з іншими датами і часом. Іноді потрібно знати, як далеко відстоять одна дата від іншої або один час від іншого. А іноді буває потрібно знати, яка дата буде, скажімо, через два роки і три місяці. Кілька пропонованих в VBA функцій для обробки значень дат і часу перетворюють обчислення з датами в зовсім проста справа.

Використовуйте функцію DateAdd, коли потрібно дізнатися, яка дата настане через три роки або що було на годиннику одну годину і п'ятнадцять хвилин тому. Такі обчислення можна виконати і без комп'ютера взагалі, але вони вимагають особливої ​​уважності, оскільки операції з компонентами значень дат і часу не підкоряються правилам звичної арифметики десяткових чисел (днів тижня - 7, секунд - 60, і т.д.), так і самих компонентів набереться чимало.

Функція DateAdd має наступний синтаксис: DateAdd (інтервал, число, начальная_дата).

Що повертається функцією значення дорівнює значенню, отриманому в результаті додавання до початкової дати (або початкового часу) заданого числа інтервалів. Якщо потрібна різниця, а не сума, задайте для аргументу число від'ємне значення. У табл. 11.5 наведено набір символьних кодів, які допустимі для аргументу інтервал (при використанні не забудьте укласти відповідний код в лапки).

Таблиця 11.5. Значення аргументів функцій DateAdd і DatDiff

Наприклад, в результаті виконання оператора

datБило = DateAdd ( "s", -90, Now)

змінна datБило буде містити значення, відповідне часу, яке було 90 секунд тому щодо поточного часу. Якщо вам потрібно відобразити на екрані тільки ту частину цього значення, яка відноситься до часу, використовуйте функцію Format з відповідним часу аргументом форматування (наприклад, Format (datБило, "Medium time")), як було описано в розділі "Форматування данньк".

За допомогою функції DateAdd можна додавати або віднімати деяке число однотипних інтервалів, але, наприклад, для з'ясування дати, яка була два роки і три місяці тому, ніщо не заважає застосувати цю функцію двічі.

В якості альтернативи VBA пропонує для дат і часу дві інші функції, які дозволяють змішувати інтервали, - Date Serial і TimeSerial. Кожна з цих функцій має по три аргументи;

DateSerial (рік, місяць, день]

TimeSerial (години, хвилини, секунди)

Всі аргументи в даному випадку є обов'язковими і повинні бути виразами, що дають цілі значення (а не значення типу Date). Подивіться, чи можете ви сказати, що буде отримано в результаті виконання наступного фрагмента програмного коду, і зверніть увагу на обчислення в третьому аргументі:

datНовоеТисячелетіе = DateSerial (intГод, intМесяц, intДень + 1)

І, звичайно ж, будь-які з цих аргументів або навіть всі можуть бути просто числами.

Використовуйте функцію DateDiff, щоб з'ясувати, скільки певних періодів часу (роки, місяці, тижні і т.п.) поміщається між двома заданими датами або моментами часу. наприклад:

lngСколько = DateDiff ( "m", # 2/12/90 #, # 10/12/01 #)

В результаті виконання цього оператора змінна lngСколько - змінна типу Long - буде містити число місяців, що минули між двома зазначеними датами. Для першого аргументу функція DateDiff вимагає код інтервалу часу, і в даному випадку "m" повідомляє функції про те, що потрібно вимірювати в місяцях, а не в роках, тижнях або будь-яких інших одиницях.

Представлена ​​нижче процедура типу Function використовує функції DateDiff і DateSerial для обчислення віку персони в роках. Щоб уникнути появи помилок при виконанні програми, можете додати в програмний код перевірку типу даних того значення, яке отримає аргумент, що задає дату народження (використовуйте для цього функцію IsDate), а також перевірку того, що отримана дата народження не перебуває в майбутньому.

Function WhatAge (dateDateOfBirth As Date)

Dim intAge As Integer 'задайте Long, щоб допустити вік> 255 intAge = DateDiff ( "yyyy", DateDateOfBirth, Date)

'Перевіряється, день народження в цьому році був чи ні:

If DateSerial (Year (Date), Month (DateDateOfBirth), _

Day (DateDateOf Birth))> Date Then

intAge = intAge - 1

Через, так би мовити, паразитичного способу життя на великих програмах, VBA програми часто не вимагають ніяких елементів призначеного для користувача інтерфейсу (діалогових вікон, меню тощо.) - При запуску VBA-програма може виконуватися на базі активного документа додатки, узгоджуючи свої дії з вмістом цього документа.

Ясно, правда, і те, що існує чимало ситуацій, коли потрібно пряму взаємодію з кінцевим користувачем VBA-програми. Прекрасні можливості для створення інтерактивних вікон в програмі пропонують кошти створення користувацьких форм VBA (про що ми говорили в главі 10), але якщо є можливість обійтися більш простими засобами, то чим простіше, тим краще.

Дві VBA-функції, MsgBox і Input Box, забезпечують непогані можливості базового рівня для передачі користувачу повідомлень і отримання від нього відповідей.

* Функція MsgBox відображає вікно з повідомленням, але не тільки - вона дозволяє визначити, на який із двох (або більше) кнопок клацнув користувач, щоб закрити вікно.

* Функція Input Box відображає вікно з повідомленням і полем, в якому користувач має можливість надрукувати відповідь.

Формально синтаксична конструкція функції MsgBox виглядає так:

MsgBox (повідомлення [, кнопки] [, заголовок] [, файл_справкі, розділ])

Як показують дужки, обов'язковий тут тільки аргумент повідомлення, який, очевидно, ставить то повідомлення, яке ви бажаєте відобразити на екрані.

У своїй простій формі функція MsgBox діє як оператор. Від вас вимагається лише надрукувати його в окремому рядку і додати повідомлення, яке потрібно відобразити. наприклад:

MsgBox "Це перевірка роботи MsgBox."

В результаті виконання такого рядка VBA відобразить на екрані вікно з повідомленням, подібне показаному на рис. 11.2 (приклад А).

Мал. 11.2. Три простих вікна повідомлення

Текст повідомлення можна взяти в дужки, але дужки необов'язкові, коли функція використовується як оператор.

Повідомлення може бути також змінної або виразом. Як завжди, VBA автоматично конвертує за вас числові значення і дати в відображаються символи. Наприклад, наступний фрагмент програмного коду цілком працездатний, а результат показаний на рис. 11.2 (приклад Б):

datWhen = Format (Now, "Short date")

strInfo2 = "залишилося бажань:"

MsgBox strlInfol datWhen strInf o2 intWishCount

Щоб відобразити повідомлення в кілька рядків, додайте в повідомлення символи переходу на новий рядок (їх ASCII-код дорівнює 13) за допомогою функції Chr (приклад В на рис. 11.2).

MsgBox "Це перший рядок." Chr (13) "Це другий рядок. '

Можна розбити текст багаторядкового повідомлення і на стовпці, використовуючи символи табуляції (їх ASCII-код дорівнює 9).

Крім повідомлення, у вікні повідомлення може бути присутнім одна з декількох стандартних піктограм, а також кілька кнопок стандартного виду. Все це задається зазначенням одного числового значення для необов'язкового аргументу кнопки.

З піктограмою ваше вікно повідомлення буде виглядати трохи "крутіше", ніж простенькі вікна з рис. 11.2. Показане на рис. 11.3 вікно повідомлення містить піктограму критичної ситуації (ця піктограма зазвичай викликає у користувача деяке хвилювання).

Мал. 113. Непроста вікно повідомлення

За замовчуванням вікно повідомлення має тільки кнопку ОК, але можна в нього додати і кнопки з написами Скасування, Так, Ні, Стоп, Повтор і Пропустити в різних комбінаціях. На рис. 11.3 якраз показано вікно з однією з таких комбінацій кнопок.

Як і для подібних аргументів багатьох інших функцій, значення для аргументу кнопки обчислюється як сума констант, що представляють набори кнопок і піктограми. Можна підрахувати потрібне значення вручну, але краще створити відповідне вираз з іменованих VBA-констант, пропонованих як раз для цих цілей. У табл. 11.6 ці константи наведені разом з їх числовими значеннями і описами призначення.

Таблиця 11.6. Константи VBA для вікон повідомлень та вікон введення

За допомогою цієї таблиці нескладно підрахувати, що при виконанні функції, відобразивши вікно повідомлення, показане на рис. 11.3, значення аргументу кнопки було рівним 531. Але кому хочеться це значення вважати? Легше надрукувати наступний оператор:

intA = MsgBox ( "Натисніть кнопку", vbYesNoCancel + vbCritical

+ vbDefault Button3, "VBA для 'чайників'")

Третя з констант, використаних в вираженні для аргументу кнопки, константа vbDefaultButton3, призначає третю кнопку (рахуючи зліва направо) кнопкою, обраній за замовчуванням. В даному випадку це кнопка Скасування. Якщо уважно розглянути рис. 11.3, можна побачити, що кнопка Скасування отримала фокус введення - напис на ній окреслена пунктирною рамкою, і це означає, що саме ця кнопка буде активізована, якщо ви натиснете клавішу пробілу або .

Сенс відображення кнопок у вікні повідомлення полягає в наданні користувачу можливості вибору дії. В даному випадку користувачеві не потрібно нічого друкувати - слід тільки клацнути на одній з кнопок. А вам потрібно зуміти з'ясувати, на який з кнопок клацнув користувач.

Це просто, оскільки функція MsgBox повертає ціле значення, як раз відповідне тій кнопці, на якій клацнув користувач. Щоб не навантажувати свою пам'ять, ви можете порівнювати повертається значення ні з конкретними числами, а з пропонованими VBA іменованими константами. Ось ці константи разом з їх дійсними значеннями.

Якщо у вікні повідомлення всього дві кнопки, для з'ясування, на який з кнопок був клацання, прекрасно підходить оператор If. Then. наприклад:

If MsgBox ( "Починати?", VbYesNo) = vbYes Then

Коли кнопок більше, доводиться використовувати оператор If. Then. Else If.

За замовчуванням вікно повідомлення відображає в рядку заголовка ім'я того VBA додатки, з якого виконується програма (див. Рис. 11.2). Цей заголовок можна змінити на будь-який інший, задавши відповідне значення аргументу заголовок в операторі виклику функції MsgBox (див. Рис. 11.3).

Схожі статті