Visual basic for applications (vba)

Вид материалаДокументы

Содержание


If Not IsMissing(b) Then b = b + 1 End Sub
End SubSub Concat(ParamArray arrPart())
Работа с записями
FirstSession.Math = 5
Private Type Session
Dim arrSession(5) As Session
Private Sub CommandButton1_Click ()
Работа с файлами
Input(число, номер)
Get номер, позиция, переменная
Подобный материал:
1   2   3   4   5

If Not IsMissing(b) Then b = b + 1

End Sub


Существует возможность при описании необязательных параметров указывать им те значения, которые необходимо принимать по умолчанию, если при вызове процедуры или функции они не указаны. Например:

Листинг 6.12.

Значения по умолчанию для необязательных

параметров

Private vntA, vntB

Option Explicit


Private Sub ConunandButtonI Click ()

vntA = 5

vntB = 10

Call Opt(vntA, vntB) ' Результат: vntA = 15


vntA = 5

vntB = 10

Call Opt(vntA)


464

' Результат: vntA = 8

End Sub

Private Sub Opt(a. Optional b = 3)

a = a + b

End Sub

Как правило, при вызове процедуры или функции количе­ство требуемых параметров известно заранее. Однако зачас­тую возникают ситуации, в которых число параметров не яв­ляется постоянной величиной и может изменяться в зависимо­сти от тех или иных условий в программе. В этом случае па­раметры следует описывать в виде массива значений типа Variant при помощи служебного слова ParamArray.

Например:

Листинг 6.13.

Использование произвольного количества

параметров

Dim strPart

Dim strResult As String

Option Explicit


Private Sub CommandButton1 Click ()

Concat "Любое ", "число " ' Результат: "Любое число"

Concat "Любое ", "число ", "параметров" ' Результат: "Любое число параметров"

End Sub


Sub Concat(ParamArray arrPart())

strResult = ""

For Each strPart In arrPart

strResult = strResult & strPart

Next

End Sub

Приведенная выше процедура Concat объединяет в одно предложение несколько заданных строк, количество которых может быть произвольным.


465

Необходимо отметить, что при обработке массива arrPart с неизвестным числом элементов был использован цикл следую­щей конструкции:

fox Each элемент In массив Операторы

Next

При выполнении цикла с такой структурой для каждого эле­мента из массива (по порядку возрастания индексов) выполняет­ся блок операторы, в котором осуществляется обработка. Однако существует ограничение на использование описанного цикла, а именно: каждый элемент, принадлежащий массиву, обязательно должен иметь тип Variant.



Работа с записями


В том случае, когда несколько переменных различных ти­пов должны быть логически связаны между собой, их следует объединить в запись, которую еще называют пользователь­ским типом данных. При этом каждая переменная, являющая­ся составной частью записи, носит название поля. Например, если необходимо обрабатывать в программе информацию о результатах сессии в институте, в которой оценки ставились по трем предметам: физике, математике и программированию, то в этом случае понадобятся такие поля:

1. Фамилия, имя и отчество студента.

2. Номер зачетки.

3. Оценка по физике.

4. Оценка по математике.

5. Оценка по программированию.

Для описания пользовательского типа данных используется оператор Type, который имеет следующий формат:

Type название Список полей

End Type

Следует отметить, что структура Type... End Type обяза­тельно должна быть расположена в разделе Declarations соответс-


466

твующего модуля с использованием одного из служебных слов, описывающих тип уровня модуля (Private или Public).

Пусть в рассматриваемом примере название создаваемого ти­па будет Session. Тогда описание полей записи Session будет выглядеть следующим образом:

Private Type Session

Name As String

Number As Long

Physics As Byte

Math As Byte

Progr As Byte

End Type

Для того чтобы получить доступ к созданной структуре, вна­чале необходимо одной или нескольким переменным в програм­ме определить описанный выше тип Session. При этом объяв­ляемой переменной можно задать область видимости.

Например:

Dim FirstSession As Session

При работе с переменными пользовательского типа для вы­полнения различных операций с полями необходимо вначале ука­зывать имя обрабатываемой переменной, а затем точку и назва­ние поля.

Например:

