Урок 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.ShowEndSub

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

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

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

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

Тут все предельно просто, вначале мы объявили процедуру 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 AsInteger, ParamArray b())Dim elem, s AsString    Label1.Caption = a    ForEach elem In b        s = s & elem & " "    Next    Label2.Caption = sEndSub ' Обработка нажатия на кнопкуPrivateSub CommandButton1_Click()    MyArguments 1, 5, 6, 100, "строка"EndSub ' Настройка свойств при запуске формыPrivateSub UserForm_Initialize()    Label1.Caption = ""    Label1.FontSize = 15    Label1.ForeColor = vbBlue     Label2.Caption = ""    Label2.FontSize = 15    Label2.ForeColor = vbRed    CommandButton1.Caption = "Вывести"EndSub

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

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

VBA Sub и Function

Например:

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

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

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

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

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

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

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 AsInteger, b AsInteger) AsInteger    Summ = a + bEndFunction PrivateSub CommandButton1_Click()    Label1.Caption = "Сумма 10 и 20: " & Summ(10, 20)EndSub PrivateSub UserForm_Initialize()    Label1.Caption = ""    Label1.FontSize = 15    Label1.ForeColor = vbBlue    CommandButton1.Caption = "Сумма"EndSub
Оцените статью
Технологии программирования и ведение блога
Добавить комментарий