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

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

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

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

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

Глобальный уровень. Переменные доступны в пределах всего приложения.

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

    Создайте новый модуль и введите две функции.

Установив курсор в пределах процедуры Переменная1, нажмите клавишу <F5>. В данной процедуре переменной str присваивается строка "Переменная уровня процедуры", после чего данное значение выводится в окно Immediate. В процедуре Переменная2 интерпретатор вернет сообщение об ошибке. Причиной ошибки стало то, что переменная str не определена. Щелкните на кнопке ОК, после чего щелкните на кнопке Reset панели инструментов.

Есть дпа способа исправления этой ошибки:

объявление переменной strв обеих процедурах; объявление переменной str на уровне модуля. Переменные уровня модуля доступны во всех процедурах в пределах данного модуля. Такие переменные объявляются в области общих объявлений модуля, а не в самих процедурах.

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

Для того чтобы создать глобальную переменную в разделе общих объявлений этого модуля измените ключевое слово Dim на Public.

После изменения объявления переменной на общий уровень видимости создайте новый модуль и введите процедуру.

Переменная str стала общей.

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

При выполнении процедуры интерпретатор VBA присваивает всем переменным по умолчанию некоторое значение.

Тип данных Значение, присваиваемое при инициализации
Числовой 0
Строка переменной длины " " (строка нулевой длины)
Строка фиксированной длины Результат функции Chr (0) — непечатный символ
Тип Variant Empty
Объект Nothing

 

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

Протестируем время жизни уровня модуля. В модуле введите две процедуры. Установите курсор в пределах функции ПерМодуля1, после чего нажмите клавишу <F5>. В окне Immediate будет выведено число 0.

Выполните функцию ПерМодуля2, и в окно Immediate будет выведено число 300, затем на ПерМодуля1. Будет выведено число 300 а не нуль. Переменная уровня модуля не только доступна в обеих процедурах — она сохраняет свое значение между их вызовами. Данная переменная не исчезает между отдельными вызовами процедур модуля, как это делает переменная уровня процедуры.

Для того чтобы проиллюстрировать жизнь общей переменной, изменим объявление i в области общих объявлений модуля на Public.

 

  После этого введем в другой модуль следующую функцию:

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

Срок жизни переменных уровня процедуры можно продлить, объявив их статическими с помощью ключевого слова Static:

Static имя_переменной As тип_данных

Статической называется такая переменная уровня процедуры, которая сохраняет свое значение между вызовами той процедуры, в которой она объявлена.

В следующей процедуре продемонстрирован пример использования статической переменной:

Если запустить эту же процедуру второй раз, на печать все равно будет выведена единица. Это происходит потому, что между отдельными вызовами переменная j теряет свое значение, и при каждом вызове она заново инициализируется.

Теперь изменим ключевое слово Dim на Static и снова запустим процедуру. При первом запуске она, как и раньше, вернет значение 1. Запустим процедуру еще раз — теперь она вернет уже значение 2. Это происходит потому, что теперь между отдельными вызовами переменная сохраняет свое текущее значение. Если запустить процедуру еще раз, в окно Immediate будет выведено значение 3 и т.д.

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: