Excel макрос запускает другой макрос

I will show you how to run a macro from another macro in Excel.  This means that you can run any macro when you need to from a completely separate macro.

This is actually very simple!

Use Call in VBA.

Here is the macro we want to call or run using another macro:

Sub Macro_2()

MsgBox "Hi!"

End Sub

And here is the macro that will call or run this macro:

Sub Macro_1()

'call the second macro

Call Macro_2

End Sub

It is as simple as that.  Put Call in front of the name of the macro that you want to run.

Here is a screenshot of these two macros in Excel:

Download the spreadsheet for this tutorial, from below or the side-bar of this page, and you can test out these macros.


Excel VBA Course

Excel VBA Course — From Beginner to Expert

200+ Video Lessons
50+ Hours of Instruction
200+ Excel Guides

Become a master of VBA and Macros in Excel and learn how to automate all of your tasks in Excel with this online course. (No VBA experience required.)

View Course

Similar Content on TeachExcel

Use Macros with UserForms

Tutorial: This tutorial explains how macros interact with UserForms.
This includes an explanation of…

Run a Macro when a User Does Something in the Worksheet in Excel

Tutorial: How to run a macro when a user does something in the worksheet, everything from selecting …

Stop a Macro from Running in Excel

Tutorial:

How to stop a macro from running after it has started.

This method uses the keyboard an…

Run a Macro When a Specific Cell Changes in Excel

Tutorial:
Run a macro in Excel when a specific cell is changed; this also covers when a cell within…

Login to a Website using a Macro

: Connect and login to a website using a macro in Excel.
This allows you to open a website a…

Subscribe for Weekly Tutorials

BONUS: subscribe now to download our Top Tutorials Ebook!

Excel VBA Course

Excel VBA Course — From Beginner to Expert

200+ Video Lessons

50+ Hours of Video

200+ Excel Guides

Become a master of VBA and Macros in Excel and learn how to automate all of your tasks in Excel with this online course. (No VBA experience required.)

View Course

Busine2009

Заблокирован

1

Запуск макроса из другого макроса

23.08.2009, 19:44. Показов 63614. Ответов 2


Студворк — интернет-сервис помощи студентам

Как в Word запустить из одного макроса другой?
RunMacro куда засунуть?



0



БурундукЪ

10027 / 2616 / 84

Регистрация: 17.02.2009

Сообщений: 10,364

25.08.2009, 09:42

2

Цитата
Сообщение от Busine2009
Посмотреть сообщение

Как в Word запустить из одного макроса другой?
RunMacro куда засунуть?

там не нужно RunMacro
макросы в Word это процедуры Subroutine

Visual Basic
1
call NameOfSub

причем засовывается эта команда в любое место откуда нужно вызвать (в ВБ-коде)
если нужно в процу параметры передать, то

Visual Basic
1
call NameOfSub par1,...parN



0



Busine2009

Заблокирован

25.08.2009, 19:59

 [ТС]

3

Ты намудрил, мой милый друг. Вот как запускается один макрос из другого:

Visual Basic
1
 Application.Run "Название макроса"



3



Содержание

  1. VBA Excel. Вызов процедуры Sub из другой подпрограммы VBA
  2. Вызов процедур Sub в пределах одной книги
  3. Синтаксис вызова подпрограмм в пределах одной книги
  4. Вызов подпрограмм без аргументов в пределах одного модуля
  5. Вызов подпрограмм с аргументами в пределах одного модуля
  6. Вызов подпрограмм из разных модулей одной книги
  7. Вызываемая подпрограмма расположена в Стандартном модуле
  8. Вызываемая подпрограмма расположена в модуле книги, модуле листа, модуле формы
  9. Вызов процедур Sub из модулей разных книг
  10. Синтаксис метода Application.Run
  11. Полный адрес вызываемой процедуры
  12. Пример вызова подпрограмм из другой книги
  13. Заключение
  14. Excel макрос запускает другой макрос
  15. Excel макрос запускает другой макрос
  16. Действие парсера « Запуск внешнего макроса »
  17. Параметры действия:
  18. Предназначение действия:
  19. Возвращаемое значение: отсутствует (текущее значение не изменяется)
  20. Параметр « Название (имя) макроса »
  21. Параметр « Параметр 1 »
  22. Параметр « Параметр 2 »
  23. Параметр « Параметр 3 »
  24. Примеры использования:

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.

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

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

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

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

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

Источник

