RSS

Область действия (видимости) переменных в VBA

Давайте теперь вкратце разберем какие области действия (видимости) переменных существуют в VBA.
Область действия (видимости) переменной определяет, в каких модулях и процедурах она доступна и может использоваться. В VBA существуют следующие области действия переменных:

  • Процедура (Функция) — переменная действует только в процедуре или функции. Описание переменной начинается с ключевого слова Dim или Static непосредственно в самой процедуре или функции.
  • Модуль — переменная действует только в рамках текущего модуля (в котором описана) и доступна для всех процедур и функций, описанных в этом модуле. Переменная объявляется перед первой процедурой или функцией в модуле (если включено обязательное объявление переменных, то после ключевых слов «Option Explicit«). Описание переменной начинается с ключевого слова Dim или Private.
  • Все модули — переменная действует во всех модулях и доступна для любой процедуры и функции всего проекта. Описание переменной может быть в любом модуле проекта и начинаться перед первой процедурой или функцией с ключевого слова Public.

Локальные переменные — это переменные, объявленные в процедуре или функции. Локальные переменные могут использоваться только в процедуре (функции) в которой они объявлены. После завершения выполнения процедуры (функции) переменная освобождается из памяти.

Примечание: Если есть необходимость сохранить результат переменной, то можно воспользоваться «модульной переменной» или глобальной, передав в нее значение. Но в VBA доступен еще один вариант, переменная Static. Переменные, объявленные после ключевого слова Static, сохраняют свое значение по завершении работы процедуры или функции. Только будьте внимательны т.к. если упустить тот момент, что переменные Static сохраняют свое значение, можно получить неверные результаты выполнения процедур и ломать долго голову, в чем причина. Переменные Static объявляются только в процедурах и функциях!
 
Глобальные переменные — соответственно, доступны из любого модуля, видны в любой процедуре или функции и хранят результат до завершения выполнения всей программы.

Ну и теперь примеры описания глобальных, локальных переменных:

Option Explicit
‘Переменные a и x доступны для любой процедуры или функции
‘текущего модуля
Dim a as long
Private x as string

‘Переменная Y является глобальной и доступна любой процедуре проекта
Public Y as integer

Sub Test ()
‘а1 является локальной переменной 
‘и доступна в пределах процедуры Test 
 Dim a1 as long

‘XY -статическая переменная, доступная в пределах 
‘процедуры Test, но сохраняющая результат по ее завершении.
 Static XY as string
….
end sub