Visual basic for applications (vba)
Вид материала | Документы |
- Myreferatik at ua, 109.55kb.
- Краткий курс по изучению языка программирования Visual Basic, 357.37kb.
- Даний курс призначений для тих, хто: ніколи не програмував, але хоче навчитися, 360.9kb.
- Применение Microsoft Excel для обработки табличных данных. Выполнение расчетов в таблицах, 14.68kb.
- План Введение. Начало пути. Редактирование, удаление, переименование и назначение макросов, 283.36kb.
- Лекция Основы программирования Эта лекция введение в Visual Basic for Applications,, 208.31kb.
- Н. Г. Волчёнков программирование на visual basic 6 Учебное пособие, 128.99kb.
- Тема урока: Массивы в Visual Basic, 35.5kb.
- Vba(Visual Basic for Application), 276.36kb.
- Программа дисциплины visual Basic для приложений дпп. В. 01 Для специальности, 141.22kb.
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
Переменные пользовательского типа можно передавать в процедуры и функции в качестве параметров, но при этом необходимо иметь в виду, что записи могут использоваться только как параметры—переменные. Например, при выполнении приведенного ниже кода осуществляется занесение данных в поля записи Session1 с использованием конструкции 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 - ключевое слово для определения переменной, содержащей файловый номер, посредством которого будет в дальнейшем осуществляться обработка файла;
номер - имя переменной, содержащей номер файла.
В дополнение к сказанному следует заметить, что в качестве параметра путь может быть указано только название файла. В этом случае работа с файлами будет происходить в том каталоге, который по умолчанию является рабочим в среде Visual 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 ключевого слова Input открываемый файл должен существовать, в противном случае возникнет ошибка. С другой стороны, служебные слова Output и 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, позицией является порядковый номер записи в файле.