Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Тема 2_Основные элементы языка_укр.doc
Скачиваний:
2
Добавлен:
01.05.2025
Размер:
103 Кб
Скачать
☆

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

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

Начнем с определения области действия переменных. В каком месте программы и как именно описана переменная, определяет область ее действия и то, как долго она "живет" в памяти и сохраняет присвоенное ей значение. Имеется три различных уровня при определении области действия переменных:

  • уровень процедуры;

  • уровень модуля;

  • уровень проекта.

Схема видимости переменных в соответствии с объектно-ориентированной моделью контейнеров. Переменные, объявленные во внешнем контейнере, доступны процедурам, входящим в этот контейнер (рис1.).

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

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

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

( Замечание )

Все сказанное ранее относится и к описанию, и к определению области действия констант, а также массивов.

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

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

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

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

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

рис. 1 Схема видимости переменных

Public – объявление глобальной переменной и переменная может использоваться в любой внутренней процедуре программы.

Переменная var2, var5, var4 определена только для процедуры 2, 5, 4 соответственно, var3 – во всех процедурах Модуля 2, var1 - во всех процедурах Модуля 1, var определена во всех модулях и процедурах.

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

Public Al As String

Private A2 As Integer

Dim A3 As Single

Sub ProcK)

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 Al

MsgBox A2

MsgBox A3

MsgBox A4

MsgBox A5

Proc1

End Sub

В этом примере переменная Al определена на уровне всего проекта (использовано ключевое слово Public), переменные А2 и A3 определены на уровне модуля, пере­менная А4 — только на уровне процедуры Procl, а переменная А5 хотя и определена в теле процедуры Procl, но описана как статическая переменная.

При вызове процедуры Ргос2 произойдет следующее: из этой процедуры будет в свою очередь вызвана процедура Procl, которая присвоит значения всем пяти пере­менным А1, А2, A3, А4 и А5, а затем покажет текущие значения переменных А4 и А5 в диалоговом окне.

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

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