Excel макрос запускает другой макрос

Модератор форума: китин, _Boroda_

Мир MS Excel » Вопросы и решения » Вопросы по VBA » Запуск макроса из личной книги макросов другим макросом (Макросы/Sub)

Запуск макроса из личной книги макросов другим макросом

lelya7 Дата: Понедельник, 21.10.2019, 14:07 | Сообщение № 1

Добрый день.
Есть 10 файлов хранятся в одной папке хочу написать макрос, чтобы он по очереди открывал файлы и выполнял 2 макроса из личной книги макросов.
Вот пример с одним файлом из 10ти, только макросы из личной книге не выполняются, подскажите в чем ошибка?

Sub Обновление()

‘ Обновление


Workbooks.Open Filename:=»E:ОТЧЕТЫОсновные2019октябрьEGR 2014-2019(10).xlsm»
Application.Run «PERSONAL.XLSB!замена»
Application.Run «PERSONAL.XLSB!месяц»
Sheets(«Общий»).Select
ActiveWorkbook.Save
ActiveWindow.Close
End Sub

Добрый день.
Есть 10 файлов хранятся в одной папке хочу написать макрос, чтобы он по очереди открывал файлы и выполнял 2 макроса из личной книги макросов.
Вот пример с одним файлом из 10ти, только макросы из личной книге не выполняются, подскажите в чем ошибка?

Sub Обновление()

‘ Обновление


Workbooks.Open Filename:=»E:ОТЧЕТЫОсновные2019октябрьEGR 2014-2019(10).xlsm»
Application.Run «PERSONAL.XLSB!замена»
Application.Run «PERSONAL.XLSB!месяц»
Sheets(«Общий»).Select
ActiveWorkbook.Save
ActiveWindow.Close
End Sub

Сообщение Добрый день.
Есть 10 файлов хранятся в одной папке хочу написать макрос, чтобы он по очереди открывал файлы и выполнял 2 макроса из личной книги макросов.
Вот пример с одним файлом из 10ти, только макросы из личной книге не выполняются, подскажите в чем ошибка?

Sub Обновление()

‘ Обновление

Источник

Excel макрос запускает другой макрос

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

Файлы для скачивания:

Файл Описание Размер файла: Скачивания
Пример 14 Кб 1825

Итак, суть проблемы заключается в следующем — мы записали какой ни будь макрос который, например, копирует данные из одного диапазона в другой, создали для этого макроса кнопку на рабочем листе и привязали к ней данный макрос. Потом нам понадобилось записать еще один макрос, который должен, например, скопированным данным присваивать некий формат и нам необходимо, чтобы эти макросы выполнялись один за другим при нажатии все той же кнопки.

При попытке назначить второй макрос той же кнопке мы обнаруживаем, что этого сделать нельзя, одна кнопка — один макрос. Что делать? Перед нами вырисовывается вариант, удалить первый и второй макрос и записать один длинный, который и копирует, и присваивает, но мы понимаем, что чем длине макрос, тем выше вероятность совершить ошибку при записи и начать все заново, так можно и до ночи провозиться.

Поэтому я предлагаю следующее решение: записать несколько коротких макросов, свести их в одном и уже этот большой макрос присвоить нашей Конопке.

Сделать это очень просто. Записываем два макроса, как это сделать в статье «Как записать макрос не зная языка VBA?». Суть работы макросов будет заключаться в следующем:

  • Макрос1 — будет копировать данные из диапазона E2:E6 и вставлять их в диапазон G2:G6, как значения с сохранением форматов.
  • Макрос2 — будет выделять данные в диапазоне G2:G6 красным цветом и делать их «жирными».

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

Затем нажимаем сочетание клавиш Alt+F11 , откроется окно редактора VBA, и мы увидим код двух наших макросов, записанный друг под другом:

Встаем курсором после слов End Sub (второго макроса), и пишем следующий код:

Должно получиться так:

Если у вас записанные макросы оказались в разных модулях — это никак не влияет на их выполнение. Вставьте код «Макрос3» в любой из этих модулей или создайте 3-й модуль и вставьте код в него.

После чего закрываем редактор VBA, возвращаемся в нашу рабочую книгу, создаем кнопку на листе и назначаем ей «Макрос3″, как это сделать описано в статье «Как сделать кнопку для запуска своего макроса?»

После чего нажимаем кнопку и видим, что макросы выполняются последовательно:

Источник

Действие парсера « Запуск внешнего макроса »

