Вызов процедур Sub (подпрограмм) из кода других процедур, расположенных в одном или разных модулях, в одной или разных книгах Excel (проектах VBA), с аргументами или без. Примеры.
Вызов процедур Sub в пределах одной книги
Вызов подпрограммы из кода другой процедуры Sub, расположенной в том же модуле или другом модуле одной рабочей книги (проекта VBA) осуществляется с помощью ключевого слова Call или без него по имени подпрограммы. Вызывающая процедура Sub может быть любой видимости, как Public, так и Private, а вызываемая, если расположена в том же модуле, может быть любой видимости, но если расположена в другом модуле, должна быть объявлена как Public.
Синтаксис вызова подпрограмм в пределах одной книги
[ Call ] ИмяПроцедуры [ (Аргументы) ]
- Call — необязательное ключевое слово;
- ИмяПроцедуры — обязательный компонент, имя вызываемой подпрограммы;
- Аргументы — необязательный компонент, список аргументов вызываемой процедуры Sub, разделенных запятой.
Вызов подпрограмм без аргументов в пределах одного модуля
Скобки рядом с именами вызываемых подпрограмм без аргументов не ставятся:
1 2 3 4 5 6 7 8 9 10 11 12 |
Private Sub test1() Call test2 test3 End Sub Private Sub test2() MsgBox "Процедура test2 (Private) вызвана с ключевым словом Call!" End Sub Public Sub test3() MsgBox "Процедура test3 (Public) вызвана без ключевого слова Call!" End Sub |
Вы можете скопировать приведенный код в свой модуль и посмотреть, запустив процедуру test1, как она последовательно запускает процедуры test2 и test3.
Вызов подпрограмм с аргументами в пределах одного модуля
При вызове процедур Sub с аргументами и ключевым словом Call, аргументы заключаются в скобки, без ключевого слова Call — аргументы не заключаются в скобки:
1 2 3 4 5 6 7 8 9 10 11 12 |
Private Sub test4() Call test5(15, 25) test6 256, 312, 4.52 End Sub Sub test5(a As Single, b As Single) MsgBox a + b End Sub Sub test6(c As Single, d As Single, e As Single) MsgBox c + d + e End Sub |
Вы можете разместить этот код в своем модуле и протестировать его.
Вызов подпрограмм из разных модулей одной книги
Правила, касающиеся использования оператора Call и заключения аргументов в скобки, верны и для вызова процедур Sub, находящихся в разных модулях. Единственным отличием является необходимость вместе с именем вызываемой подпрограммы указывать место ее расположения. Место расположения и имя подпрограммы разделяются точкой.
Вызываемая подпрограмма расположена в Стандартном модуле
1 2 3 4 5 6 7 |
'Процедура Sub с уникальным именем - 'возможны два варианта: УникальноеИмяПроцедуры ИмяМодуля.УникальноеИмяПроцедуры 'Процедура Sub с неуникальным именем - 'возможен только один вариант: ИмяМодуля.НеуникальноеИмяПроцедуры |
- ИмяМодуля — уникальное имя стандартного модуля, отображаемое в проводнике проекта VBA.
Неуникальное имя процедуры возникает, когда создаются процедуры с одним именем в разных модулях. Если есть вероятность дублирования в дальнейшем имени подпрограммы и лишения ее уникальности, то лучше сразу вызывать ее с указанием имени стандартного модуля.
Вызываемая подпрограмма расположена в модуле книги, модуле листа, модуле формы
1 2 3 4 5 6 7 |
'В модуле книги: ЭтаКнига.ИмяПроцедуры 'В модуле листа: ИмяЛиста.ИмяПроцедуры Worksheets("Имя ярлычка листа").ИмяПроцедуры 'В модуле формы: ИмяФормы.ИмяПроцедуры |
- ЭтаКнига — так и пишется, указывает на текущую книгу в которой расположены вызывающая и вызываемая подпрограммы.
- ИмяЛиста — уникальное имя листа, которое в проводнике проекта VBA указано без скобок (по умолчанию: Лист1, Лист2, Лист3 и т.д.).
- Имя ярлычка листа — дублирующее имя листа, которое в проводнике проекта VBA указано в скобках.
- ИмяФормы — уникальное имя пользовательской формы, отображаемое в проводнике проекта VBA.
Вызов процедур Sub из модулей разных книг
Если вызываемая подпрограмма расположена в другой книге, она должна быть объявлена как Public, а книга открыта. Запустить такую процедуру Sub можно с помощью метода Application.Run (протестировано в Excel 2016).
Синтаксис метода Application.Run
Application.Run «ИмяКниги!ИмяМодуля.ИмяПроцедуры», Арг1, Арг2, …, Арг30
- ИмяКниги!ИмяМодуля.ИмяПроцедуры — обязательный компонент, полный адрес подпрограммы, заключен в двойные кавычки.
- ИмяКниги — имя рабочей книги Excel с расширением, в которой находится вызываемая подпрограмма, если имя содержит пробелы, оно заключается в одинарные кавычки — апострофы (‘Имя Книги’).
- ИмяМодуля — имя модуля для стандартного модуля (для уникальных имен вызываемых подпрограмм может не указываться), имя листа для модуля листа, словосочетание «ЭтаКнига» (без кавычек) для модуля книги.
- ИмяПроцедуры — имя вызываемой процедуры Sub.
- Арг1, Арг2, …, Арг30 — необязательные компоненты, аргументы вызываемой подпрограммы, максимальное количество которых ограничено 30 элементами.
Полный адрес вызываемой процедуры заключен в двойные кавычки, отделен от аргументов и аргументы друг от друга запятыми.
Полный адрес вызываемой процедуры
Может показаться сложным составить полный адрес вызываемой подпрограммы, но на самом деле все очень просто — Excel уже сделал это за нас.
1. Откройте окно со списком макросов.
2. Найдите в списке вызываемую подпрограмму и кликните по ней. Ее полный адрес отобразится в поле «Имя макроса».
3. Скопируйте полное имя вызываемой процедуры Sub и вставьте ее в метод Application.Run, заключив в двойные кавычки.
Один нюанс: в окне «Макрос» не отображаются процедуры с аргументами. Чтобы отобразить такую процедуру, закомментируйте аргументы, а после копирования и вставки раскомментируйте их.
Стоит не забывать о том, что если книга с вызываемой подпрограммой будет переименована, то полное имя вызываемой процедуры Sub изменится и везде, где оно присутствует в коде, его необходимо будет отредактировать.
Пример вызова подпрограмм из другой книги
Допустим, у нас есть рабочая книга Excel под именем «Книга1.xlsm» (или «Книга1.xls» в ранних версиях программы). В ней находятся вызываемые из другой книги процедуры Sub, перечисленные ниже.
В стандартном модуле «Module1»:
1 2 3 |
Sub Vyzov1() MsgBox "Запущена процедура в стандартном модуле!" End Sub |
В модуле листа «Лист1»:
1 2 3 |
Sub Vyzov2() MsgBox "Запущена процедура в модуле листа!" End Sub |
В модуле книги «ЭтаКнига»:
1 2 3 4 |
Sub Vyzov3(a As Variant, b As Variant) MsgBox "Запущена процедура в модуле книги!" _ & vbNewLine & "Сумма равна: " & a + b End Sub |
Для последовательного запуска этих подпрограмм можно вставить в любой модуль другой книги Excel следующую процедуру:
1 2 3 4 5 6 |
Sub ProverkaVyzova() Application.Run "Книга1.xlsm!Vyzov1" Application.Run "Книга1.xlsm!Module1.Vyzov1" Application.Run "Книга1.xlsm!Лист1.Vyzov2" Application.Run "Книга1.xlsm!ЭтаКнига.Vyzov3", 555, 445 End Sub |
Во второй строке кода пропущено имя стандартного модуля, так как имя подпрограммы оказалось уникальным, а в следующей строке этот же код продублирован, для примера, с именем модуля. В пятой строке — пример запуска процедуры Sub с двумя аргументами.
И еще раз напомню, что имя книги с пробелами заключается в одинарные кавычки (апострофы):
1 |
Application.Run "'Новая Книга 1.xlsm'!Процедура1" |
Если у вас есть процедуры, которые часто вызываются из других книг, поместите их в Личную книгу макросов, и они всегда будут доступны.
Заключение
В этой статье не рассмотрено добавление ссылок из одного проекта VBA на другой, которые позволяют работать с модулями и процедурами, находящимися в другом проекте так, как с находящимися в текущем. Причем книга, с которой установлена связь, может быть закрыта. Я предпочитаю работать с Личной книгой макросов, а при попытке, из любопытства, установить связь между двумя книгами, программа Excel, почему-то, отказала мне в этом и эксперименты закончились.
Если хотите поэкспериментировать со связанными книгами, откройте проект VBA, из которого надо установить связь с другой книгой, и выберите в главном меню «Tools» — «References…». В открывшемся окне «References — VBAProject» все открытые книги будут отображены одним словом — «VBAProject». Выделяйте по очереди строки с этим словом и внизу, в информационной рамке, смотрите, какой книге этот проект принадлежит. Поставьте галочку рядом с выбранным проектом и нажмите кнопку «OK». Если книга, с проектом которой устанавливается связь, закрыта, ее не будет в списке. В этом случае, нажмите на кнопку «Browse…», найдите, выбрав расширение, нужную книгу и откройте ее в проводнике. Связь будет установлена, и процедуры из связанных книг будут вызываться по имени с ключевым словом Call или без него, как будто они расположены в одной книге.
«Application.Run «Книга1.xlsm!ЭтаКнига.Vyzov3″, 555, 445» хотелось бы узнать про параметры в данном примере.
спасибо!
Здравствуйте, Михаил!
555 и 445 – это числовые значения аргументов (параметров) вызываемой процедуры
Sub Vyzov3(a As Variant, b As Variant)
:a = 555, b = 445.
Здравствуйте. Есть userform2 в ней вызывается userform3 В окне форме 3 отображаются значения переданные из формы 2, но при дальнейшем вычислении одна переменная упорно пустая, пропадает. Не пойму почему.
НО когда код переходит к исполнению form3:
ЕСТЬ ВСЕ кроме Familia??? это конечно не весь код , но не нашел нигде глобальных переменных Coment, Prostoy и тд, но они почему-то есть, а мною вставленную Label16 в форму 2 не видит в упор. Можете подсказать как что с этим делать. Может где-нибудь Familia объявить глобальной и пусть болтается в процессе исполнения всей программы. Пытался прописать global либо ругается, либо не видит. Что странно, если программа не завершилась , то не важно что куда и как передается, как только в переменную глобал что-то прилетело она должна быть заполнена, пока прога не закроется, я так это понимаю.
Здравствуйте, Виктор!
Попробуйте объявить переменную в начале стандартного модуля:
и обращаться к ней:
Tnx you, guys for information!!! Great job!!! Very useful!!! I learned something else!!!
Обсуждение закрыто.