Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
VBA_lektsii.doc
Скачиваний:
0
Добавлен:
01.01.2020
Размер:
3.91 Mб
Скачать

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

Хотя обычно термин «область видимости» применяют, говоря о доступе к переменной из различных фрагментов приложения VBA, он также имеет отношение к «времени жизни» переменной, т.е. к промежутку времени, в течение которого переменная сохраняет присвоенное ей значение. В VBA переменные имеют три уровня видимости:

  • процедуры;

  • модуля;

  • проекта (или общий уровень).

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

7.1.1. Переменные уровня процедуры

Переменная доступна на уровне процедуры, если она объявлена внутри процедуры ключевым словом Dim. Например, в ПеременныеУровняПроцедуры у переменной Var1 область видимости – на уровне процедуры.

Sub ПеременныеУровняПроцедуры()

Dim Var1 As Integer

Var1 =55

MsgBox Var1

End Sub

Любая попытка использовать переменную Var1 вне этой процедуры приведет к ошибке. Попробуем вставить в тот же модуль другую программу и попытаемся обратиться в ней к переменной Var1.

Sub ПеременныеУровняПроцедуры ()

Dim Var1 As Integer

Var1 =55

MsgBox Var1

DisplayMessage

End Sub

Sub DisplayMessage()

MsgBox Var1

End Sub

При запуске программы ПеременныеУровняПроцедуры объявляется переменная Var1, ей присваивается значение 55, которое затем выводится в информационном окне. После закрытия окна ПеременныеУровняПроцедуры вызывает другую программу, DisplayMessage, которая также должна отобразить в информационном окне значение переменной Var1. Однако в этом случае окно оказывается пустым (напомним, в первый раз в нем отобразилось число 55), поскольку Varl объявлена на уровне процедуры. За пределами ПеременныеУровняПроцедуры (в которой она описана) её значение не определено. Когда VBA встречает Varl в программе DisplayMessage, он считает, что имеет дело с необъявленной пустой переменной, присваивает ей тип Variant и выводит в информационном окне пустую строку. Видимость на уровне процедуры проиллюстрирована на рис. 7.1.

Рис. 7.1 Переменная Var1, объявленная на уровне процедуры, доступна только в программе ПеременныеУровняПроцедуры

Чтобы исходное значение Varl (55) было доступно в DisplayMessage, придется либо передать его в качестве аргумента, либо расширить область видимости этой переменной, как описано в следующем разделе.

7.1.2. Переменные уровня модуля

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

Dim Var2 As String

Sub ПеременнаяУровняМодуля()

Var2 = "Привет!"

DisplayMessage2

End Sub

Sub DisplayMessage2()

MsgBox Var2

End Sub

В процедуре DisplayMessage2 успешно используется переменная Var2, значение которой было в ПеременнаяУровняМодуля, поскольку Var2 была описана на уровне модуля и сохраняется в подпрограммах. Доступ на уровне модуля проиллюстрирован на рис. 7.2 .

Рис.7.2. Переменная Var2, объявленная на уровне модуля, доступна во всем модуле Module1

Чтобы сделать любую переменную доступной на уровне модуля, объявите ее с ключевым словом Private:

Private Var2 As String

Переменные, описанные в начале модуля, доступны в нем по умолчанию, в их определениях слово Private необязательно.

Рассмотрим следующий случай. Пусть переменная Var3 определена в модуле Модуль1, и там же ей присвоено значение. Предположим, мы хотим получить доступ к этой переменной в подпрограмме из модуля Модуль2. Поскольку переменная Var3 доступна лишь в модуле, содержащем ее описание, чтобы использовать Var3 в других модулях, надо расширить область ее видимости, как описано в следующем разделе.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]