Параметры действия:

Предназначение действия:

Выполняет запуск макроса с заданным именем из любой открытой книги Excel.

Первая строка макроса должна иметь следующий вид:
Function MacroName(ByRef txt$, ByRef Destination As Range, ParamArray args()) As String

Возвращаемое значение: отсутствует (текущее значение не изменяется)

Параметр « Название (имя) макроса »

Тип параметра: произвольное текстовое значение

Параметр « Параметр 1 »

Тип параметра: произвольное текстовое значение

Параметр « Параметр 2 »

Тип параметра: произвольное текстовое значение

Параметр « Параметр 3 »

Тип параметра: произвольное текстовое значение

Примеры использования:

Это действие позволяет расширить возможности парсера, — например, если требуется сложная обработка текстовых данных, или какая-то обработка таблицы (например, окраска ячеек)

Действие Параметр Значение
Запуск внешнего макроса Название MacroName
Параметр 1 test 1
Параметр 2 доп. параметр 2
Параметр 3

Сам макрос (в данном примере — с названием MacroName, название макроса может быть любым) должен располагаться в стандартном модуле любой запущенной надстройки.

ВАЖНО: Если макрос находится не в надстройке, а в открытом файле Excel (куда подставляются данные),
в настройках действия поставьте восклицательный знак (!) перед именем макроса:
вместо MacroName получится !MacroName

Если макрос находится в ДРУГОМ запущенном файле Excel (например, в файле test.xlsm), формат параметра Имя макроса будет таким: ‘test.xlsm’!MacroName

Внимание! Для корректного вызова макроса имя книги и листа не должно содержать кавычек и апострофов!

К написанию макроса (точнее, к его первой строке) предьявляются жесткие требования, — это должна быть функция, принимающая 3 параметра, и возвращающая текст (тип String):

Макрос (точнее, функция) принимает 3 параметра:

  • txt$ — текущее значение (из предыдущего действия)

передаётся ПО ЗНАЧЕНИЮ (ByVal), — следовательно, если изменить значение переменной txt в коде макроса,
это не окажет никакого влияния на текущее значение в действиях

  • Destination — ссылка на строку или ячейку, в которую производится вывод

(если выполняются действия ДО начала вывода на лист, то Destination = Nothing)

  • args() — массив из 4 элементов: args(0), args(1), args(2), args(3)

в args(0) записывается СЛОВАРЬ со всеми текущими переменными
например, чтобы получить название парсера, пишем res$ = args(0).item(««)
или если в действиях была сохранена переменная VarName, то res$ = args(0).item(«%VarName%»)
остальные 3 элемента: args(1), args(2), args(3) — доп.параметры из действия («Параметр 1, 2, 3»)

Функция может возвращать значение (текстовую строку).
Возвращённое значение используется в следующих действиях.

По-умолчанию результат функции равен пустой строке (в следующее по списку действие будет передано пустое значение).

Чтобы макрос не изменял текущее значение, добавьте в него строку кода

Можно также заменить текущее значение, для этого используйте код

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

Для этого используется вызов макроса SetMacroReturnPoint из надстройки, с одинм числовым параметром

Если параметр — положительное число (1 и выше) — будет выполнен безусловный переход на действие с этим индексом:

Если параметр — отрицательное число (-1, -2, -3, -9) — выполняется выход из набора действий или из парсера:

Еще пример (особого смысла не имеет — приведён для демонстрации возможностей взаимодействия макроса и парсера):

Источник

Adblock
detector

Макрос запускает другие макросы последовательно. Макросы работают с Excel таблицами. Нужно запускать макрос, если выполнение предыдущего завершено.

В текущем варианте:

Sub ОбновитьБазу()
    Application.Run "Открыть"
    Application.Run "Загрузка"
    Application.Run "Выгрузка"
    Application.Run "Закрыть"
End Sub

Некоторые макросы, разумеется, начинают работать раньше, чем завершаются предыдущие.

Из вариантов решения на ум приходят:

  • счетчик и его отслеживание
  • запуск по времени

Но я уверена, есть какое-то более правильное и красивое решение.

Kromster's user avatar

Kromster

13.5k12 золотых знаков42 серебряных знака72 бронзовых знака

задан 16 сен 2020 в 9:18

Анна Лебедева's user avatar

5

Application.Run — это не самый простой и широко используемый способ запускать макросы (программы, функции) в VBA. Не углубляясь в детали, для Вашего случая подойдут такие способы:

  • имя_программы (макроса) и без скобок перечисление аргументов через
    запятую
  • Call имя_программы и в скобках перечисление аргументов через
    запятую.

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

Sub TEST()
Dim wait_sec_1 As Integer, wait_sec_2 As Integer
    wait_sec_1 = 10
    wait_sec_2 = 5
    
    Macros1 wait_sec_1
    Macros2 wait_sec_2
    
    Call Macros1(wait_sec_1)
    Call Macros2(wait_sec_2)
    
End Sub


Sub Macros1(wait_sec_1 As Integer)
Dim i As Integer
    For i = 0 To wait_sec_1
        Application.Wait(Now + TimeValue("0:00:01")): DoEvents 'one second wait
    Next i
    Debug.Print "First Macros work end"
End Sub

Sub Macros2(wait_sec_2 As Integer)
Dim i As Integer
    For i = 0 To wait_sec_2
        Application.Wait(Now + TimeValue("0:00:01")): DoEvents 'one second wait
    Next i
    Debug.Print "Second Macros work end"
End Sub

ответ дан 26 сен 2020 в 12:31

Gregory's user avatar

2

ГЛАВНАЯ

ТРЕНИНГИ

   Быстрый старт
   Расширенный Excel
   Мастер Формул
   Прогнозирование
   Визуализация
   Макросы на VBA

КНИГИ

   Готовые решения
   Мастер Формул
   Скульптор данных

ВИДЕОУРОКИ

ПРИЕМЫ

   Бизнес-анализ
   Выпадающие списки
   Даты и время
   Диаграммы
   Диапазоны
   Дубликаты
   Защита данных
   Интернет, email
   Книги, листы
   Макросы
   Сводные таблицы
   Текст
   Форматирование
   Функции
   Всякое
PLEX

   Коротко
   Подробно
   Версии
   Вопрос-Ответ
   Скачать
   Купить

ПРОЕКТЫ

ОНЛАЙН-КУРСЫ

ФОРУМ

   Excel
   Работа
   PLEX

© Николай Павлов, Planetaexcel, 2006-2022
info@planetaexcel.ru


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

Техническая поддержка сайта

ООО «Планета Эксел»

ИНН 7735603520


ОГРН 1147746834949
        ИП Павлов Николай Владимирович
        ИНН 633015842586
        ОГРНИП 310633031600071 

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

Вызов подпрограммы из кода другой процедуры 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

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

Return to VBA Code Examples

This tutorial will demonstrate how to call a macro from another macro in VBA.

Call a Macro From a Macro

So you just recorded two macros, and you would like to run them as one macro, it’s pretty simple.

Assuming you have Macro1 and Macro2, put this code at the end of Macro1

Sub Macro1 ()
Call Macro2
End Sub

Now every time you run Macro1, Macro2 runs automatically. Macro1 will wait until Macro2 is finished before continuing to run.
To run the macros simultaneously use Application.Run method:

Application.Run

You can also use Application.Run to call a macro.

Sub Macro1 ()
Application.Run Macro2
End Sub

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro – A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!

alt text

Learn More!

<<Return to VBA Examples

Запуск макроса из другой книги

fairylive

Дата: Среда, 13.07.2016, 17:08 |
Сообщение № 1

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 122


Репутация:

4

±

Замечаний:
0% ±


Excel 2016

Полдня никак не могу победить проблему.
Есть макрос (назовём его макрос1) в книге1, который в какой-то момент должен открыть файл книга2 и вызвать в нём другой макрос (макрос2).
Файл открывается. В него запихиваются нужные значение. Затем должен выполниться макрос2.
[vba]

Код

Call Application.Run(«книга2.xls!макрос2»)

[/vba]
Макрос2 находится в модуле. Процедур в этом модуле хренова куча и других модулей в файле книга2 тоже. Но макрос2 запускает сначала процедуру которую я назначил Public.
Тем не менее высвечивается ошибка Run-Time erroor ‘1004’: Не удаётся выполнить макрос «Книга2.xls!макрос2». Возможно, этот макрос отсутствует в текущей книге либо все макросы отключены.

 

Ответить

_Boroda_

Дата: Среда, 13.07.2016, 17:18 |
Сообщение № 2

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

А так?
[vba]

Код

Sub Макрос1()
    Application.Run («Книга111.xlsm!Module1.tt»)
End Sub

[/vba]
и так
[vba]

Код

Call Application.Run(«Книга111.xlsm!Module1.tt»)

[/vba]
и так
[vba]

Код

Run(«Книга111.xlsm!Module1.tt»)

[/vba]


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

fairylive

Дата: Среда, 13.07.2016, 17:34 |
Сообщение № 3

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 122


Репутация:

4

±

Замечаний:
0% ±


Excel 2016

_Boroda_, Сдвинулся с мёртвой точки так:
[vba]

Код

Call Application.Run(макрос2)

[/vba]
Сработало видимо потому что файл книга2 уже открыт.

Но теперь другая проблема. Этот макрос2 не отрабатывает как надо. Хотя если нажимать кнопку на котором висит этот макрос то файл обрабатывается с теми новыми данными из файла книга1.

Расширение файла книга2 XLS это старый файл экселя с макросами.

Сообщение отредактировал fairyliveСреда, 13.07.2016, 17:34

 

Ответить

_Boroda_

Дата: Среда, 13.07.2016, 17:55 |
Сообщение № 4

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Сдвинулся с мёртвой точки так:

Неправильно сдвинулись. Макросов «макрос2» может быть много — в разных книгах и даже в разных модулях одной книги. Нужно указывать книгу и модуль.
Кстати, у Вас в текущей книге случайно нет ли макроса с именем «макрос2»?
И еще — гнетут меня смутные сомнения, что в том макросе «макрос2», который нужен, на прописана книга, в которой тот должен работать (типа имя книги, ThisWorkbook или ActiveWorkbook). Возможно, лист тоже не прописан. Тогда макрос будет отрабатывать на текущем листе текущей книги, а не там, где Вам нужно


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

fairylive

Дата: Среда, 13.07.2016, 18:29 |
Сообщение № 5

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 122


Репутация:

4

±

Замечаний:
0% ±


Excel 2016

Макрос2 имеет уникальное имя. Повториться не может. Это я его здесь на форуме так обозвал для наглядности. Вообще он в той книге Книга2 имеет имя на русском языке. Может дело в этом?

По поводу активации и thisbook. Вот так это выглядит в моём макросе Макрос1(имя тоже другое уникальное)

[vba]

Код

With Workbooks(«книга2.xls»).Worksheets(«лист3»)
    .Activate
    Call Application.Run(макрос2)
    Application.Wait Time:=Now + TimeSerial(0, 0, 1)
    End With

[/vba]

UPD. Подправил Книга1 на Книга2.

Сообщение отредактировал fairyliveСреда, 13.07.2016, 21:03

 

Ответить

_Boroda_

Дата: Среда, 13.07.2016, 19:41 |
Сообщение № 6

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Причем здесь Ваш макрос1? Я про Макрос 2 Вам говорю

в том макросе «макрос2», который нужен

И вообще — давайте не будем без кода макроса в угадайку играть?


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

RAN

Дата: Среда, 13.07.2016, 20:16 |
Сообщение № 7

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

И вообще — давайте не будем без кода макроса в угадайку играть?

Незачем было и начинать. B)


Быть или не быть, вот в чем загвоздка!

 

Ответить

fairylive

Дата: Среда, 13.07.2016, 21:02 |
Сообщение № 8

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 122


Репутация:

4

±

Замечаний:
0% ±


Excel 2016

Тот файл Книга2 написан не мой. Кода там несколько сотен страниц. Вникать как там что устроено нет ни возможности ни желания. Думаю что ни вам ни мне. Но он работает и это главное. Единственное что написан он очень давно. Когда ещё не было расширений XLSM. Сохранён он в формате XLS. И только в таком виде он может существовать. При попытке сохранить в другом формате (xlsm) макрос перестаёт работать.

Мне надо просто открывать этот файл, запихивать туда данные и запускать макрос на обработку этих данных. С первыми двумя пунктами проблем нет. А вот макрос почему-то не подцепляется.

Коды пока выложить не могу. Мой который я пишу ещё очень сыроват.

 

Ответить

Manyasha

Дата: Среда, 13.07.2016, 21:22 |
Сообщение № 9

Группа: Модераторы

Ранг: Старожил

Сообщений: 2198


Репутация:

898

±

Замечаний:
0% ±


Excel 2010, 2016

макрос почему-то не подцепляется

у меня работают все предложенные Александром варианты. Да и Ваш тоже работает.
Не работает, если в имени файла есть пробелы, тогда нужно так:
[vba]

Код

Application.Run «‘123 1.xls’!макрос2»  ‘с апострофами

