Параметр номерФайла - это номер файла, открытого со способами доступа 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