VBA для чайников
Шрифт:
(такой список должен храниться в массиве строк; массивы будут рассматриваться в главе 13).
Предположим, что кто-то заставил вас убрать звания в конце каждой из вышеприведенных строк. Имена в списке имеют разную длину, так что готовые функции задачу не решают.
Но если предположить, что оригинальное имя содержится в переменной str-Старая, то поможет следующий трюк:
strНовая = Left(strСтарая, Len(strСтарая) - 7)
Если бы VBA читал книги вместо программного кода, я объяснил бы ему, что эти действия можно выполнить следующим образом.
1. Сначала вызывается функция Len, которая вычисляет длину оригинальной строки.
2. Из результата, полученного в п. 1, вычитается 7, поскольку каждое из званий занимает семь символов в конце строки (включая запятую и пробел).
В результате получится число, которому должна быть равна длина новой строки.
3. Вызывается функция Left, использующая вычисленную длину в качестве значения второго аргумента.
Функция Left читает столько символов, сколько задано
4. Новая, более короткая строка, возвращенная функцией Left, присваивается переменной
Продолжая работать с новым списком уже без званий, предположим, что теперь вас попросили извлечь имена с отчествами и поместить их в новый список. Эту задачу можно выполнить с помощью следующего оператора:
strMMfl = Mid (strHoBafl, InStr (str-Новая, ",") + 2)
Функция Mid извлекает символы из любого места в строке, которую вы укажете в виде аргумента. Второй же аргумент этой функции говорит, с какого места в этой строке следует начать извлечение символов. В данном случае этот аргумент представляет собой выражение, состоящее из функции InStr плюс 2.
Функция InStr ищет в заданной строке (первый аргумент) другую строку (второй аргумент).
В данном случае второй аргумент - это запятая, которая в списке следует за фамилией. Значение, которое возвращает InStr, соответствует номеру позиции в первой строке, где встречается вторая строка, - теперь вы знаете, где заканчивается фамилия.
К значению, возвращенному функцией InStr, добавляется 2, чтобы пропустить запятую и следующий за ней пробел и найти позицию, с которой начинается имя. Теперь функция Mid извлечет символы, начиная с этого места и до конца строки (поскольку не указан третий, необязательный аргумент длина).
В реальном программировании работе с датами и временем отводится далеко не последняя, а часто и главная роль. Поэтому VBA предлагает ряд операторов и функций, позволяющих выяснить текущие время и дату, проводить вычисления с датами и извлекать из переменных со значениями дат различные компоненты типа времени, года или дня недели.
В табл. 11.4 представлено описание таких команд. У некоторых функций в этой таблице опущены необязательные аргументы - вы всегда сможете уточнить детали по справке VBA.
После таблицы несколько наиболее важных команд, относящихся к датам и времени, рассматриваются подробнее.
Чтобы воспользоваться предоставляемым здесь материалом, вы должны ясно представлять, как VBA обрабатывает значения дат и времени и как работать с переменными, хранящими даты (см. главу 7).
Таблица 11.4. Операторы и функции для работы с датами и временем
При задании аргументов не забывайте заключать буквальные значения дат в пару символов #, а строковые значения типа интервалов дат - в кавычки.
Имя | Тип | Выполняемые действия (для операторов) или возвращаемые значения (для функций) |
Date | Функция | Текущая системная дата |
Date (дата) | Оператор | Устанавливает системную дату по значению аргумента дата |
DateAdd (интервал, число, дата) | Функция | Новое значение даты, равное сумме исходной даты и казенного числа заданных интервалов даты или времени |
DateDiff (интервал, дата1, дата2) | Функция | Число указанных интервалов даты или времени, помещающихся в отрезке времени между датами 1 и 2 |
DatePart (интервал, дата) | функция | Целое значение, представляющее указанный интервал даты |
DateSerial (год, месяц, день) | Функция | Значение даты, определяемое аргументами год, месяц, день, которые должны быть числовыми |
DateValue (строка с датой) | Функция | Значение даты, соответствующее строке с датой |
Day (дата) | Функция | Целое значение, соответствующее дню месяца, заданного датой |
Hour (время) | Функция | Целое значение между 0 и 23 включительно, представляющее час суток, заданный указанным временем |
Minute (время) | Функция | Целое значение между 0 и 59 включительно, |
Month (дата) | Функция | Целое значение между 0 и 12 включительно, представляющее месяц, заданный указанной датой |
MonthName (месяц, сократить) | Функция (только в VBA 6) | Строка, содержащая название месяца, соответствующего аргументу месяц, который должен быть числом от 1 до 12. Если необязательный аргумент сократить указан и равен True, то возвращаемая строка будет содержать сокращенное название месяца |
NOW | Функция | Значение, представляющее текущие системные дату и время |
Second(время) | Функция | Целое значение между 0 и 59 включительно, представляющее секунды, заданные указанным временем |
Time | Функция | Значение, представляющее текущее системное время |
Time (время) | Оператор | Устанавливает системное время по значению аргумента время |
Timer | Функция | Число секунд, прошедших с полуночи |
TimeSerial (часы, минуты, секунды) | Функция | Значение времени, заданное аргументами часы, минуты, секунды |
TimeValue (строка_с_временем) | Функция | Значение времени, соответствующее строке со временем (вся информация о дате будет отброшена) |
Weekday (дата) | Функция | Целое число, представляющее день недели, соответствующий указанной дате |
WeekdayName (день_не дели, сократить, первый день недели) | Функция | Строка, содержащая название дня недели, заданного (только в аргументом де н ь _ н е де л и, который должен VBA 6) быть целым числом от 1 до 7. Если необязательный аргумент с о к р а т и т ь указан и равен True, то возвращаемая строка будет содержать сокращенное название дня недели. Нумерацию дней недели можно менять, задавая необязательный аргумент первый _ день _ недели равным константам типа vbMonday, vbTuesday и т.д. |
Year(дата) | Функция | Целое число, представляющее год, соответствующий указанной дате |
В VBA есть несколько простых операторов и функций для работы с системной датой и системным временем, т.е. со значением даты и времени, которое изменяется и хранится встроенными часами компьютера.
Функция Now возвращает текущие системные дату и время в формате переменной типа Data, как, например, в случае datЛовиМомент = Now.
Чтобы обеспечить работу с системным временем и системной датой по отдельности, VBA предлагает по паре отдельных команд для каждого из этих двух элементов системы. Несколько неожиданным при этом оказывается то, что в каждой из пар и оператор, и функция имеют одинаковые имена.
Например, чтобы извлечь (т.е. получить) системное время в формате даты VBA, нужно использовать функцию Time, а чтобы установить (т.е. задать) системное время, необходимо использовать оператор Time. Другими словами, ключевое слово Time выполняет различные действия в зависимости от контекста:
datЭтоMoeBpeмя = Time ' функция Time возвращает значение
' системного времени
Time (113:15 АМ#) ' оператор Time устанавливает системное время
Подобным образом работают и различаются соответствующие функции Date и оператор Date.
Исчисление дат
Как вы знаете, время - понятие относительное. Поэтому главное - получить дату и время в таком виде, чтобы сравнить их с другими датами и временем. Иногда нужно знать, как далеко отстоят одна дата от другой или одно время от другого. А иногда бывает нужно знать, какая дата будет, скажем, через два года и три месяца. Несколько предлагаемых в VBA функций для обработки значений дат и времени превращают вычисления с датами в совсем простое дело.
Используйте функцию DateAdd, когда нужно узнать, какая дата наступит через три года или что было на часах один час и пятнадцать минут тому назад. Такие вычисления можно выполнить и без компьютера вообще, но они требуют особой внимательности, поскольку операции с компонентами значений дат и времени не подчиняются правилам привычной арифметики десятичных чисел (дней недели - 7, секунд - 60, и т.д.), да и самих компонентов наберется немало.