Урок 7 по VBA — Процедуры

Урок 7 по VBA — Процедуры Макросы на VBA

В отличии от языка VBScript, VBA процедуры классифицируются не на два типа (процедура-функция и процедура-подпрограмма), а четырех типов: процедура-функция, процедура-подпрограмма, процедура свойств и обработка событий. Также существуют некоторые дополнения в плане передачи параметров (по значению или по ссылке). Третьим моментом является область видимости – в VBA вызов процедуры может осуществляться как в пределах текущего модуля (макроса), так и за его пределами – во всех проектах. Все это обусловлено тем, что VBA – это не столько язык программирования, сколько программный пакет, с возможностью создания форм и проектов.

Давайте сначала кратко рассмотрим типы VBA процедур:

Подпрограммы – блоки кода заключенные в конструкцию Sub …. End Sub. Сама по себе подпрограмма не возвращает никакого значения, а просто выполняет прописанные в ней команды.

Функции – также блок кода, но прописанный в конструкцию Function … End Function. После выполнения функции возвращается определенное значение, доступ к которому можно получить через имя VBA функции.

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

VBA процедуры типа Sub – подпрограммы

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

Sub ИмяПодпрограмм([аргументы])
Операторы
[Exit Sub]
операторы
End Sub

После ключевого слова Sub следует имя подпрограммы, в круглых скобках можно указывать или не указывать аргументы. Аргументы – это переменные (параметры), значение которых может обрабатываться, аргументы разделяются запятыми. Конструкция Exit Sub также не является обязательной, она говорит  том, что нужно произвести выход из подпрограммы и продолжить выполнение кода, следующего после выражения End Sub.

Вызов VBA процедуры осуществляется с помощью ключевого слова call, например, Call MySub.

Давайте напишем простой пример: добавьте в проект новую форму и новый модуль. На поверхность формы добавьте два текстовых поля (TextBox), одну метку (Label) и одну кнопку (CommandButton). Создайте связь между формой и модулем, прописав в редакторе кода для модуля:

Sub SubModule()
    SubForm.Show
End Sub

Я назвал форму SubForm, а модуль – SubModule, за имя отвечает свойство Name.

vba вызов процедуры

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

'************************************
' Вычисление гипотенузы
'************************************
 
' процедура VBA принимает два параметра
Sub Hipotenuze(a, b)
Dim c
    ' Проверка, если значения равны нулю
    If TextBox1.Text = 0 Or TextBox2.Text = 0 Then
        a = 1: b = 1
    End If
    ' вычисление гипотенузы
    c = Sqr(a ^ 2 + b ^ 2)
    Label1.Caption = "Гипотенуза: " & c
End Sub
 
' Обработка нажатия на кнопку
Private Sub CommandButton1_Click()
Dim Ta, Tb
    Ta = TextBox1.Text
    Tb = TextBox2.Text
    ' vba вызов процедуры Hipotenuze
    Call Hipotenuze(Ta, Tb)
End Sub
 
' Настройка свойств при запуске формы
Private Sub UserForm_Initialize()
    Label1.Caption = ""
    Label1.FontSize = 15
    Label1.ForeColor = vbBlue
    CommandButton1.Caption = "Найти"
    TextBox1.Text = 5
    TextBox2.Text = 5
End Sub

Тут все предельно просто, вначале мы объявили процедуру Hipotenuze, которой будут передаваться два аргумента, далее происходит проверка на нулевые значения. Вызов происходит при нажатии на кнопку, находящуюся на форме, параметрами будут значения, хранящиеся в текстовых полях TextBox1 и TextBox2. Результат отображается в метке Label1.

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

Sub MySub (a As Integer, b As String) … End Sub

Дополнительные особенности:

Static – данное ключевое слово, прописанное перед ключевым словом Sub позволяет сохранять в памяти значения всех переменных после выполнения процедуры. Его мы рассматривали в с статье – переменные VBA.

ParamArray – данное ключевое слово позволяет передавать процедуре переменное количество параметров, оно может использоваться только для последнего элемента в списке аргументов.

Ключевое слово ParamArray

ParamArray нельзя использовать вместе со словами ByRef, ByVal или Optional, например:

'************************************
' Передача параметров
'************************************
 
' процедура VBA принимает два параметра
Sub MyArguments(a As Integer, ParamArray b())
Dim elem, s As String
    Label1.Caption = a
    For Each elem In b
        s = s & elem & " "
    Next
    Label2.Caption = s