[/vba]


ЯД: 410013299366744 WM: R193491431804

 

Ответить

fairylive

Дата: Среда, 13.07.2016, 21:35 |
Сообщение № 10

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 122


Репутация:

4

±

Замечаний:
0% ±


Excel 2016

Manyasha, так вот зачем эти апострофы))) Но всё же нет. Имя файла в одно слово.
Я в предыдущем сообщении возможно не верно выразился на счет того что макрос не подцепляется. По началу было сообщение с ошибкой что макрос не удаётся выполнить или найти. Потом это сообщение пропало и вроде бы как макрос запускается. На это указывает тот момент что в экселе в файле книга2 меняется лист (он менялся как раз после выполнения макроса2). Но лист пустой. Нет результата сейчас.

 

Ответить

RAN

Дата: Среда, 13.07.2016, 21:44 |
Сообщение № 11

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Элементарная проверка
[vba]

Код

Sub Макрос2()
    msgbox «макрос2 запущен»
……………
    msgbox «макрос2 отработал»
End Sub

[/vba]


Быть или не быть, вот в чем загвоздка!

 

Ответить

fairylive

Дата: Среда, 13.07.2016, 22:24 |
Сообщение № 12

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 122


Репутация:

4

±

Замечаний:
0% ±


Excel 2016

Вот файлы с кодами. Проблема таже что была и в первом сообщении. Макрос не запускается или не находится. Ниже мой код из файла подцеп раскроя:
[vba]

Код

Sub podcep()

Dim a As Double
Dim b As Double
Dim raskroy_bk As Workbook
Dim pathfile As String

pathfile = ThisWorkbook.Path & «»

a = 890
b = 130

Set raskroy_bk = Workbooks.Open(pathfile & «раскрой.xls»)

With Workbooks(«раскрой.xls»).Worksheets(«Разблюдовка»)
.Activate
.Range(«C4»).Value = a
.Range(«D4»).Value = b

Call Application.Run(«‘раскрой.xls’!АвтоРаскрой»)

End With

End Sub

[/vba]

Ссылка на второй файл в облаке https://cloud.mail.ru/public/8BZd/6GKqNwDPa

PS файлы надо распаковать в одну папку.

К сообщению приложен файл:

0145117.xlsm
(16.1 Kb)

Сообщение отредактировал fairyliveСреда, 13.07.2016, 22:28

 

Ответить

RAN

Дата: Среда, 13.07.2016, 23:05 |
Сообщение № 13

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

[vba]

Код

Call Application.Run(«‘раскрой.xls’!АвтоРаскрой.АвтоРаскрой»)

[/vba]
Запудрили бедному VBA мозги, он и чешет репу, что ему искать, то-ли модуль, то-ли процедуру. ;)


Быть или не быть, вот в чем загвоздка!

 

Ответить

fairylive

Дата: Четверг, 14.07.2016, 13:27 |
Сообщение № 14

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 122


Репутация:

4

±

Замечаний:
0% ±


Excel 2016

RAN, спасибо! Всё заработало. Я думал над тем что надо указать имя модуля. Но оно совпадало с именем процедуры…

 

Ответить

_Boroda_

Дата: Четверг, 14.07.2016, 14:03 |
Сообщение № 15

Группа: Модераторы

Ранг: Местный житель

Сообщений: 16618


Репутация:

6465

±

Замечаний:
0% ±


2003; 2007; 2010; 2013 RUS

Я думал над тем что надо указать имя модуля

Не, ну нормально? Я Вам разве не об этом с самого начала писал? Во втором посте кодом

Application.Run («Книга111.xlsm!Module1.tt»)

В четвертом посте словами

Нужно указывать книгу и модуль


Скажи мне, кудесник, любимец ба’гов…
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995

 

Ответить

fairylive

Дата: Четверг, 14.07.2016, 17:21 |
Сообщение № 16

Группа: Проверенные

Ранг: Форумчанин

Сообщений: 122


Репутация:

4

±

Замечаний:
0% ±


Excel 2016

_Boroda_, виноват-с, невнимательность моя. Теперь вижу что tt это имя процедуры в модуле module1. До этого думал может это какое-то расширение модуля внутри файла xlsx…

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Excel макрос заполнить ячейку
  • Excel макрос заполнить строку
  • Excel макрос заполнить столбец
  • Excel макрос заполнение ячеек с условием
  • Excel макрос заполнение данных