Вызов процедур Sub (подпрограмм) из кода других процедур, расположенных в одном или разных модулях, в одной или разных книгах Excel (проектах VBA), с аргументами или без. Примеры.
Вызов процедур Sub в пределах одной книги
Вызов подпрограммы из кода другой процедуры Sub, расположенной в том же модуле или другом модуле одной рабочей книги (проекта VBA) осуществляется с помощью ключевого слова Call или без него по имени подпрограммы. Вызывающая процедура Sub может быть любой видимости, как Public, так и Private, а вызываемая, если расположена в том же модуле, может быть любой видимости, но если расположена в другом модуле, должна быть объявлена как Public.
Синтаксис вызова подпрограмм в пределах одной книги
[ Call ] ИмяПроцедуры [ (Аргументы) ]
- Call - необязательное ключевое слово;
- ИмяПроцедуры - обязательный компонент, имя вызываемой подпрограммы;
- Аргументы - необязательный компонент, список аргументов вызываемой процедуры Sub, разделенных запятой.
Вызов подпрограмм без аргументов в пределах одного модуля
Скобки рядом с именами вызываемых подпрограмм без аргументов не ставятся:
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 - аргументы не заключаются в скобки:
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, находящихся в разных модулях. Единственным отличием является необходимость вместе с именем вызываемой подпрограммы указывать место ее расположения. Место расположения и имя подпрограммы разделяются точкой.
Вызываемая подпрограмма расположена в Стандартном модуле
'Процедура Sub с уникальным именем - 'возможны два варианта: УникальноеИмяПроцедуры ИмяМодуля.УникальноеИмяПроцедуры 'Процедура Sub с неуникальным именем - 'возможен только один вариант: ИмяМодуля.НеуникальноеИмяПроцедуры
- ИмяМодуля - уникальное имя стандартного модуля, отображаемое в проводнике проекта VBA.
Неуникальное имя процедуры возникает, когда создаются процедуры с одним именем в разных модулях. Если есть вероятность дублирования в дальнейшем имени подпрограммы и лишения ее уникальности, то лучше сразу вызывать ее с указанием имени стандартного модуля.
Вызываемая подпрограмма расположена в модуле книги, модуле листа, модуле формы
'В модуле книги: ЭтаКнига.ИмяПроцедуры 'В модуле листа: ИмяЛиста.ИмяПроцедуры 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»:
Sub Vyzov1() MsgBox "Запущена процедура в стандартном модуле!" End Sub
В модуле листа «Лист1»:
Sub Vyzov2() MsgBox "Запущена процедура в модуле листа!" End Sub
В модуле книги «ЭтаКнига»:
Sub Vyzov3(a As Variant, b As Variant) MsgBox "Запущена процедура в модуле книги!" _ & vbNewLine & "Сумма равна: " & a + b End Sub
Для последовательного запуска этих подпрограмм можно вставить в любой модуль другой книги Excel следующую процедуру:
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 с двумя аргументами.
И еще раз напомню, что имя книги с пробелами заключается в одинарные кавычки (апострофы):
Application.Run "'Новая Книга 1.xlsm'!Процедура1"
Если у вас есть процедуры, которые часто вызываются из других книг, поместите их в Личную книгу макросов, и они всегда будут доступны.
Заключение
В этой статье не рассмотрено добавление ссылок из одного проекта VBA на другой, которые позволяют работать с модулями и процедурами, находящимися в другом проекте так, как с находящимися в текущем. Причем книга, с которой установлена связь, может быть закрыта. Я предпочитаю работать с Личной книгой макросов, а при попытке, из любопытства, установить связь между двумя книгами, программа Excel, почему-то, отказала мне в этом и эксперименты закончились.
Если хотите поэкспериментировать со связанными книгами, откройте проект VBA, из которого надо установить связь с другой книгой, и выберите в главном меню «Tools» - «References...». В открывшемся окне «References - VBAProject» все открытые книги будут отображены одним словом - «VBAProject». Выделяйте по очереди строки с этим словом и внизу, в информационной рамке, смотрите, какой книге этот проект принадлежит. Поставьте галочку рядом с выбранным проектом и нажмите кнопку «OK». Если книга, с проектом которой устанавливается связь, закрыта, ее не будет в списке. В этом случае, нажмите на кнопку «Browse...», найдите, выбрав расширение, нужную книгу и откройте ее в проводнике. Связь будет установлена, и процедуры из связанных книг будут вызываться по имени с ключевым словом Call или без него, как будто они расположены в одной книге.