2313
.pdfПараметр номерФайла - это номер файла, открытого со способами доступа Append или Output.
Параметр списокВывода - это выражение или список выражений следующего вида:
[ { Spc(n) | Tab[ (n) ] } ] [Выражение] [позицияСимвола]
spc(n) задает количество вставляемых пробелов, a Tab(n) задает номер столбца, в котором будет начинаться текст. Выражение - это строковое или числовое выражение. Параметр позицияСимвола задает точку вхождения следующего за выражением символа.
Write #номерФайла [, списокВывода]
Здесь смысл параметра номерФайла тот же, а списокВывода - это одно или несколько выражений, разделенных пробелами, запятыми или точками с запятой. Для некоторых значений (таких, как Null, True и т. д.) есть ряд соглашений, однозначно определяющих форму их вывода. Например, значение Null выводится строкой символов #Null#.
Отличие между Print и Write в том, что последний оператор при записи вставляет запятые между соседними значениями и заключает строковые выражения в кавычки. В следующем примере мы открыли файл с книгами в режиме Output, записали в него данные, а после закрыли файл.
Листинг.Вывод данных в последовательный файл
Sub WriteToFile()
Open "C:\books.txt" For Output As #1
Print #1, "Office XP. VBA"; Spc(l); "Разработка приложений" Write #1, "Новиков"; "700"; "14"
Print #1, "Word 2002. "; Spc(1); "Самоучитель"
Write #1, "Petrov"; "200"; "10" Close
End Sub
93
Перейдем теперь к рассмотрению процедур ввода Input (если данные были записаны процедурой Write) и Line input (если данные были записаны процедурой Print). Синтаксис таков:
Input #номерФайла, списокПеременных
списокПеременных - это одна или несколько переменных, разделенных запятыми, в которые будут считываться данные из файла, причем переменные должны иметь тип, к которому могут быть приведены данные. На переменные накладывается еще одно ограничение: они не могут быть массивами, записями или объектами, но могут быть элементами массивов или полями записей.
При чтении информации, которая была записана в файл процедурой write, происходит автоматическое преобразование к исходному формату, т. е. отбрасываются кавычки для строк, игнорируются запятые и пробелы, слово #Null# переводится в значение Null и т. д.
Процедура Line input используется для построчного ввода информации.
Line Input #номерФайла, переменная
Здесь переменная должна быть либо строковой, либо иметь тип variant. В эту переменную без всяких преобразований будут считываться строки файла.
В следующем примере мы открыли файл books.txt, только в режиме input, и считали данные построчно в переменную temp, используя цикл с постусловием, в котором условие - это достижение конца файла, проверяемое функцией EOF (End of File).
Листинг. Ввод данных из последовательного файла
Sub ReadFromFile()
Open "C:\books.txt" For Input As #1
94
Do
Input #1, temp
MsgBox temp
Loop Until EOF(1)
Close
End Sub
Произвольный и бинарный доступ к файлам
В описанных выше процедурах записи и чтения данные записывались в конец файла, а считывались сначала, что оказывается нерациональным, если необходимо прочитать или записать информацию в середине файла. Рассмотренные ниже процедуры позволяют читать и записывать данные в произвольном порядке.
Мы одновременно рассмотрим синтаксис и процедуры записи (Put) и процедуры чтения (Get), поскольку они почти одинаковы:
Put [#], номерФайла[, номерЗаписи], переменная Get [#], номерФайла[, номерЗаписи], переменная
Итак, номерФайла - это номер файла, открытого со способом доступа либо Random, либо Binary.
номерЗаписи - это числовое выражение, определяющее позицию, куда будут записаны (откуда будут считаны) данные.
Для Random - это номер записи в файле, для Binary - номер байта в файле. По умолчанию данные будут записаны (прочитаны) в текущую позицию.
переменная - имя переменной, значение которой будет записано (прочитано). Для установки необходимой позиции используется процедура Seek.
Seek [#]номерФайла, номерЗаписи
Управление файлами и каталогами
Следующая группа процедур и функций (табл.) позволяет работать с файловой системой компьютера, т. е. создавать,
95
удалять, перемещать файлы или папки, изменять атрибуты файла и многое другое. В принципе набор данных процедур и функций идентичен по своим функциональным возможностям Проводнику Windows.
Таблица 6.3 Процедуры работы с файловой системой
Функция |
Описание |
ChDrive диск |
Задает текущий диск |
ChDir путь |
Задает текущую папку, указанную в |
|
параметре путь |
MkDir путь |
Создает новую папку, указанную в |
|
параметре путь |
RmDir путь |
Удаляет папку |
SetAttr имяФайла, ат- |
Изменяет атрибуты файла |
рибут |
атрибут — константа (0, 1, 2, 4, 32) |
Name Имя1 As Имя2 |
Переименовывает файл |
FileCopy файл1, файл2 |
Копирует файл1 в файл2 |
Kill файл |
Удаляет файл |
Теперь, для разрешения конфликта при создании файла, связанного с отсутствием требуемой папки, можно воспользоваться процедурой, приведенной в листинге.
Листинг. Создание папки
Public Sub CreateFolder()
Dim path As String, root As String path = "books"
root = "C:\" ChDrive root MkDir path
Open root & path & "\books.txt" For Output As #1 Close #1
End Sub
96
6.3. Функции проверки типов
Часто бывает необходимым узнать, какой тип имеет переменная, например string или integer, и в зависимости от ответа выполнять определенные действия. Для подобной проверки в VBA существуют две группы функций. В первой группе (см. табл. 6.4) функции сравнивают тип переменной или значение выражения лишь с одним встроенным типом данных или с определенным значением и возвращают логическое значение True, если типы совпадают, или False - в противном случае.
|
Таблица 6.4 |
Функции проверки типов данных |
|
Функция |
Описание |
|
|
IsArray (переменная) |
Является ли переменная массивом |
|
|
IsDate (выражение) |
Является ли выражение датой |
IsEmpty (переменная) |
Была ли переменная инициализиро- |
|
вана |
IsError (выражение) |
Является ли выражение значением |
|
ошибки. Как правило, требуется про- |
|
верить ошибку, определенную поль- |
|
зователем |
IsNull (выражение) |
Равен ли результат выражения пусто- |
|
му значению |
IsNumeric (выраже- |
Является ли результат числовым зна- |
ние) |
чением |
IsObject (переменная) |
Является ли переменная переменной- |
|
объектом |
IsMissing (аргумент) |
Был ли опущен необязательный аргу- |
|
мент в процедуре или функции |
Во второй группе всего две функции: VarName и TypeName, имеющие следующий синтаксис:
VarType (переменная)
97
Функция возвращает значение типа Integer, однозначно определяющее по таблице значений.
Таблица 6.5 Возвращаемые значения функции VarType
Тип |
Номер |
Тип |
Номер |
Тип |
Номер |
Empty |
0 |
Currency |
6 |
Variant |
12 |
Null |
1 |
Date |
7 |
DataObject |
13 |
Integer |
2 |
String |
8 |
Decimal |
14 |
Long |
3 |
Object |
9 |
Byte |
17 |
Single |
4 |
Error |
10 |
UserDefinedType |
36 |
Double |
5 |
Boolean |
11 |
Array |
8209 |
TypeName (переменная)
Функция возвращает одну из следующих строк: Byte,
Integer, Long, Single, Double, Currency, Decimal, Date, String,
Boolean, Error, Empty, Null, Object, Object Type, Unknown (не-
известная переменная) и Nothing (переменная, не содержащая ссылки на объект).
Если переменная является массивом, то возвращается строка с типом и пустыми скобками. Например, если определен массив Array типа integer,
TypeName(Array) = "Integer()".
Возможности функции TypeName ярко демонстрируются в случае, когда действительный тип объекта требуется узнать во время выполнения программ.
6.4. Процедуры и функции работы со строками
В VBA существует стандартный арсенал функций для работ со строками.
|
|
Таблица 6.6 |
|
Функции работы со строками |
|
Функция |
|
Описание |
|
|
|
Len(строка) |
|
Возвращает длину строки |
98
Продолжение табл. 6.6
Space(число) |
Создает строку, содержащую ука- |
|||
|
занное число пробелов |
|
||
String (число, символ) |
Создает строку, содержащую ука- |
|||
|
занное число указанных символов |
|||
StrComp (строка1, |
Возвращает |
результат |
сравнения |
|
строка2 [, сравнение]) |
строк. |
Необязательный |
параметр |
|
|
сравнение указывает, каким спосо- |
|||
|
бом производить сравнение: двоич- |
|||
|
ным - 0 (по умолчанию) или посим- |
|||
|
вольным (без учета регистра) - 1. |
|||
|
Если строка1 меньше, чем строка2, |
|||
|
то возвращается 1, равна - 0, боль- |
|||
|
ше - -1 |
|
|
|
StrReverse (строка) |
Возвращает строку "наоборот". На- |
|||
|
пример, |
StrReverse("строка") = |
||
|
"акортс" |
|
|
|
Left (строка, длина) |
Выделяет из строки-аргумента |
|||
|
строку с указанным числом симво- |
|||
|
лов слева. |
|
|
|
Right(строка, длина ) |
Выделяет из строки-аргумента |
|||
|
строку с указанным числом симво- |
|||
|
лов справа |
|
|
|
Mid(строка, старт [, |
Выделяет из строки-аргумента |
|||
длина] ) |
строку, начиная с позиции старт, с |
|||
|
указанным числом символов (по |
|||
|
умолчанию - до конца) |
|
||
Replace(строка, строка- |
Заменяет вхождения параметра |
|||
Поиск, строкаЗамена ) |
строкаПоиск |
значением |
параметра |
|
|
строкаЗамена в строке |
|
||
|
|
|||
LTrim (строка) |
Возвращает копию строки-аргумен- |
|||
|
та, из которой удалены пробелы, |
|||
|
находившиеся в начале строки |
|||
RTrim (строка ) |
Возвращает копию строки-аргу- |
|||
|
мента, из которой удалены пробе- |
99
Окончание табл. 6.6
|
лы, находившиеся в конце строки |
||
|
|
|
|
Trim (строка ) |
Возвращает |
копию |
строки- |
|
аргумента, из которой удалены |
||
|
пробелы, находившиеся как в нача- |
||
|
ле, так и в конце строки |
|
|
|
|
||
InStr([старт, ] строка1, |
Возвращает позицию первого вхо- |
||
строка2 [, сравнение]) |
ждения строки строка2 в строке |
||
|
строка1 (старт - позиция, с которой |
||
|
следует начинать поиск) |
|
|
LCase(строка) |
Преобразует |
символы |
строки- |
|
аргумента к нижнему регистру. На- |
||
|
пример, LCase("Hello") = |
"hello" |
|
UCase(строка) |
Преобразует |
символы |
строки- |
|
аргумента к верхнему регистру |
||
Split(строка |
Преобразует (расщепляет) строку к |
||
[,разделитель]) |
массиву подстрок. По умолчанию, |
||
|
разделитель – пробел |
|
|
Join(массивСтрок |
Преобразует (объединяет) массив- |
||
[,разделитель]) |
Строк к строке с разделителем |
6.5. Математические функции
VBA имеет общепринятый набор математических функций, который представлен в следующей таблице.
Таблица 6.7
Математические функции
Функция Значение
Abs (число) Возвращает абсолютное значение (модуль) аргумента
Atn (число) Возвращает арктангенс аргумента (в радианах)
Cos (число) Возвращает косинус аргумента. Число задается в радианах
100
|
Продолжение табл. 6.7 |
Ехр (число) |
Возвращает результат возведения экспонен- |
|
ты в степень аргумента |
Fix (число) |
Возвращает тот же аргумент, но без дробных |
|
разрядов |
Int (число) |
Возвращает целую часть аргумента |
Log (число) |
Возвращает натуральный логарифм аргумен- |
|
та |
Rnd (число) |
Возвращает случайное число |
Sgn (число) |
Возвращает-1, если число меньше 0; 0, если |
|
равно 0, и 1, если больше 0 |
Sin (число) |
Возвращает синус аргумента |
Sqr (число) |
Возвращает квадратный корень из аргумента |
Tan (число) |
Возвращает тангенс аргумента (в радианах) |
Несколько комментариев к таблице. Для тригонометрических функций аргументы задаются в радианах, т. е. для вычисления косинуса 90 градусов необходимо записать cos(Pi/2)2, Функции Int и Fix фактически выполняют округление числа, но они делают это по-разному. Если число отрицательное, то Int возвращает ближайшее целое число, меньшее чем аргумент, a Fix, наоборот, большее (это не распространяется на положительные числа). Функция Rnd - это генератор случайных чисел, но генерирует он их в зависимости от параметров, введенных пользователем. Так, если бы вы ввели число большее 0 или бы вообще его не ввели, то сгенерировалось бы новое случайное число; если аргумент будет равен 0, то результатом будет предыдущее число, а если оно отрицательное, то результатом будет одно и то же число, определяемое аргументом.
6.6. Процедуры и функции работы со временем и датами
Данные типа Date занимают 4 байта, столько же занимают данные типа Single (вещественное число одинарной точности). Начальная дата равна 30.12.1899. Таким образом, число 1 будет означать 31 декабря 1899 года, а число 36474.12345 рав-
101
но 10.11.99 2:57:46. Процедуры делятся на две группы: первые определяют даты, вторые - их обрабатывают.
К первой группе относятся следующие процедуры:
-Date - возвращает текущую системную дату;
-Time - возвращает текущее системное время;
-Now - возвращает текущие системные дату и время. Текущие дата и время определяются по внутренним ча-
сам компьютера, которые можно установить с помощью панели управления Windows. Можно переопределить значения системного времени, используя ключевые слова Date и Time.
Кстати, вы можете переопределить значения системного времени, используя ключевые слова Date и Time.
Например, если текущая дата 21.11.2002, тогда следующая процедура "отправит вас в будущее" на месяц вперед:
NewD = Date +31 Date = NewD
В результате выполнения вышеуказанного кода будут переустановлены внутренние часы компьютера, что повлияет не только на данную программу, но и на все приложения, выполняемые на данном компьютере.
Вторая группа функций представлена в табл. 6.8.
|
|
Таблица 6.8 |
Функции для работ с датами |
|
|
Функция |
Описание |
|
DateAdd(интервал, число, |
Предназначена для |
добавления |
дата) |
или вычитания из даты указан- |
|
|
ного числа указанных времен- |
|
|
ных интервала. Таблица времен- |
|
|
ных интервалов приведена ниже. |
|
DateDiff(интервал, дата1, |
Возвращает число |
указанных |
дата2 [, первыйДеньНеде- |
временных интервалов, являю- |
|
ли [, перваяНеделяГода]]) |
щееся разностью между датами |
|
|
дата2 и дата1. Например, |
|
|
DateDiff("Y","25.11.02", |
|
|
"31.12.02") = 36 |
|
102