Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Область действия объявлений переменных и процедур



Все процедуры, функции, переменные и константы в VBA имеют свою область действия. Это означает, что все они могут использоваться только в определенном месте программного кода — а именно, там, где они описаны. Например, если переменная А описана с помощью оператора Dim в теле процедуры с именем Proc1, то именно эта процедура и является ее областью действия. Таким образом, если имеется другая процедура Proc2, то вы не можете использовать в ней эту же переменную — если вы попытаетесь сделать это, то либо получите сообщение об ошибке из-за использования неописанной переменной (в том случае, если используется упоминавшийся в параграфе 6.3.3 оператор Option Explicit), либо просто получите другую переменную — с тем же самым именем, но никак не связанную с одноименной переменной из первой процедуры.

Начнем с переменных[4]. То, в каком месте программы и как именно описана переменная, определяет область ее действия и то, как долго она "живет" в памяти и сохраняет присвоенное ей значение. Имеется три различных уровня при определении области действия переменных — уровень процедуры, уровень модуля и уровень проекта.

Чтобы определить переменную на уровне процедуры, ее описание помещается в тело этой процедуры.

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

Наконец, чтобы описать переменную на уровне проекта, необходимо расположить ее описание в секции объявлений одного из модулей проекта и при этом обязательно должно использоваться ключевое слово Public. Описанные таким образом переменные могут использоваться в любом модуле проекта.

Все вышесказанное относится и к описанию констант и определению их области действия.

Для переменных имеется еще один способ их описания, не изменяющий их уровня, но позволяющий сохранить значение переменной, описанной на уровне процедуры, после завершения работы этой процедуры. Для этого следует использовать описатель Static, тем самым определяя ее как статическую переменную. Такая переменная сохраняет выделенное ей место в памяти и свое значение даже после завершения процедуры, в которой она была описана и использовалась.

Тем не менее, статическая переменная не может быть использована в других процедурах! Изменяется лишь время ее жизни, но не область действия. Если произойдет повторный вызов той же самой процедуры, в которой была описана статическая переменная, то эта переменная сохранит свое прежнее значение, которое она имела в момент завершения работы этой процедуры при предыдущем вызове. Обыкновенные, не статические переменные, всякий раз инициализируются заново и получают при входе в процедуру пустые значения.

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

Если требуется описать процедуру, используемую только на уровне модуля, то для этого применяется ключевое слово Private. Учтите, что такое описание не только сужает область действия для процедуры, но и запрещает ее использование как самостоятельной процедуры: ее можно вызвать только из другой процедуры.

Наконец, при описании процедур или функций может использоваться и ключевое слово Static. Оно не никак не влияет на область действия процедуры, но воздействует на все переменные, описанные внутри этой процедуры или функции. В этом случае все локальные переменные получают статус Static, и тем самым сохраняются в памяти после завершения такой процедуры и при повторном ее вызове сохраняют свои прежние значения.

Рассмотрим пример модуля, начинающегося следующим образом:

Public A1 As String

Private A2 As Integer

Dim A3 As Single

Sub Proc1()

Dim A4 As Integer

Static A5 As Integer

A1 = "Текстовая строка 1"

A2 = 2

A3 = 3.14

A4 = A4 + 4

A5 = A5 + 5

MsgBox A4

MsgBox A5

End Sub

Sub Proc2()

Proc1

MsgBox A1

MsgBox A2

MsgBox A3

MsgBox A4

MsgBox A5

Proc1

End Sub

Здесь переменная A1 определена на уровне всего проекта (использовано ключевое слово Public), переменные A2 и A3 определены на уровне модуля, переменная A4 — только на уровне процедуры Proc1, а переменная A5 хотя и определена в теле процедуры Proc1, но описана как статическая переменная.

При вызове процедуры Proc2 произойдет следующее: из этой процедуры будет в свою очередь вызвана процедура Proc1, которая присвоит значения всем пяти переменным A1, A2, A3, A4 и A5, а затем покажет текущие значения переменных A4 и А5 в диалоговом окне.

После завершения этой процедуры будут выведены текущие значения переменных A1 — А5 из процедуры Proc2. При этом оказывается, что переменные А1 — А3 сохранили свои значения, поскольку они описаны на уровне модуля, а переменные А4 и А5 принимают пустые значения, поскольку областью действия этих переменных являются процедуры, в которых они используются. Никакие изменения этих переменных внутри одной из процедур не имеют отношения к аналогичным переменным из другой процедуры — на самом деле это разные переменные, просто для них используются совпадающие имена.

Затем происходит еще один вызов процедуры Proc1, и она вновь начинает изменять и выводить на экран значения переменных A4 и А5. При этом переменная A4 вновь получит значение 4, поскольку при новом вызове процедуры для этой переменной будет заново выделена память и она будет инициализирована пустым значением. В отличие от А4, переменная А5, описанная как статическая переменная, сохранит свое прежнее значение от предыдущего вызова этой процедуры, и в результате ее значение при повторном вызове окажется равным 10.





Дата публикования: 2014-12-28; Прочитано: 192 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.007 с)...