Область видимости переменных, констант, подпрограмм и функций 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Область видимости переменных, констант, подпрограмм и функций



Любая переменная, константа, подпрограмма или функция VBA обладает областью видимости (scope), в которой возможен доступ к данной переменной, константе, подпрограмме или функции. Допустим, что мы определили переменную Var1 в процедуре Proc1, а затем написали вторую процедуру – Proc2, где также хотим использовать эту переменную. Если Var1 описана внутри Proc1 ключевым словом Dim, она считается переменной «уровня процедуры». Это означает, что область её видимости ограничена подпрограммой или функцией, в которой она объявлена. Использовать Var1 в Proc2 без расширения видимости переменной нельзя.

Рассмотрим другой пример. В модуле Модуль1 содержится функция Функция1. Мы хотим вызвать её из программы, помещенный в другой модуль, например Модуль2. Если Функция1 описана с помощью ключевого слова Function (см. раздел «Функции»), она считается функцией «уровня проекта». То есть она доступна везде в пределах содержащей её рабочей книги – мы вправе вызывать её из любой программы любого модуля книги. Чтобы предотвратить вызов функции из программ других модулей, достаточно ограничить область её видимости.

А теперь рассмотрим вопросы видимости отдельно для всех, уже описанных нами, основных элементов VBA – переменных, констант, подпрограмм и функций.

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

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

§ процедуры;

§ модуля;

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

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

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

Переменная доступна на уровне процедуры, если она объявлена внутри процедуры ключевым словом 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, придется либо передать его в качестве аргумента, либо расширить область видимости этой переменной, как описано в следующем разделе.

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

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

Dim Var2 As String

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

Var2 = "Привет!"

DisplayMessage2

End Sub

Sub DisplayMessage2()

MsgBox Var2

End Sub

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

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

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

Private Var2 As String

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

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

Переменные уровня проекта

Переменная уровня проекта (или общего уровня) доступна и сохраняет свое значение в любом модуле проекта, содержащего ее описание. Чтобы сделать переменную доступной на уровне проекта, объявите ее с ключевым словом Public в разделе описаний любого модуля проекта, перед любыми подпрограммами и функциями. Мы написали две процедуры и разместили их в различных модулях. Одна из них присваивает значение переменной уровня проекта, а другая выводит его в информационном окне:

Public Var3 As String

Sub ПрисвоениеЗначения()

Var3 = "Эта переменная была объявлена в Модуль2."

End Sub

 

Sub ПеременнаяУровняПроекта()

ПрисвоениеЗначения

MsgBox Var3

End Sub

В этом примере программа ПеременнаяУровняПроекта вызывает из другого модуля программу ПрисвоениеЗначения, присваивающую значение переменной уровня проекта Var3. Затем значение этой переменной в ПеременнаяУровняПроекта выводится на экран. Доступ на уровне проекта проиллюстрирован на Рис. 7‑3 и Рис. 7‑4.

Рис. 7‑3. Объявление переменной на уровне проекта

Рис. 7‑4. ПеременнаяVar3, объявленная на уровне проекта, доступна
во всех модулях рабочей книги

Сохраняемые переменные

Вы уже знаете, что при объявлении переменных используются ключевые слова Dim и Public. Для описания же переменных на уровне процедуры применяется еще одно ключевое слово — Static. Переменная, объявленная знакомым нам способом, с помощью инструкции Dim, прекращает свое существование после завершения программы, в которой она была описана, то есть после слов End Sub или End Function. Определив переменную как Static (сохраняемую), мы продлим время ее жизни до завершения работы всех программ, включая и ту, в которой переменная была описана.

Sub СтатическаяПеременная()

СтатическаяНестатическая

СтатическаяНестатическая

End Sub

Sub СтатическаяНестатическая()

Static Var1 As String

Dim Var2 As String

If Varl = "" Then

Var1 = "Var1: Статическая переменная"

Var2 = "Var2: Нестатическая переменная "

End If

MsgBox Varl

MsgBox Var2

End Sub

В программе СтатическаяПеременная дважды вызывается программа СтатическаяНестатическая. При первом вызове определяется сохраняемая переменная Varl и обычная переменная Var2. Затем в инструкции If переменная Varl сравнивается с пустой строкой. Результат положительный, поскольку пока этой переменной значение не присвоено. В инструкции If переменным Varl и Var2 присваиваются строковые значения, которые перед завершением работы СтатическаяНестатическая отображаются в информационных окнах. Затем управление возвращается в СтатическаяПеременная, и СтатическаяНестатическая вызывается второй раз. Переменная Varl, объявленная как Static, сохранила свое значение, поэтому второе сравнение приводит к отрицательному результату. Повторное присвоение значений Varl и Var2 не происходит. Когда переменная Varl выводится на экран, в окне отображено ее прежнее значение. Переменная же Var2 при повторном вызове СтатическаяНестатическая была создана заново, поэтому в ее окне мы увидим пустую строку.



Поделиться:


Последнее изменение этой страницы: 2021-12-15; просмотров: 41; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 18.118.45.162 (0.011 с.)