VBA для чайников
Шрифт:
Значения типа Currency могут иметь до 19 значащих цифр, из них 15 - до запятой и 4 - после (положение десятичного разделителя фиксировано).
Работа с датами
Тип данных Date используется для удобства при работе со значениями дат и времени. Где-то в своих глубинах VBA кодирует дату и время в виде некоторого числа вроде 35692,9201273148. которое, очевидно, совершенно ничего не говорит большинству простых смертных. К счастью, можно полностью игнорировать это обстоятельство и работать в своих программах с датами и временем точно так же, как вы это
При этом нужно только помнить, что значения дат и времени- их буквальные значения - необходимо помещать в ограничивающую их пару знаков "решетки'". Например, в следующем фрагменте программного кода сначала объявляются две переменные типа Date, а затем им присваиваются значения:
Dim dateWeddingDay As Date, dateTimeOfCeremony As Date dateWeddingDay = #4/20/99#
dateTimeOfCeremony = #3:15:00 PM#
Как и в случае данных типа Currency. VBA автоматически отображает даты в формате, соответствующем местному стандарту. Например, выражение Format (#10/24 /89#, "Long date") в США порождает строку "Tuesday. October 24, 1989", а в России - "24 Октябрь 1989 г.".
Ввод дат
Печатать буквальные значения дат можно почти в любом виде, какой только возможен. Например, допустимо любое из следующих представлений:
#09/1/1998#
#Sep 25, 93#
#Janua 9 1905
Если редактор Visual Basic распознает введенные вами данные как допустимое значение даты, эти данные будут конвертированы в "краткое представление даты", заданное в соответствующей панели управления Windows. Если вы не укажете год, VBA добавит текущий год за вас. Такое конвертирование происходит сразу же, как только вы переместите текстовый курсор в другую строку, а не откладывается до момента, когда программа начнет выполняться.
Время имеет значение
Буквальные значения времени вводятся в формате #часы:минуты:секунды символ#, где символ - это AM или РМ (означающие до полудня и после полудня соответственно). Например:
#10:45:00 РМ#
#2:3:30 АМ#
Печатать незначащие нули, как в #01:02:03 РМ#, не обязательно, но VBA добавит их за вас, как только вы переместите курсор в другую строку программного кода. Точно так же вы можете опустить ненужные вам элементы в представлении времени, и VBA дополнит ваш ввод. Например, вы можете ввести только секунды, напечатав что-нибудь вроде #0:0:23#, a VBA изменит введенное значение на стандартное представление времени - в данном случае на #12:00:23 АМ#.
Математика дат и времени
Сложение и вычитание дат в рамках обычных арифметических операций в VBA возможны, но, к сожалению, результаты такого сложения и вычитания не соответствуют обычным представлениям о датах. Например, #3/19/2005# - #3/19/2004#н е дает в результате '"1 год", как желательно было бы иметь, а дает #12/3 0/1900#. Такой результат обусловлен спецификой представления значений дат в VBA, но я не собираюсь здесь утомлять вас обсуждением этой специфики. Все, что вам нужно, - это знать о существовании в VBA двух функций, DateAdd и DateDiff , которые должны полностью удовлетворить ваши потребности в математике дат. Использование этих функций обсуждается в главе 11.
В противоположность
Di m date Then A s Date
dateThen = #07:15 AM# + #12:00# ' = #07:15:00 PM#
dateThen = #07:15:00 AM# - #0:15 AM# ' = #07:00:00 AM#
dateThen = #07:15:15 AM# + #0:0:30 AM# ' = #07:15:45 AM#
В этом примере показан минимум того, что можно напечатать. Как всегда, VBA конвертирует введенные данные в полноформатное буквальное значение времени, например #0:0:30 АМ# превратится в #12 : 00 : 30 АМ#. И еще (как показано в представленном примере): если вы хотите получить правильные результаты при использовании арифметических операций со значениями времени, то используемые при этом переменные должны явно объявляться как переменные типа Date.
Информацию - в строку
Поскольку VBA с такой легкостью конвертирует данные одних типов в другие, строковые переменные оказываются нужными значительно реже, чем это может показаться на первый взгляд. Если единственной задачей является отображение нестрокового значения в виде, понятном обычному человеку, то для этого совсем не обязательно конвертировать такое значение в строковое. Лучше просто использовать данное числовое значение или дату- или даже значение типа Variant - в качестве аргумента некоторой функции или значения свойства объекта, для которых данный аргумент или значение должны быть строковыми.
В следующем примере используется сверхпопулярная функция MsgBox, отображающая данные строкового типа в небольшом диалоговом окне. В результате выполнения операторов
Dim dateЭтоНеСтрока As Date
dateЭтоНеСтрока = #17:23:16#
MsgBox dateЭтоНеСтрока
на экране отображается сообщение, подобное показанному на рис. 7.1.
Рис. 7.1. Показанный в окне сообщения текст не преобразовался в строку явно
И&Ш.
А теперь взгляните на следующую ересь:
Dim intSmall As Integer, sngTall As Single
Dim varYouAll As Variant
intSmal l = 3
sngTall = 9.99E+33
varYouAll = intSmall & sngTall
В результате выполнения этого фрагмента программного кода varYouAll будет содержать "39.99Е+33". Присутствие в последнем операторе знака конкатенации (&) заставляет VBA конвертировать оба числовых значения в строковые, чтобы суметь выполнить эту конкатенацию.
Для чего строковые переменные действительно необходимы, так это для работы с нечисловыми символами, т.е. с буквами и знаками пунктуации. Их-то уж из числовых значений так просто не получить.
Из практики надежного программирования вытекает необходимость явного конвертирования числовых значений в строки, если требуется манипулировать ими как строками. Это уменьшает вероятность появления ошибок и делает программный код понятнее. И все же не мешает знать, что существует возможность вывода значений переменных, не требующая лишних усилий для их предварительной подготовки.