Перейти к содержимому

VBA Excel. Вызов процедуры Sub из другой подпрограммы VBA

Вызов процедур Sub (подпрограмм) из кода других процедур, расположенных в одном или разных модулях, в одной или разных книгах Excel (проектах VBA), с аргументами или без. Примеры.

  1. Вызов процедур Sub в пределах одной книги
  2. Вызов процедур Sub из модулей разных книг
  3. Заключение

Вызов процедур 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 с неуникальным именем -
'возможен только один вариант:
ИмяМодуля.НеуникальноеИмяПроцедуры

Неуникальное имя процедуры возникает, когда создаются процедуры с одним именем в разных модулях. Если есть вероятность дублирования в дальнейшем имени подпрограммы и лишения ее уникальности, то лучше сразу вызывать ее с указанием имени стандартного модуля.

Вызываемая подпрограмма расположена в модуле книги, модуле листа, модуле формы

'В модуле книги:
ЭтаКнига.ИмяПроцедуры
'В модуле листа:
ИмяЛиста.ИмяПроцедуры
Worksheets("Имя ярлычка листа").ИмяПроцедуры
'В модуле формы:
ИмяФормы.ИмяПроцедуры
  • ЭтаКнига - так и пишется, указывает на текущую книгу в которой расположены вызывающая и вызываемая подпрограммы.
  • ИмяЛиста - уникальное имя листа, которое в проводнике проекта VBA указано без скобок (по умолчанию: Лист1, Лист2, Лист3 и т.д.).
  • Имя ярлычка листа - дублирующее имя листа, которое в проводнике проекта VBA указано в скобках.
  • ИмяФормы - уникальное имя пользовательской формы, отображаемое в проводнике проекта VBA.

Вызов процедур Sub из модулей разных книг

Если вызываемая подпрограмма расположена в другой книге, она должна быть объявлена как Public, а книга открыта. Запустить такую процедуру Sub можно с помощью метода Application.Run (протестировано в Excel 2016).

Синтаксис метода Application.Run

Application.Run "ИмяКниги!ИмяМодуля.ИмяПроцедуры", Арг1, Арг2, ..., Арг30

  1. ИмяКниги!ИмяМодуля.ИмяПроцедуры - обязательный компонент, полный адрес подпрограммы, заключен в двойные кавычки.
    • ИмяКниги - имя рабочей книги Excel с расширением, в которой находится вызываемая подпрограмма, если имя содержит пробелы, оно заключается в одинарные кавычки - апострофы ('Имя Книги').
    • ИмяМодуля - имя модуля для стандартного модуля (для уникальных имен вызываемых подпрограмм может не указываться), имя листа для модуля листа, словосочетание «ЭтаКнига» (без кавычек) для модуля книги.
    • ИмяПроцедуры - имя вызываемой процедуры Sub.
  2. Арг1, Арг2, ..., Арг30 - необязательные компоненты, аргументы вызываемой подпрограммы, максимальное количество которых ограничено 30 элементами.

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

Полный адрес вызываемой процедуры

Может показаться сложным составить полный адрес вызываемой подпрограммы, но на самом деле все очень просто - Excel уже сделал это за нас.

1. Откройте окно со списком макросов.

Список макросов во всех открытых книгах Excel
Список макросов во всех открытых книгах

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 или без него, как будто они расположены в одной книге.