FirstSession.Math = 5

Другими словами, доступ к полям записей осуществляется в таком же формате, как и работа со свойствами объектов. При этом для заполнения полей записи, особенно в случае большо­го их количества, можно использовать конструкцию With...End With (аналогично заполнению свойств объектов). Формат этой конструкции следующий:

With запись

.поле1

.поле2

.noлeN

End With


467

Можно также присваивать значение одной переменной поль­зовательского типа другой переменной такого же типа, например:

Dim Session1 As Session

Dim Session2 As Session

Session2 = Session1

Если же типы не будут совпадать, то компилятор выдаст со­общение об ошибке.

В качестве полей записи могут также использоваться мас­сивы как статические, так и динамические, при этом работа с их элементами выполняется так же, как и обработка обычных массивов. Например, в рассматриваемом примере для типа Session можно вместо трех полей для оценок описать одно поле в виде массива Marks, состоящего из трех элементов:

Private Type Session

Name As String

Number As Long

Marks(1 To 3) As Byte End Type

Dim Session 1 As Session Session l.Marks(l)= 4 Sessioni.Marks(2) = 5 Sessioni.Marks(3) = 3

Аналогичным образом осуществляется объявление и обработ­ка массивов записей, которые также могут содержать поля в виде массивов, например:

Dim arrSession(5) As Session

arrSession(l).Marks(1) = 4

Переменные пользовательского типа можно передавать в про­цедуры и функции в качестве параметров, но при этом необходи­мо иметь в виду, что записи могут использоваться только как па­раметры—переменные. Например, при выполнении приведенного ниже кода осуществляется занесение данных в поля записи Ses­sion1 с использованием конструкции With... End With.


468

Private Sub CommandButton1_Click ()

Dim Sessioni As Session


Call WriteSession(Sessioni)

End Sub


Private Sub WriteSession(a As Session)

With a

.Name = "Иванов Иван Иванович"

.Number = 123456

.Marks(1) = 4

.Marks(2) = 5

.Marks(3) = 3

End With

End Sub



Работа с файлами


Файлом называется область на жестком диске или другом ма­шинном носителе (например, на дискете), имеющая название и содержащая определенную информацию. При работе с файлами возможны такие операции, как считывание информации в пере­менные программы и занесение данных из переменных в файлы. Существует несколько разновидностей файлов, которые опреде­ляют формат хранения данных и особенности программного дос­тупа к ним:

• типизированные (двоичные файлы);

• текстовые;

• не типизированные (файлы записей).

Рассмотрим все приведенные типы, а также их отличительные особенности.

1. Типизированные файлы. Содержимое таких файлов рас­сматривается как последовательность произвольных данных, ко­торые представлены в двоичном виде. К достоинствам этого типа относится экономичность при хранении информации.

С понятием типизированного файла тесно связано понятие указателя на текущий элемент файла. Другими словами, при


469

работе с двоичным файлом, в любой момент один из элемен­тов файла является "активным", т. е. с ним могут производить­ся какие-либо действия.

Все операции с такими файлами осуществляются, как прави­ло, поэлементно, причем указатель может быть перемещен на заданное количество байт в любом направлении по содержимому файла. Необходимо также отметить, что каждый элемент двоич­ного файла имеет свой порядковый номер, по которому к нему следует обращаться, причем нумерация начинается с единицы (см. рис.6.20).

В типизированных файлах может содержаться любая инфор­мация, однако каждый хранящийся элемент занимает определен­ное количество байт. Поэтому при его извлечении следует ис­пользовать переменные соответствующего типа, чтобы данные были корректно обработаны. Например, если извлекать из файла число 257 (тип Integer) в переменную типа Byte, диапазон значений которой [0:255], то результатом будет число 1 (см. рис. 6.21).



Следует точно знать, элементы каких типов и в каком порядке хранятся в двоичном файле, т. е. где расположен каждый элемент и сколько он занимает байт. Иначе, если указатель будет перемещен не на первый байт очередного элемента, то, по аналогии с предыдущим примером, обработка информации будет выполнена некорректно и приведет к ошибочным результатам. Например, если первым элементом двоичного файла было записано 2-байтное число 257 и после этого во второй байт было занесено число 0, то в этом случае вместо числа 257 снова будет получено число 1, так как его 8-й бит, принадлежащий второму байту, был обнулен (см. рис. 6.21).


