Урок 5 по VBA — Объявление локальных и глобальных переменных

Урок 5 по VBA — Объявление локальных и глобальных переменных Макросы на VBA

В данной статье мы рассмотрим работу с локальными и глобальными переменными VBA языка, а именно: как ведут себя переменные, объявленные в блоке модуля и в блоке отдельной процедуры; познакомимся с ключевыми словами Public, Private и Static; Определим логику назначении типов данных при объявлении нескольких переменных в одной строке; напишем парочку примеров.

В прошлых статьях мы кратко рассмотрели переменные и типы данных, теперь настало время более подробно вникнуть во все тонкости…

Объявление нескольких переменных VBA

Рассмотрим такой пример: надо объявить три переменные разного типа, например, Byte, String и Long, это может выглядеть так:

dim A as Byte, B as String, C as Long

Но вот что делать, если все три переменные должны быть одного типа, такой код будет неверен:

dim A, B, C as Long

Тут A и В будут типа Variant и только C – Long. Что бы все правильно сработало, нам нужно каждой переменной назначить заданный тип:

dim A as Long, B as Long, C as Long

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

Если переменная VBA объявлена в начале модуля, то она сохраняется в памяти до тех пор, пока работает макрос, если объявление происходит в теле процедуры, то переменная будет удалена из памяти сразу, после выполнения блока кода заданной процедуры. Добавьте в редакторе Visual Basic новую форму и модуль.

Параметры формы: разместите на форме три компонента Label и три кнопки, как показано на рисунке. Имя формы (свойство Name) – VariableForm, имя модуля – VariableModule.

В редакторе кода для модуля пропишите:

Sub VariableModule()
    VariableForm.Show
End Sub

Тут мы просто определяем, что при запуске макроса нужно запустить форму.

В редакторе кода для формы пропишите:

'**************************************************
' Объявление локальных и глобальных переменных в VBA
'**************************************************
 
' Включаем проверку переменных VBA
Option Explicit
 
' Глобальная переменная
Dim GVar As Integer
'Нельзя присвоить значение вне процедуры!!!
'GVar = 10
Sub GetGlobal()
    ' Увеличиваем значение на 5
    GVar = GVar + 5
    Label1.Caption = "Глобальное значение " & GVar
End Sub
Sub GetLocal_1()
Dim LVar As Integer
    ' Увеличиваем значение на 2
    LVar = LVar + 2
    Label2.Caption = "Локальное значение " & LVar
End Sub
Sub GetLocal_2()
Dim LVar As Integer
    ' Увеличиваем значение на 3
    LVar = LVar + 3
    Label3.Caption = "Локальное значение " & LVar
End Sub
 
Private Sub CommandButton1_Click()
    Call GetGlobal
End Sub
 
Private Sub CommandButton2_Click()
    Call GetLocal_1
End Sub
 
Private Sub CommandButton3_Click()
    Call GetLocal_2
End Sub
 
Private Sub UserForm_Click()
 
End Sub
 
Private Sub UserForm_Initialize()
    ' настройка первого текстового поля
    Label1.FontSize = 12
    Label1.ForeColor = &HFF0000
    Call GetGlobal
 
    ' настройка второго текстового поля
    Label2.FontSize = 12
    Label2.ForeColor = &H6400
    Call GetLocal_1
 
    ' настройка третьего текстового поля
    Label3.FontSize = 12
    Label3.ForeColor = &HFF
    Call GetLocal_2
End Sub

В самом начале мы объявляем глобальную переменную VBA – GVar типа Integer, в комментарии указано, что вне процедуры присвоить значение переменной нельзя. Далее следуют три процедуры, в первой процедуре происходит увеличение значение глобальной GVar на 5, результат будет записываться в свойство Caption первого компонента Label. Вторя и третья процедуры производят аналогичные действия, только для объявленных в них локальных переменных VBA, LVar, происходит увеличение значения на 2 и на 3, соответственно. События Click (нажатие кнопки мыши) для кнопок будет вызывать заданные процедуры.

Объявление VBA переменных

При запуске макроса в полях будут отображаться значения 5, 2 и 3. При нажатии на “Кнопка 1” будет происходить вызов процедуры GetGlobal и увеличение значения переменной GVar на 5. Для “Кнопка 2” и “Кнопка 3” будут вызываться процедуры GetLocal_1 и GetLocal_2, однако ничего увеличиваться не будет, так как переменные LVar являются локальными и при каждом вызове заданных процедур их значение будет обнуляться.

Ключевые слова Private, Public и Static

Private – аналогично ключевому слову Dim, использование Private вместо Dim актуально в том случае, если вы хотите, что бы данное ключевое слово напоминало о том, что переменная доступна только в пределах данной процедуры или функции.

Public – позволяет сделать переменную VBA доступной из любой части проекта, однако, это будет актуальным лишь в том случае, если объявление переменных в VBA происходит в разделе Declarations (Объявления) самого модуля. Если же вы пропишите Public вместо Dim в теле процедуры, то видимость все ровно будет доступна только в данной процедуре.

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

Sub GetLocal_1()
Static LVar As Integer
    ' Увеличиваем значение на 2
    LVar = LVar + 2
    Label2.Caption = "Локальное значение " & LVar
End Sub
Sub GetLocal_2()
Static LVar As Integer
    ' Увеличиваем значение на 3
    LVar = LVar + 3
    Label3.Caption = "Локальное значение " & LVar
End Sub

Мы просто изменили ключевое слово Dim на Static, и теперь переменные LVar не будут удаляться из памяти после выполнения процедур. Объявление переменных в VBA. Обратите внимание, что мы объявили переменные с одним именем, это можно, так как они находятся в отдельных процедурах.

Оцените статью
Технологии программирования и ведение блога
Добавить комментарий