Статические переменные и подпрограммы

Переменные, указанные в параметрах, а также переменные, объявленные внутри подпрограммы, являются локальными переменными. Эти переменные создаются при вызове подпрограммы, а после выхода из подпрограммы они удаляется. Таким образом, локальная переменная видна только внутри подпрограммы. Если название локальной переменной совпадает с названием глобальной переменной, то все операции будут производиться с локальной переменной, а значение глобальной не изменится. Чтобы в этом случае обратиться к глобальной переменной, необходимо перед названием переменной указать название модуля и оператор . (точка). Пример сохранения промежуточного значения между вызовами подпрограммы в глобальной переменной приведен в листинге 9.20.

Листинг 9.20. Сохранение промежуточного значения в глобальной переменной

Dim x As Integer

Sub Сумма(x As Integer)
   Module1.x = Module1.x + x
End Sub

Sub Тест()       ' Запускаем эту процедуру
   x = 0
   Сумма 10
   Сумма 20
   Debug.Print x ' 30
End Sub

Статические переменные позволяют отказаться от использования глобальных переменных, для сохранения промежуточных значений между вызовами подпрограммы. Инициализация статической переменной производится только при первом вызове подпрограммы. После завершения работы подпрограммы статическая переменная сохраняет свое значение, которое доступно при следующем вызове подпрограммы. При объявлении статической переменной перед именем переменной вместо ключевого слова Dim указывается ключевое слово Static. В качестве примера переделаем предыдущий пример и используем статическую переменную вместо глобальной (листинг 9.21).

Листинг 9.21. Использование статических переменных

Function Сумма(y As Integer) As Integer
   Static x As Integer  ' Статическая переменная
   x = x + y
   Сумма = x
End Function

Sub Тест()       ' Запускаем эту процедуру
   Debug.Print Сумма(10) ' 10
   Debug.Print Сумма(20) ' 30
End Sub

Статическими могут быть не только переменные, но и подпрограммы. Если перед ключевыми словами Sub и Function указать ключевое слово Static, то все локальные переменные внутри подпрограммы будут статическими, т. е. будут сохранять свое значение между вызовами подпрограммы. Переделаем предыдущий пример и объявим функцию Сумма() статической (листинг 9.22).

Листинг 9.22. Использование статических подпрограмм

Static Function Сумма(y As Integer) As Integer
   Dim x As Integer
   x = x + y
   Сумма = x
End Function

Sub Тест()       ' Запускаем эту процедуру
   Debug.Print Сумма(10) ' 10
   Debug.Print Сумма(20) ' 30
End Sub
Предыдущая статья Все статьи Следующая статья