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

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

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

    Вызов подпрограммы из кода другой процедуры Sub, расположенной в том же модуле или другом модуле одной рабочей книги (проекта VBA) осуществляется с помощью ключевого слова Call или без него по имени подпрограммы. Вызывающая процедура Sub может быть любой видимости, как Public, так и Private, а вызываемая, если расположена в том же модуле, может быть любой видимости, но если расположена в другом модуле, должна быть объявлена как Public.

    Синтаксис вызова подпрограмм в пределах одной книги

    [ Call ] ИмяПроцедуры [ (Аргументы) ]

    • Call — необязательное ключевое слово;
    • ИмяПроцедуры — обязательный компонент, имя вызываемой подпрограммы;
    • Аргументы — необязательный компонент, список аргументов вызываемой процедуры Sub, разделенных запятой.

    Вызов подпрограмм без аргументов в пределах одного модуля

    Скобки рядом с именами вызываемых подпрограмм без аргументов не ставятся:

    Вы можете скопировать приведенный код в свой модуль и посмотреть, запустив процедуру test1, как она последовательно запускает процедуры test2 и test3.

    Вызов подпрограмм с аргументами в пределах одного модуля

    При вызове процедур Sub с аргументами и ключевым словом Call, аргументы заключаются в скобки, без ключевого слова Call — аргументы не заключаются в скобки:

    Вы можете разместить этот код в своем модуле и протестировать его.

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

    Правила, касающиеся использования оператора Call и заключения аргументов в скобки, верны и для вызова процедур Sub, находящихся в разных модулях. Единственным отличием является необходимость вместе с именем вызываемой подпрограммы указывать место ее расположения. Место расположения и имя подпрограммы разделяются точкой.

    Вызываемая подпрограмма расположена в Стандартном модуле

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

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

    • ЭтаКнига — так и пишется, указывает на текущую книгу в которой расположены вызывающая и вызываемая подпрограммы.
    • ИмяЛиста — уникальное имя листа, которое в проводнике проекта 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»:

    В модуле листа «Лист1»:

    В модуле книги «ЭтаКнига»:

    Для последовательного запуска этих подпрограмм можно вставить в любой модуль другой книги Excel следующую процедуру:

    Во второй строке кода пропущено имя стандартного модуля, так как имя подпрограммы оказалось уникальным, а в следующей строке этот же код продублирован, для примера, с именем модуля. В пятой строке — пример запуска процедуры Sub с двумя аргументами.

    И еще раз напомню, что имя книги с пробелами заключается в одинарные кавычки (апострофы):

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

    Заключение

    В этой статье не рассмотрено добавление ссылок из одного проекта VBA на другой, которые позволяют работать с модулями и процедурами, находящимися в другом проекте так, как с находящимися в текущем. Причем книга, с которой установлена связь, может быть закрыта. Я предпочитаю работать с Личной книгой макросов, а при попытке, из любопытства, установить связь между двумя книгами, программа Excel, почему-то, отказала мне в этом и эксперименты закончились.

    Если хотите поэкспериментировать со связанными книгами, откройте проект VBA, из которого надо установить связь с другой книгой, и выберите в главном меню «Tools» — «References…». В открывшемся окне «References — VBAProject» все открытые книги будут отображены одним словом — «VBAProject». Выделяйте по очереди строки с этим словом и внизу, в информационной рамке, смотрите, какой книге этот проект принадлежит. Поставьте галочку рядом с выбранным проектом и нажмите кнопку «OK». Если книга, с проектом которой устанавливается связь, закрыта, ее не будет в списке. В этом случае, нажмите на кнопку «Browse…», найдите, выбрав расширение, нужную книгу и откройте ее в проводнике. Связь будет установлена, и процедуры из связанных книг будут вызываться по имени с ключевым словом Call или без него, как будто они расположены в одной книге.

    Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.

    4 комментария для “VBA Excel. Вызов процедуры Sub из другой подпрограммы VBA”

    1. «Application.Run «Книга1.xlsm!ЭтаКнига.Vyzov3″, 555, 445» хотелось бы узнать про параметры в данном примере.
      спасибо!

      1. Евгений

        Здравствуйте, Михаил!
        555 и 445 – это числовые значения аргументов (параметров) вызываемой процедуры Sub Vyzov3(a As Variant, b As Variant):
        a = 555, b = 445.

    2. Здравствуйте. Есть userform2 в ней вызывается userform3 В окне форме 3 отображаются значения переданные из формы 2, но при дальнейшем вычислении одна переменная упорно пустая, пропадает. Не пойму почему.

      НО когда код переходит к исполнению form3:

      ЕСТЬ ВСЕ кроме Familia??? это конечно не весь код , но не нашел нигде глобальных переменных Coment, Prostoy и тд, но они почему-то есть, а мною вставленную Label16 в форму 2 не видит в упор. Можете подсказать как что с этим делать. Может где-нибудь Familia объявить глобальной и пусть болтается в процессе исполнения всей программы. Пытался прописать global либо ругается, либо не видит. Что странно, если программа не завершилась , то не важно что куда и как передается, как только в переменную глобал что-то прилетело она должна быть заполнена, пока прога не закроется, я так это понимаю.

    Добавить комментарий

    Ваш комментарий будет опубликован после прохождения обязательной модерации. Исходящие ссылки не допускаются. Время модерации составит от нескольких минут до нескольких часов в зависимости от времени суток и занятости модератора.