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

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

Область определения и время жизни переменных - два важных понятия, которые используются при работе с переменными. Они определяют, как и где применяются переменные.

Область определения переменной определяет, где можно использовать переменную. В VBA имеется три уровня области определения:

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

  2. Переменные уровня модуля используются только в процедурах модуля, в котором они описаны, но не в других модулях проекта.

  3. Общие переменные используются во всех процедурах любого модуля данного проекта.

Область определения переменной определяется тем, где и как описать переменную:

  • Личная переменная описывается с помощью инструкции Dim, размещенной в процедуре.

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

  • Общая переменная описывается с помощью инструкции Public, а не инструкции Dim, в разделе описаний модуля:

Public UserName As String

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

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

Static Counter As Integer

В этом случае переменная Counter сохраняет свое значение, пока выполняются другие процедуры.

Проиллюстрируем сказанное на примерах процедур. Введите нижеприведенный код в окне модуля и запустите на выполнение процедуру CallingMacro.

Dim Counter As Integer

Sub CallingMacro()

CounterMacro

BadCounterMacro

Debug.Print "Counter = " & Counter

End Sub

Sub CounterMacro()

Static MyCounter As Integer

Counter = Counter + 1

MyCounter = MyCounter + 1

Debug.Print "CounterMacro: Counter = " & Counter

Debug.Print "CounterMacro: MyCounter = " & MyCounter

End Sub

Sub BadCounterMacro()

Dim MyCounter As Integer

Counter = Counter + 1

MyCounter = MyCounter + 1

Debug.Print "BadCounterMacro: Counter = " & Counter

Debug.Print "BadCounterMacro: MyCounter = " & MyCounter

End Sub

В приведенных процедурах имеются три переменных:

  • переменная Counter - переменная уровня модуля, поэтому она доступна во всех процедурах модуля. При каждом вызове процедуры CounterMacro или BadCounterMacro переменная Counter увеличивается на единицу.

  • переменная MyCounter описана с помощью инструкции Static в процедуре CounterMacro, поэтому она используется только в этой процедуре и не доступна в других. Переменная сохраняет свое значение при выходе из процедуры и каждый раз увеличивается на единицу при входе в нее. Прежде чем вызвать процедуру в первый раз, переменная MyCounter инициализируется значением 0.

  • другая переменная с именем MyCounter описана как личная переменная процедуры BadCounterMacro, без использования инструкции Static. Поэтому она повторно инициализируется значением 0 при каждом вызове процедуры.

Теперь посмотрим на результаты выполнения макроса CallingMacro в окне отладки (Вид/Окно отладки), если запустить его дважды:

CounterMacro: Counter = 1

CounterMacro: MyCounter = 1

BadCounterMacro: Counter = 2

BadCounterMacro: MyCounter = 1

Counter = 2

CounterMacro: Counter = 3

CounterMacro: MyCounter = 2

BadCounterMacro: Counter = 4

BadCounterMacro: MyCounter = 1

Counter = 4

Очевидно, что переменная уровня модуля Counter увеличивается на единицу при вызове каждой из процедур. Переменная MyCounter процедуры CounterMacro также непрерывно увеличивается на единицу при входе в процедуру, а переменная MyCounter процедуры BadCounterMacro каждый раз инициализируется значением 0 и увеличивается только до 1.