Тема 2. Переменные и константы, процедуры и функции
В языке VBА программист должен записывать все инструкции своей программы внутри специальных блоков: функций и процедур. Код внутри процедуры или функции представляет собой подпрограмму, выполняющую требуемые действия. Процедура – это подпрограмма, которая выполняет действия, не возвращая никакого значения в качестве результата либо возвращая некоторые значения путем изменения переданных ей параметров. Функция в дополнение к возможностям процедуры может возвращать некоторое результирующее значение.
Процедура является самостоятельной частью кода, которая имеет имя и может содержать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов. Синтаксис:
[Private | Public] [Static] Sub Имя [(СписокАргументов)] [Инструкции]
[Exit Sub] [Инструкции]
End Sub
Элементы описания приведены в таблице.
Описание элементов синтаксиса процедуры
Элемент | Значение |
Public | Указывает, что процедура Sub доступна для всех других процедур во всех модулях. |
Private | Указывает, что процедура Sub доступна для других процедур только того модуля, в котором она описана. |
Static | Указывает, что локальные переменные процедуры sub сохраняются в промежутках времени между вызовами этой процедуры. |
Имя | Имя процедуры Sub, удовлетворяющее стандартным правилам именования переменных. |
СписокАргументов | Список переменных, представляющий аргументы, которые передаются в процедуру Sub при ее вызове. Имена переменных разделяются запятой. |
Инструкции | Любая группа инструкций, выполняемых в процедуре. |
Exit Sub | Инструкция Exit sub приводит к немедленному выходу из процедуры sub. |
Синтаксис элемента СписокАргументов:
[Optional] [ByVal | ByRef] [ParamArray] имяПеременной[( )][As тип] [= поУмолчанию]
Элементы синтаксиса приведены в таблице.
Синтаксис элемента СписокАргументов
Элемент | Значение |
Optional | Ключевое слово, указывающее, что аргумент не является обязательным. При использовании этого элемента все последующие аргументы, которые содержатся в списке СписокАргументов, также должны быть необязательными и описаны с помощью ключевого слова optional. Все аргументы, описанные как Optional, должны иметь тип variant. He допускается использование ключевого слова Optional для любого из аргументов, если используется ключевое слово ParamArray |
ByVal | Указывает, что этот аргумент передается по значению |
ByRef | Указывает, что этот аргумент передается по ссылке. Описание ByRef используется в VBA по умолчанию |
ParamArray | Используется только в качестве последнего элемента в списке СписокАргументов для указания, что конечным аргументом является описанный как Optional массив значений типа variant. Ключевое слово paramArray позволяет задавать произвольное количество аргументов. Оно не может быть использовано со словами Byval, ByRef или Optional |
имяПеременной | Имя переменной, удовлетворяющее стандартным правилам именования переменных |
тип | Тип данных аргумента, переданного в процедуру; поддерживаются типы Byte, Boolean, Integer, Long, Currency, Single, Double, Date, String (только строки переменной длины), object, variant. Если отсутствует ключевое слово Optional, могут быть также указаны определяемый пользователем тип или объектный тип |
поУмолчанию | Любая константа или выражение, дающее константу. Используется только вместе с параметром optional. Если указан тип object, единственным значением по умолчанию может быть значение Nothing |
Для выхода из процедуры предусмотрена инструкция Exit Sub. При ее достижении выполнение программы немедленно переходит к инструкции, следующей за вызвавшей процедуру инструкцией.
Ниже приведен пример процедуры, имеющей два аргумента, при этом второй аргумент необязательный и передается по ссылке:
Sub ProcedureExample(ByVal intNumber As Integer, Optional fFlag = True)
' Инструкции процедуры
…
End Sub
Проведенную процедуру можно модифицировать так, чтобы вместо необязательного второго параметра процедура принимала произвольное количество аргументов, из которых формируется массив:
Sub ProcedureExample(ByVal intNumber As Integer, ParamArray varArray())
' Инструкции процедуры
…
End Sub
Для вызова процедуры в программе на VBA предусмотрена инструкция Call, формат которой приведен ниже:
[Call] Имя_процедуры [Список_аргументов]
Здесь элемент Имя_процедуры представляет собой идентификатор вызываемой процедуры. Если процедура принимает аргументы, то они должны быть указаны на месте элемента Список_аргументов через запятую.
В качестве аргументов в вызывающей процедуре или функции используются константные значения или идентификаторы переменных соответствующих типов.
Эта инструкция позволяет также вызывать и функции, но при этом возвращаемое ими значение получить невозможно.
Пусть имеется процедура:
Sub ProcedureExample(ByVal intNumber As Integer, ParamArray varArray())
' Инструкции процедуры
…
End Sub
Пусть также имеется процедура TestExample, в которой необходимо вызывать процедуру ProcedureExample. Процедуру TestExample можно реализовать следующим образом:
Sub TestExample()
' Инструкции процедуры
…
' Вызов ProcedureExample
Call ProcedureExample(123, "Значение1", "Значение2", "Значение3")
' Инструкции процедуры
End Sub
Если в TestExample не использовать ключевое слово Call, то вызов процедуры будет выглядеть так:
' Вызов ProcedureExample
ProcedureExample 123, "Значение1", "Значение2", "Значение3"
Приведенный ниже синтаксис описывает имя, аргументы и текст программы, составляющие тело процедуры Function. Синтаксис:
[Public I Private] [Static] Function Имя [(СписокАргументов)]
[As Тип]
[Инструкции]
[Имя = Выражение]
[Exit Function]
[Инструкции]
[Имя = Выражение]
End Function
Синтаксис инструкции Function содержит те же элементы, что и sub. Инструкция Exit Function приводит к немедленному выходу из процедуры Function.
Подобно процедуре Sub, процедура Function является самостоятельной процедурой, которая может получать аргументы, выполнять последовательность инструкций и изменять значения своих аргументов. Однако в отличие от процедуры sub, когда требуется использовать возвращаемое функцией значение, процедура Function может применяться в правой части выражения, как и любая другая встроенная функция, например, cos.
Процедура Function вызывается в выражении по своему имени, за которым следует список аргументов в скобках.
Для возврата значения из функции следует присвоить значение имени функции. Любое число таких инструкций присвоения может находиться в любом месте процедуры.
Вызов процедуры sub из другой процедуры можно произвести несколькими способами.
Первый способ вызова процедуры Sub: ИмяПроцедуры СписокФактическихПараметров, где СписокФактическихПараметров – Список аргументов, передаваемых процедуре. Он должен соответствовать списку, заданному в процедуре по количеству и типу.
Если требуется использовать несколько процедур с одинаковыми названиями, при их вызове после имени процедуры через точку надо указывать имя модуля, на котором они расположены. А именно, ИмяМодуля.ИмяПроцедуры СписокФактическихПараметров.
Второй способ вызова процедуры sub производится с помощью инструкции Call.
ИмяПроцедуры (СписокФактическихПараметров)
Следует обратить внимание, что в этом случае список фактических параметров заключается в скобки. В первом способе скобки не использовались.
Все переменные в VBA имеют тип. Тип указывает, что может хранить переменная: целое или вещественное число, строку, дату и т. д. Базовые типы переменных VBA приведены ниже.
Boolean – булев тип данных может хранить только два значения: True либо False, истина или ложь. Его использование вместо целочисленных переменных является хорошим стилем программирования.
Byte – байтовый тип является новым в Visual Basic 5 и предназначен для хранения целых чисел от 0 до 255. Его использование позволяет сильно экономить оперативную память и уменьшать размер массивов по сравнению с предыдущими версиями Visual Basic. Кроме того, он используется при работе с двоичными файлами.
Currency – данный тип создан для того, чтобы избежать ошибок при преобразовании десятичных чисел в двоичную форму и наоборот. (Невозможно 1/10 представить как сумму 1/2, 1/4, 1/8, 1/16 и т.п.) Данный тип может иметь до 4 цифр после запятой, и до 14 – перед ней. Внутри данного диапазона вычисления будут точными. Поскольку все арифметические операции, кроме сложения и вычитания, выполняются так же медленно, как и в случае переменных с двойной точностью, данный тип является предпочтительным для проведения финансовых расчетов.
Date – этот тип данных позволяет хранить значения времени и даты в промежутке от полуночи 1 января 100 года до полуночи 31 декабря 9999 года. Если вводится только значение даты, Visual Basic полагает, что время равняется 00:00.
Decimal – самый мощный числовой тип. Для хранения переменной подобного типа отводиться 16 байт. Отрицательная и положительная границы промежутка, в котором располагаются возможные значения этой переменной, одинаковы по модулю и равны +/- 79 228 162 514 264 337 593 543 950 335, если использовать целые числа. Если же необходимо хранить дробные величины, то границы возможных значений будут смещены на несколько порядков в зависимости от того, сколько знаков после запятой использует разработчик. Подобный тип может использоваться только для хранения десятичных дробей. Разработчик может использовать до 28 знаков после запятой.
Double – переменные такого типа позволяют хранить числа с точностью до 16 цифр и длиной до 300 символов. Вычисления с ними тоже являются приблизительными, а скорость их относительно небольшая. В основном переменные типа Double используются для научных расчетов.
Integer – целочисленные переменные могут хранить только относительно небольшие целые числа (в диапазоне от -32 768 до +32 767). Арифметические операции над такими числами выполняются очень быстро.
Long – в переменных данного типа хранятся целые значения от -2 147 483 648 до +2 147 483 647.
Object – по сути, переменная подобного типа является всего лишь ссылкой на некий конкретный экземпляр какого либо объекта. Для хранения переменной отводятся 4 байта.
Single –данный тип переменной позволяет хранить дробные числа с точностью до семи цифр. Это означает, что если получается результат 12345678.97, то часть 8.97 не является точной. Результат может быть равен, к примеру, 12345670.01. Длина чисел может достигать 38 знаков. Вычисления с данными переменными тоже будут приблизительными. Более того, арифметические действия выполняются медленнее, чем с целочисленными переменными.
String – строковые переменные хранят символы. Теоретически такая переменная может содержать до 2 миллиардов символов. В любом случае на конкретном компьютере это число будет гораздо меньше из-за ограниченных объемов оперативной памяти, ресурсов Windows или числа символов, используемых в форме. Одно из наиболее основных применений строковых переменных состоит в выборе информации из полей ввода.
Variant – данный тип добавлен в Visual Basic 5 из версии 2.0. Переменная типа variant может содержать данные любого типа. Если Visual Basic не знает тип принимаемых данных, необходимо использовать variant. Тип информации не имеет значения, поскольку variant может содержать любой тип данных (численный, дата/ время, строковый). Visual Basic автоматически производит необходимые преобразования данных, поэтому не стоит беспокоиться об этом. С другой стороны, можно использовать встроенные функции для проверки типа данных, хранящихся в переменной типа variant. Они позволяют легко проверить, правильно ли пользователь вводит информацию. Использование такого типа данных, как variant, замедляет работу программы, так как требуется время и ресурсы для операций преобразования типов. Кроме того, многие программисты понимают, что использование автоматических преобразований типов данных приводит к неаккуратному виду программ. Единственная причина в использовании variant состоит в возможных ошибках при преобразовании типов непосредственно программистом.
Описание типа каждой переменной делает программу надежнее и, кроме того, убыстряет ее работу, т. к. VBA не требуется тратить время на распознавание типа неописанной переменной при каждом обращении к ней. Синтаксис:
Dim [WithEvents] ИмяПеременной[([Индексы])] [As [New] Тип] [,[WithEvents] ИмяПеременной[([Индексы])] [As [New] Тип]]
Аргументы:
WithEvents – ключевое слово, указывающее, что аргумент имя переменной является именем объектной переменной, которая используется при отклике на события, генерируемые объектом ActiveX (т. е. объектом, который может быть открыт для других приложений и средств программирования).
ИмяПеременной – имя переменной, удовлетворяющее стандартным правилам именования переменных.
Индексы – размерности переменной массива; допускается описание до 60 размерностей. Для задания аргумента индексы используется следующий синтаксис: [Нижний То] Верхний [, [Нижний То] Верхний]. Если нижний индекс не задан явно, нижняя граница массива определяется инструкцией option Base. Если отсутствует инструкция option Base, нижняя граница массива равняется нулю.
New – ключевое слово, включающее возможность неявного создания объекта. Если указано ключевое слово New при описании объектной переменной, новый экземпляр объекта создается при первой ссылке на него, поэтому нет необходимости присваивать ссылку на объект с помощью инструкции Set.
Тип – тип данных переменной. Для каждой описываемой переменной следует использовать отдельное предложение As Тип.
Переменные, описанные с помощью ключевого слова Dim на уровне модуля, доступны для всех процедур в данном модуле. Переменные, описанные на уровне процедуры, доступны только в данной процедуре.
Инструкция Dim предназначена для описания типа данных переменной на уровне модуля или процедуры.
Если при описании объектной переменной не используется ключевое слово New, то для использования объекта, на который ссылается переменная, существующий объект должен быть присвоен переменной с помощью инструкции Set.
В VBA пользователь определяет имена переменных, функций, процедур, типов, постоянных и других объектов. Вводимые пользователем имена должны отражать суть обозначаемого объекта так, чтобы делать программу легко читаемой. В VBA имеются следующие ограничения на имена:
1. Длина имени не должна превышать 255 символов.
2. Имя не может содержать точек, пробелов и следующих символов: %, .&, !, #, @, $.
3. Имя может содержать любую комбинацию букв, цифр и символов, начинающуюся с буквы.
4. Имена должны быть уникальны внутри области, в которой они определены.
5. Не следует использовать имена, совпадающие с ключевыми словами VBA и именами встроенных функций и процедур.
Хотя регистр букв (верхний или нижний) в имени не имеет значения, умелое использование его может существенно облегчить понимание содержательной стороны переменной.
Массив, как и обычные переменные, объявляется с помощью операторов Dim или Public. Кроме того, можно определить количество элементов в массиве: введите первый индексный номер, ключевое слово То и последний индексный номер — вся конструкция будет заключена в скобки. Например, так можно объявить массив, содержащий ровно 100 целых чисел:
Dim MyArray(1 To 100 As Integer
При объявлении массива обязательно следует указывать только верхний индекс, тогда VBA предопределяет нижний индекс равный нулю. Следовательно, две следующих оператора приведут к одинаковым результатам:
Dim MyArray(0 То 100) As Integer
Dim MyArray(100) As Integer
В обоих случаях массив состоит из 101 -го элемента.
Объявление многомерных массивов
В примерах массивов в предыдущем разделе использовались одномерные массивы. Массивы VBA могут иметь до 60-ти измерений, хотя на самом деле используется не более трех (трехмерные массивы). Показанный ниже оператор объявляет двухмерный 100-элементный массив целых чисел:
Dim MyArray(1 To 10, 1 То 10) As Integer
Этот массив можно рассматривать как матрицу значений 10x10. Чтобы обратиться к конкретному элементу двухмерного массива, используйте два индексных номера. Например, таким образом присваивается значение элементу предыдущего массива.
МуАггау(0, 4) = 125
Трехмерный массив можно рассматривать как куб, но не существует способа визуально представить данные массива, в котором больше трех измерений. Динамический массив не имеет предопределенного количества элементов. Динамический массив объявляется с незаполненными значениями в скобках:
Dim MyArray() As Integer
Тем не менее, прежде чем динамический массив можно будет использовать в программе, необходимо обратиться к оператору ReDim, указывающему VBA, сколько элементов находится в массиве (или ReDim Preserve, если вы решили сохранить текущую длину массива). Оператор ReDim можно использовать сколько угодно раз, изменяя, если требуется, размер массива.
Дата добавления: 2016-01-26; просмотров: 1387;