В VBA существует несколько способов вызова процедур для их выполнения. Обязательным условием вызова любой процедуры, является то, что она должна быть известна и доступна редактору VBA.
В этом уроке мы рассмотрим все способы запуска процедур в VBA, в том числе и вызов процедур, которые находятся в разных модулях.
Вызов процедур в VBA
При проверке, или тестировании простой процедуры типа Sub, для её выполнения наиболее часто используют команду Run → Run Sub/UserForm, или нажимают клавишу F5.
Если вы пытаетесь выполнить процедуру вышеописанным способом, то обязательно обращайте внимание на то в каком месте окна Code находится текстовый курсор. Потому что он должен располагаться в любой строке той процедуры, которую вы хотите запустить в данный момент.
Соответственно, если курсор находится вне процедуры, то вы её не вызовете.
Если курсор не установлен ни в одной из процедур окна Code, то откроется диалоговое окно Macros. В нём можно выбрать интересующую вас процедуру и выполнить её.
Список доступных для выполнения в данный момент процедур, можно увидеть и в окне Макрос. А как выполнять макросы мы рассматривали в Уроке №9 «Написание макросов и процедур в VBA редакторе и их выполнение».
Вызов и выполнение процедуры из других процедур
Любую процедуру, независимо от того, имеет она аргументы, или нет, можно вызвать и выполнить из другой процедуры.
Вызов процедуры без аргументов
Обычную процедуру типа Sub без аргументов, вызывают просто указав её имя в отдельной строке программы.
Пример
Sub myMes()
MsgBox "Це повідомлення з процедури myMes"
End Sub
Sub myCode()
myMes
MsgBox "Але запустили ми її з процедури myCode"
End Sub
В данном примере, если мы запустим выполнения процедуры myCode, то первым делом будет выполнен вызов процедуры myMes и на экране появится диалоговое окно с сообщением «Це повідомлення з процедури myMes». Второй строчкой кода в процедуре myCode мы выводим на экран ещё одно диалоговое окно с сообщением «Але запустили ми її з процедури myCode».
Таким образом мы прекрасно видим, как происходит вызов одной процедуры из другой.
Вызов процедуры с передачей аргументов
Процедуру с аргументами вызывают с помощью ключевого слова Call. Это мы уже делали в уроке №33 «Аргументы процедур в VBA».
Пример
Sub myMes(Name)
Name = "Іван"
MsgBox "Це повідомлення з процедури myMes"
End Sub
Sub myCode()
Dim myName
Call myMes(myName)
MsgBox myName
End Sub
В данном примере с помощью оператора Call вызывается процедура myMes и передаётся ей аргумент myName. В результате на экран будет выведено диалоговое окно с текстом «Це повідомлення з процедури myMes», а потом второе диалоговое окно с текстом «Іван».
Вызов процедуры из другого модуля
Вызываемые процедуру могут находиться в разных модулях. При этом они могут иметь даже одинаковое имя. То есть, в одном и том же модуле двух процедур с одинаковым именем быть не может. А вот в двух разных модулях допускается создание процедур с одинаковыми именами.
Для вызова процедуры из определённого модуля нужно сначала указать имя модуля, в котором находится процедура, затем поставить точку и имя вызываемой процедуры.
Для примера, я создал ещё один модуль Module2. В него я скопировал весь код из первого модуля Module1. С той лишь разницей, что в Module2 в процедуре myMes я изменил значение переменной Name на Марина. Это я сделал для того, чтобы видно было, что происходит вызов именно процедуры myMes из Module2.
Код Module1
Sub myMes(Name)
Name = "Іван"
MsgBox "Це повідомлення з процедури myMes"
End Sub
Sub myCode()
Dim myName
Call Module2.myMes(myName)
MsgBox myName
End Sub
Код Module2
Sub myMes(Name)
Name = "Марина"
MsgBox "Це повідомлення з процедури myMes"
End Sub
Sub myCode()
Dim myName
Call myMes(myName)
MsgBox myName
End Sub
В данном примере, мы вызываем из процедуры myCode которая находится в Module1, процедуру myMes, которая находится в Module2. Передаём в myMes аргумент myName. В итоге, на экране будет отображено диалоговое окно с текстом «Це повідомлення з процедури myMes», а потом второе диалоговое окно с текстом «Марина».