470



Обработка любого файла начинается с его открытия, а при окончании работы с файлом его необходимо закрыть. Во время работы приложения могут быть одновременно открыты несколь­ко файлов. Поэтому, для того чтобы не возникло путаницы при обращении к ним, с каждым из файлов в программе отождествля­ется специальная переменная, называемая файловым номером и определяющая его положение в списке открытых в данный мо­мент файлов. Все операции по обработке файлов в программе выполняются посредством обращения к соответствующим фай­ловым номерам.

Любой файл создается или открывается при помощи операто­ра Open, синтаксис которого зависит от его разновидности. Для двоичных файлов общий вид данного оператора выглядит сле­дующим образом:

Open путь For Binary As номер

Здесь

Open - служебное слово, используемое при открытии или соз­дании файла:

путь - строка или переменная типа String, содержимым ко­торой является полный путь к требуемому файлу;

For - ключевое слово для определения типа файла;


471

Binary - служебное слово, используемое при создании или открытии двоичного файла;

As - ключевое слово для определения переменной, содержа­щей файловый номер, посредством которого будет в дальнейшем осуществляться обработка файла;

номер - имя переменной, содержащей номер файла.

В дополнение к сказанному следует заметить, что в качест­ве параметра путь может быть указано только название файла. В этом случае работа с файлами будет происходить в том ка­талоге, который по умолчанию является рабочим в среде Vis­ual Basic.

Для работы с каталогами и дисками существует несколько функций и операторов (см. табл. 6.19).

По окончании работы с любым файлом его необходимо за­крыть при помощи оператора Close, синтаксис которого одина­ков для всех типов файлов:

Close номер



В случае необходимости удаления файла с диска используется оператор Kill, формат которого аналогичен оператору Close. Не стоит забывать, что перед удалением файла его необходимо обязательно закрыть.

Если в программе открыто несколько файлов, то для каждого из них определен свой файловый номер. Для того чтобы опреде-


472

лить значение первого свободного номера для очередного откры­ваемого файла, следует использовать функцию FreeFile, ре­зультат выполнения которой присваивается переменной-номеру:

Переменная-номер = FreeFile

В том случае, когда необходимо дать файлу новое имя, следу­ет вначале его закрыть, а затем воспользоваться оператором Name, синтаксис которого следующий:

Name путь1 As путь2

Где путь1 - строка или переменная типа String, которая со­держит путь к исходному файлу;

путь2 - строка или строковая переменная, содержимым кото­рой является новый путь к файлу.

Следует заметить, что если на диске уже существует файл с таким же полным названием, т. е. путь2, то при выполнении опе­ратора Name возникнет ошибка.

При необходимости создания копии какого-либо файла при­меняется оператор FileCopy, перед выполнением которого ко­пируемый файл должен быть закрыт:

FileCopy путь1, путь2

Где путь1 - путь к исходному файлу;

путь2 - путь к новому файлу.

При работе с открытым файлом возможно выполнение двух операций: занесение данных и считывание информации.

Для того чтобы записать в двоичный файл какую-либо ин­формацию, следует воспользоваться оператором Put:

Put номер, позиция, переменная

Здесь

номер - переменная, которая содержит файловый номер;

позиция - порядковый номер байта, начиная с которого будет заноситься информация;

переменная - название переменной, содержимое которой за­писывается в файл.


473

Для извлечения информации из файла применяется оператор Get, формат которого совпадает с оператором Put:

Get номер, позиция, переменная

При выполнении оператора Get в переменную заносится ин­формация из файла с указанным номером, расположенная в нем по адресу позиция.

В дополнение к описанию операторов Put и Get следует за­метить, что перед номером файла можно указывать знак #.

Обработка данных в файлах любого типа осуществляется с учетом положения указателя. Для того чтобы определить поряд­ковый номер обрабатываемого элемента, следует применять функцию Seek:

Seek (номер)

Результатом вызова функции Seek будет текущая позиция, которую занимает указатель в файле с заданным номером.

