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

Файлы для скачивания:
ФайлОписаниеРазмер файла:Скачивания
Скачать этот файл (P_Macros_05.zip)Пример 14 Кб2013

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

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

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

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

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

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

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

Как соединить несколько макросов в один?

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

Sub Макрос3()
    Call Макрос1
    Call Макрос2
End Sub

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

kak-soedinit-neskolko-makrosov-v-odin_2.png

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

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

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

kak-soedinit-neskolko-makrosov-v-odin_3.png

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

Комментарии  

# Аффар 27.09.2017 17:16
А не проще просто вставлять сами тела макросов? Просто удалять субы. Чаще всего, если не используется end sub это работает, и никаких проблем с расположением макросов
Ответить | Ответить с цитатой | Цитировать
# Хвостов Сергей 27.09.2017 17:33
Можно конечно удалять Sub и вставлять код одного макроса в другой, но тут я вижу три проблемы:
1. Текст одного макроса получается очень большой и не всегда удобно его потом читать для исправления ошибок или внесения изменений.
2. CALL очень удобен если, например, записать универсальный макрос, а потом добавлять его (через CALL) в несколько других макросов - можно существенно сократить длину кода.
3. Если ваш макрос вставлен через CALL в несколько других макросов и в нем обнаружится ошибка или его просто нужно переделать, то править код нужно будет только в одном месте, а не "бегать" глазами по коду нескольких макросов.
Ответить | Ответить с цитатой | Цитировать
# ЕвгенийЕ 21.07.2017 11:28
А как можно использовать один и тот же макрос на разных листах? У меня есть макрос автоподстаноки даты при условии что соседняя ячейка заполнена. Работает на одном листе, но на 10 листах не хочет. Именя листов прописывал в макросах к каждому листу.
Ответить | Ответить с цитатой | Цитировать
# Хвостов Сергей 21.07.2017 11:39
Если Вы хотите, чтобы макрос срабатывал по условию на каждом листе рабочей книги надо создавать Модуль Класса. В комментарии тяжело рассказать. Напишите мне на почту я Вам примерчик скину.
Ответить | Ответить с цитатой | Цитировать
# Участник 20.07.2016 17:21
Это великолепно всё НО! При нажатии alt+F8 в списке макросов будут все 3. Задача, как сделать в списке 1 , но выполняющий 3 макроса. ( у меня уже много накопилось макросов и список не резиновый)
Ответить | Ответить с цитатой | Цитировать
# Хвостов Сергей 20.07.2016 17:37
Перед началом тех макросов, которые не должны отображаться в списке напишите Private. Чтобы получилось так: Private Sub Макрос1()
Ответить | Ответить с цитатой | Цитировать
# Участник 21.07.2016 14:45
Спасибо Сергей. Помогает.
По теме: До вас я по другому объединял макросы. Создал просто отдельный макрос вот такого вида:
Sub e()
' Глобальная правка файла e
Application.Run "книга1.xls!TRA NSLIT"
Application.Run "книга1.xls!BRA NDS"
Application.Run "PERSONAL1.XLSB !BRANDS"
Application.Run "книга1.xls!NUM BER"
Application.Run "книга1.xls!BRA ND"
Application.Run "книга1.xls!NAM E_NEW_1"
Application.Run "PERSONAL1.XLSB!NAME_NEW_1"
End Sub
Ответить | Ответить с цитатой | Цитировать
# Хвостов Сергей 21.07.2016 15:13
Да, так можно использовать макросы из других книг.
Ответить | Ответить с цитатой | Цитировать