Материал: Программирование на языке Visual Basic для приложений. Подвальный С.Л., Рог А.И

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Приложение

Проект

Модуль

Процедура

Рис. 5.2. Области видимости переменных

-Оператор Dim объявляет переменную внутри тела процедуры и в любом месте процедуры, но до операторов, использующих ее. Время "жизни" данной переменной - это рамки процедуры, т. е. при входе в данную процедуру под переменную выделяется память и происходит ее инициализация, затем,

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

-Оператор static аналогичен оператору Dim: он объявляет статическую переменную. Разница состоит в том, что при выходе из процедуры у статической переменной память не отбирается, а становится (в силу области видимости) временно недоступной, и соответственно сохраняется ее значение, которым при повторном обращении к процедуре можно воспользоваться.

2. Модуль (область видимости - все процедуры модуля, в котором переменная объявлена).

-Оператор Private объявляет переменную в разделе описаний Declarations (вне процедур модуля)

-Оператор Dim абсолютно аналогичен (в данном случае) оператору Private.

3. Приложение (область видимости - все процедуры всех модулей активного приложения).

-Оператор Public объявляет переменную в разделе опи-

саний Declarations.

78

5.3. Объявление процедур и функций

Процедуры, как и все пользовательские элементы VBA, требуют объявления. Объявление процедуры имеет следующий синтаксис:

[Private I Public I Friend] [Static] Sub имяПроцедуры _ ([списокПараметров])

[блокОператоров 1]

[Exit Sub]

[блокОператоров2]

End Sub

Ключевое слово Private задает областью видимости для процедуры только модуль, в котором она описана, т. е. ее могут вызывать только процедуры того же модуля. Ключевое слово Public, наоборот, объявляет процедуру доступной для всех модулей проекта. По умолчанию процедура общедоступна, т. е. имеет статус Public. Что касается использования ключевого слова Friend, то о нем мы расскажем чуть позже, когда речь пойдет о классах VBA.

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

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

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

[Optional] [ByVal | ByRef] [ParamArray] имяПараметра[()] _ [As типДанных] [= значениеПоУмолчанию]

Ключевое слово Optional означает, что параметр необязателен и его можно опустить при вызове процедуры. По умол-

79

чанию параметр обязателен. Все необязательные параметры должны находится после обязательных. Естественно, что значениеПоУмолчанию - это значение необязательного параметра, если он не будет задан при вызове процедуры. Если в конструкции будет использовано ключевое слово ParamArray, то использование ключевого слова optional невозможно.

В качестве фактических аргументов процедура может получать не только значения констант, но и значения переменных. При передаче переменных в качестве аргументов процедуре может использоваться один из двух способов: ByVal (по значению) и ByRef (по ссылке).

Передача параметров по ссылке и по значению

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

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

Если же переменная передается по значению (т. е. с использованием перед ее именем ключевого слова ByVal), то компилятор создает временную копию этой переменной, и именно адрес этой переменной-копии передается процедуре. Тем самым вызываемая процедура, изменяя значение формального параметра, изменяет значение переменной-копии (но не самой переменной), которая будет уничтожена после завершения работы процедуры.

По умолчанию в VBA переменные передаются по ссыл-

ке.

80

Ключевое слово ParamArray может появиться только перед последним параметром в списке параметров, указывая, что он является необязательным массивом элементов типа variant.

имяАргумента - это идентификатор, составленный согласно правилам создания имен и представляющий аргумент в теле процедуры. Элемент типДанных - это либо встроенный тип данных, либо тип, определенный пользователем. По умолчанию типДаных является типом Variant.

После описания процедуры идет блокоператоров1 (обычно называемый телом процедуры), в котором могут быть использованы значения аргументов процедуры. Если в ходе выполнения операторов процедуры встречается оператор Exit Sub (выход из процедуры), то выполнение процедуры прекращается и управление передается оператору, следующему за оператором вызова процедуры.

Функция отличается от процедуры тем, что помимо выполнения операторов ею возвращается некоторое значение. Синтаксис описания функции немногим отличается от процедуры:

[Public I Private I Friend] [Static] Function имяфункции__ _ [(списокПараметров)] [As типЗначения] [блокОператоров 1] [имяфункции = Выражение]

[Exit Function]

[блокОператоров2] [имяфункции = Выражение]

End Function

Во-первых, ключевое слово Sub заменено Function. Вовторых, после объявления параметров следует указать тип возвращаемого функцией значения.

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

81

ции окажется значение по умолчанию, определенное для соответствующего типа.

И наконец, вместо ключевого слова Exit Sub для выхода из функции используется ключевое слово Exit Function. Давайте на примере структуры книги опишем процедуру инициализации ее содержания, т. е. инициализацию массива content (). Итак, у нас есть аргумент - массив, который передается процедуре initcontent, а процедура инициализирует его посредством использования стандартной функции inputBox. При этом процесс инициализации происходит в бесконечном цикле, каждый раз изменяя размерность массива - так происходит до тех пор, пока пользователь не нажмет кнопку Отмена или не введет пустую строку, что мы проверяем вышеописанным условным оператором if.. .Then.. .Else.

Помимо вышеописанного объявления процедур и функций, в VBA существует особый вид процедур. Это процедуры реакции на событие, вызываемое системой или пользователем (см. главу 7). Например, для документов Word определены со-

бытия open и close, для рабочих книг Excel - Beforesave и BeforeClose, для объектов Пользовательских Классов - Initialize и Terminate; нажатие кнопки диалогового окна тоже является событием и т. д. Пользователь способен сам создать процедуру реакции на подобные события, например попросить выводить сообщение "До свидания, спасибо за работу!" при закрытии документа.

Синтаксис подобной процедуры такой же, как и у обыкновенной, только в ее имени вначале указан объект, с которым будет связано событие, потом символ подчеркивания (_), а затем собственно имя события.

Листинг. Процедура реакции на событие

Private Sub Workbook_BeforeClose (Cancel As Boolean)

MsgBox "До свидания, спасибо за работу!"

End Sub

82

Источник: https://studfile.net/preview/16565567/