элементы в представлении времени, и 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 конвертировать оба числовых значения в строковые, чтобы суметь выполнить эту конкатенацию.
Для чего строковые переменные действительно необходимы, так это для работы с нечисловыми символами, т.е. с буквами и знаками пунктуации. Их-то уж из числовых значений так просто не получить.
Из практики надежного программирования вытекает необходимость явного конвертирования числовых значений в строки, если требуется манипулировать ими как строками. Это уменьшает вероятность появления ошибок и делает программный код понятнее. И все же не мешает знать, что существует возможность вывода значений переменных, не требующая лишних усилий для их предварительной подготовки.
По той же причине не обязательно использовать кавычки, когда строковой переменной (т.е. переменной, объявленной как переменная типа String ) присваивается дата, числовое или денежное значение. Как заботливая нянька, VBA конвертирует такие значения в строки безо всяких вопросов и нареканий. Так, в результате выполнения операторов
Dim strGSting As String
strGSting = #July 22, 1904#
переменная будет содержать строку "22.07.1904", пока какой-нибудь другой оператор не изменит ее. А теперь можете смеяться надо мной, но я рекомендовал бы использовать кавычки просто для того, чтобы быть уверенными, что ваша переменная содержит именно то, что вы собирались в нее поместить.
Функции VBA Asс и Chr конвертируют ANSI-символы в соответствующие им числовые коды и наоборот. С помощью функции Chr в строку можно поместить символы, которые в ней нельзя напечатать (например, кавычки). Функция Asс возвращает числовой код первого символа в строке.
Строки фиксированной длины
В VBA предусмотрено объявление строк двух типов. При стандартном объявлении строк (например, с помощью оператора Dim strMessage As String) создается переменная, которая может хранить строку любой длины. Вы можете изменить размер такой переменной, просто присвоив ей строку другой длины.
Но иногда удобнее зафиксировать длину строковой переменной. Это чаще всего нужно в тех случаях, когда приходится считывать и записывать данные файлов прямого доступа, что не предполагается