End Sub
 
' Обработка нажатия на кнопку
Private Sub CommandButton1_Click()
    MyArguments 1, 5, 6, 100, "строка"
End Sub
 
' Настройка свойств при запуске формы
Private Sub UserForm_Initialize()
    Label1.Caption = ""
    Label1.FontSize = 15
    Label1.ForeColor = vbBlue
 
    Label2.Caption = ""
    Label2.FontSize = 15
    Label2.ForeColor = vbRed
    CommandButton1.Caption = "Вывести"
End Sub

Как видим, мы фактически с помощью ParamArray показываем, что передаем массив, для его обработки мы использовали оператор For …. Each. Тут мы передали при вызове VBA процедуры пять параметров, при этом, первый будет храниться в аргументе a, а остальные в аргументе b, который обрабатывается как массив.

Optional – позволяет указать, что аргумент не является обязательным и одновременно задать значение по умолчанию.

VBA Sub и Function

Например:

'************************************
' Передача параметров
'************************************
 
Sub MyArguments(Optional a As Integer = 5, Optional b As String = " плюс ", Optional c As Integer = 10)
    Label1.Caption = a & b & c
End Sub
 
Private Sub CommandButton1_Click()
    MyArguments
End Sub
Private Sub CommandButton2_Click()
    MyArguments 100, " минус ", 50
End Sub
Private Sub CommandButton3_Click()
    MyArguments 20, , 30
End Sub
 
Private Sub UserForm_Initialize()
    Label1.Caption = ""
    Label1.FontSize = 15
    Label1.ForeColor = vbBlue
 
    CommandButton1.Caption = "Вариант 1"
    CommandButton2.Caption = "Вариант 2"
    CommandButton3.Caption = "Вариант 3"
End Sub

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

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

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

Что бы все стало понятно, рассмотрим следующий пример:

'************************************
' Передача параметров
'************************************
 
Sub MySub1()
Dim MyVar
    MyVar = 100
    Call MySumm1(MyVar)
    Label1.Caption = "Передача по ссылке " & MyVar
End Sub
 
Sub MySub2()
Dim MyVar
    MyVar = 100
    Call MySumm2(MyVar)
    Label2.Caption = "Передача по значению " & MyVar
End Sub
 
Sub MySumm1(ByRef a)
 a = a + 100
End Sub
Sub MySumm2(ByVal a)
 a = a + 100
End Sub
 
Private Sub CommandButton1_Click()
    MySub1
    MySub2
End Sub
 
Private Sub UserForm_Initialize()
    Label1.Caption = ""
    Label1.FontSize = 15
    Label1.ForeColor = vbBlue
 
    Label2.Caption = ""
    Label2.FontSize = 15
    Label2.ForeColor = vbRed
 
    CommandButton1.Caption = "Проверить"
End Sub

MySub1 – тут происходит объявление переменной MyVar и присвоение ей значения 100, далее в теле происходит вызов VBA процедуры MySumm1, ей в качестве параметры мы передаем значение переменной MyVar – 100. Сама процедура MySumm принимает значение по ссылке, на что указывает ключевое слово ByRef, к принятому значению прибавляется число 100. Стоит обратить внимание, что ByRef можно было и не писать. После VBA вызова процедуры MySumm1 происходит запись значения переменной MyVar в свойство Caption объекта Label1, в итоге, отобразится число 200.

MySub2 – аналог предыдущей процедуры, но тут происходит вызов MySumm2, в которой происходит передача параметров по значению, о чем говорит ключевое слово ByVal, в итоге, значение переменной MyVar не изменится.

VBA процедуры типа Function – функции

Пользовательским функциям языка VBA присущи практически те же правила, что и подпрограммам. Общая структура функции:

Function ИмяФункции ([аргументы]) [As ТипДанных]
Операторы
[Exit Function]
Операторы
[ИмяФункции=Выражение]
End Function

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

Function Summ(a As Integer, b As Integer) As Integer
    Summ = a + b
End Function
 
Private Sub CommandButton1_Click()
    Label1.Caption = "Сумма 10 и 20: " & Summ(10, 20)
End Sub
 
Private Sub UserForm_Initialize()
    Label1.Caption = ""
    Label1.FontSize = 15
    Label1.ForeColor = vbBlue
    CommandButton1.Caption = "Сумма"
End Sub
Оцените статью
Технологии программирования и ведение блога
Добавить комментарий