 
        
        Программирование на языке Visual Basic для приложений. Подвальный С.Л., Рог А.И
.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