1. Текстовые файлы. Содержимым подобных файлов явля­ется последовательность строк произвольной длины, которые были созданы при помощи какого-либо текстового редактора. При этом в конце каждой строки находится особое сочетание символов, которое обозначает ее окончание и состоит из "воз­врата каретки" (код в таблице символов =13) и "перевода строки" (код = 10). В дополнение к сказанному следует заме­тить, что любой файл, независимо от типа, всегда завершается специальным символом "конец строки" (код = 26).

Хранение числовых данных в текстовых файлах не является эффективным, так как каждый элемент будет представлен в виде последовательности символов. Следовательно, если не­обходимо хранить в файле, например, восьмизначные числа (тип Long), которые занимают в памяти 4 байта, то для каждо­го из них в текстовом файле будет отведено 8 байт - по 1 бай­ту на каждый символ.

Операции с текстовыми файлами должны выполняться по­строчно, при этом после обработки очередной строки указа­тель автоматически перемещается на следующую строку. Если в ходе выполнения программы необходимо проверять условие достижения конца файла, то следует применять функцию


474

Eof(номер), результатом которой является логическое значе­ние (True или False).

Для того чтобы открыть текстовый файл. используется опера­тор Open следующего формата:

Open путь For назначение As номер

Здесь, в отличие от формата, используемого при работе с дво­ичными файлами, после служебного слова For в качестве назна­чения для открываемого файла используются:

Input - файл открывается для считывания из него информации;

Output - файл открывается для редактирования его содержимого;

Append - файл открывается для добавления новых строк.

При использовании в операторе Open ключевого слова In­put открываемый файл должен существовать, в противном слу­чае возникнет ошибка. С другой стороны, служебные слова Out­put и Append можно применять как для открытия, так и для создания текстовых файлов. При этом если файл уже открыт, на­пример, для извлечения данных (input), то для добавления строк его необходимо вначале закрыть (Close), а затем открыть с указанием соответствующего назначения (Append).

Для добавления новых строк в файл используется оператор Print, формат которого следующий:

Print # номер, переменная

При выполнении данного оператора в конец файла с указан­ным номером, открытого при помощи ключевого слова Append, будет добавлена новая строка из переменной.

Для изменения содержимого имеющегося текстового файла его необходимо вначале открыть с помощью служебного слова Output, а затем воспользоваться описанным выше оператором Print. В этом случае изменения будут внесены в начало файла.

В языке Visual Basic существует несколько возможных вариантов извлечения информации из текстового файла.


475

Оператор Line Input - используется для занесения в про­граммные переменные строк из файла. Синтаксис этого операто­ра следующий:

Line Input # номер, переменная

Функция Input — применяется для извлечения в строковую переменную заданного количества символов из файла и имеет следующий формат:

Input(число, номер)

Результатом вызова данной функции является указанное число символов, скопированных из файла с определенным номером.

3. Нетипизированные файлы. Информация в таких файлах хранится в виде набора одинаковых записей определенной структуры. Размер одной записи является значением суммы размеров всех ее полей.

Для того чтобы открыть файл записей, необходимо вос­пользоваться оператором Open, аналогично рассмотренным ранее типам файлов. Однако его формат в этом случае не­сколько отличается от предыдущих, так как необходимо ука­зывать размер записей, которые содержатся в файле:

Open путь [For Random] As номер Len = размер

В этом случае в операторе Open указывать тип с использо­ванием служебного словосочетания For Random необяза­тельно, так как данный режим используется по умолчанию. Размер используемых записей задается при помощи ключевого слова Len. При этом если запись, добавляемая в файл, будет больше указанного размера, то при выполнении операции воз­никнет ошибка.

Для занесения содержимого записи в файл используется оператор Put. как и при работе с двоичными файлами:

Put номер, позиция, переменная

Отличие заключается в том. что под позицией понимается порядковый номер записи в не типизированном файле.


476

Аналогичным образом для извлечения определенной запи­си из файла в переменную соответствующего типа применяет­ся оператор Get:

Get номер, позиция, переменная

В этом операторе так же, как и в операторе Put, позицией является порядковый номер записи в файле.