Запуск макроса из другой книги vba: Автоматический запуск макроса при открытии книги
Содержание
Автоматический запуск макроса при открытии книги
Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel 2021 Excel 2021 для Mac Excel 2019 Excel 2019 для Mac Excel 2016 Excel 2016 для Mac Excel 2013 Excel 2010 Excel 2007 Еще…Меньше
Может потребоваться, чтобы макрос, записанный вами, запускался автоматически при запуске определенной книги. В следующей процедуре используется пример, чтобы показать, как это работает. Кроме того, может потребоваться автоматически запускатьмакрос при Excel запуска .
Прежде чем начать, убедитесь, что на ленте доступна вкладка Разработчик. Дополнительные сведения см. в статье Отображение вкладки «Разработчик».
Чтобы использовать пример ниже, откройте новую книгу.
Важно: Код VBA нельзя отменить, поэтому проверьте код в пустой книге или копии существующей книги. Если код не работает, вы можете закрыть книгу без сохранения изменений.
Откройте вкладку Разработчик и щелкните элемент Visual Basic.
В обозревателе VBA Project слева разверните папку VBA Project книги, а затем дважды щелкните модуль ThisWorkbook. Если вы не видите обозреватель Project, перейдите в > Project проводникаили нажмите CTRL+R.
В окне модуля, которое открывается справа, вставьте следующий код:
Private Sub Workbook_Open() ' Put your code here End Sub
org/ListItem»>
В конце и подмножите записи в процедуру Sub.
Закройте редактор Visual Basic (вам не нужно ничего сохранять).
Сохраните книгу как книгу Excel Macro-Enabled (XLSM)и закроем ее.
При следующем запуске книги код, добавленный в Workbook_Open, будет работать автоматически.
Прежде чем начать, убедитесь, что на ленте доступна вкладка Разработчик. Для этого:
-
В меню выберите пункт Параметры Excel >… >ленты & панели инструментов.
-
Нажмите кнопку Сохранить.
org/ListItem»>
В категории Настройка ленты в списке Основные вкладки выберите вариант Разработчик.
Чтобы использовать пример ниже, откройте новую книгу.
Важно: Код VBA нельзя отменить, поэтому проверьте код в пустой книге или копии существующей книги. Если код не работает, вы можете закрыть книгу без сохранения изменений.
-
Откройте вкладку Разработчик и щелкните элемент Visual Basic.
-
В окне модуля, которое открывается справа, вставьте следующий код:
Private Sub Workbook_Open() ' Put your code here End Sub
-
В конце и подмножите записи в процедуру Sub.
Закройте редактор Visual Basic (вам не нужно ничего сохранять).
org/ListItem»>
В обозревателе VBA Project слева разверните папку VBA Project книги, а затем дважды щелкните модуль ThisWorkbook.
org/ListItem»>
Сохраните книгу как книгу Excel Macro-Enabled (XLSM)и закроем ее.
При следующем запуске книги код, добавленный в Workbook_Open, будет работать автоматически.
Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.
Параметры действия:
Предназначение действия:Выполняет запуск макроса с заданным именем из любой открытой книги Excel. Первая строка макроса должна иметь следующий вид: Возвращаемое значение: отсутствует (текущее значение не изменяется)
Параметр «Название (имя) макроса»Тип параметра: произвольное текстовое значение
Параметр «Параметр 1»Тип параметра: произвольное текстовое значение
Параметр «Параметр 2»Тип параметра: произвольное текстовое значение
Параметр «Параметр 3»Тип параметра: произвольное текстовое значение
Примеры использования:Это действие позволяет расширить возможности парсера, — например, если требуется сложная обработка текстовых данных, или какая-то обработка таблицы (например, окраска ячеек)
Сам макрос (в данном примере — с названием MacroName, название макроса может быть любым) должен располагаться в стандартном модуле любой запущенной надстройки. ВАЖНО: Если макрос находится не в надстройке, а в открытом файле Excel (куда подставляются данные), Если макрос находится в ДРУГОМ запущенном файле Excel (например, в файле test.xlsm), формат параметра Имя макроса будет таким: ‘test.xlsm’!MacroName Внимание! Для корректного вызова макроса имя книги и листа не должно содержать кавычек и апострофов! К написанию макроса (точнее, к его первой строке) предьявляются жесткие требования, — это должна быть функция, принимающая 3 параметра, и возвращающая текст (тип String): Function MacroName(ByVal txt$, ByRef Destination As Range, ParamArray args()) As String On Error Resume Next ' рекомендуемая строка, - чтобы ошибка вашего макроса не вызвала вылет парсера ' здесь код вашего макроса End Function
Макрос (точнее, функция) принимает 3 параметра:
передаётся ПО ЗНАЧЕНИЮ (ByVal), — следовательно, если изменить значение переменной txt в коде макроса,
(если выполняются действия ДО начала вывода на лист, то Destination = Nothing)
в args(0) записывается СЛОВАРЬ со всеми текущими переменными
Функция может возвращать значение (текстовую строку). По-умолчанию результат функции равен пустой строке (в следующее по списку действие будет передано пустое значение). Чтобы макрос не изменял текущее значение, добавьте в него строку кода MacroName = txt ' возвращаем из функции исходное значение Можно также заменить текущее значение, для этого используйте код MacroName = "Новое значение, которое будет передано в следующее действие"
Можно задать переход на другое действие, или останов парсера, после выполнения макроса. Для этого используется вызов макроса SetMacroReturnPoint из надстройки, с одинм числовым параметром Если параметр — положительное число (1 и выше) — будет выполнен безусловный переход на действие с этим индексом: Application. Run "SetMacroReturnPoint", "4" ' принудительный переход на действие номер 4 (в текущем списке действий) Если параметр — отрицательное число (-1, -2, -3, -9) — выполняется выход из набора действий или из парсера: Application.Run "SetMacroReturnPoint", "-9" ' выход из парсера (полный останов всех действий)
Пример макроса: Function MacroName1(ByVal txt$, ByRef Destination As Range, ParamArray args()) As String On Error Resume Next If txt$ Like "*нет в наличии*" Then ' проверяем текст из предыдущего действия на выполнение условия MacroName1 = "нет" ' меняем текущее значение Destination.Interior.Color = vbRed ' окрашиваем ячейку в красный цвет Else MacroName1 = "есть" ' меняем текущее значение Destination.EntireRow.Range("b1:f1").Interior.Color = vbGreen ' окрашиваем строку (столбцы b:f) в зеленый цвет End If End Function
Еще пример (особого смысла не имеет — приведён для демонстрации возможностей взаимодействия макроса и парсера): Function MacroName2(ByVal txt$, ByRef Destination As Range, ParamArray args()) As String On Error Resume Next Var_1$ = args(1) ' считываем 1-й параметр из настроек действия Var_2$ = args(2) ' считываем 2-й параметр из настроек действия Category$ = args(0). Item("%CategoryName%") ' берем значение переменной CategoryName из парсера column_1 = args(0).Item("{1}") ' берем значение встроенной переменной {1} - значение из первого столбца column_2 = Destination.EntireRow.Cells(2) ' берем значение из второго столбца текущей строки ' оба способа выше - обычно равнозначны, но работают только из действий по выводу в столбец (и общих действий для листа) If txt$ Like "*" & Var_1$ & "*" Then ' проверяем текст из предыдущего действия на вхождение параметра 1 Destination.EntireRow.Cells(3) = "ОК" ' заносим значение в третий столбец MacroName2 = txt$ ' возвращаем исходное значение Exit Function ' обычное завершение функции. если ниже есть действия - они продолжат выполняться End If If Val(column_1) > Val(column_2) Then ' сравниваем значения столбцов ' вывод информации в строку прогресс-бара Application.Run("RunningParser").PrInd1.Line3 = "Повторная попытка загрузки данных" MacroName2 = Category$ ' текущее значение для действий берем из переменной CategoryName из парсера ' принудительный переход к действию номер 4 в текущем списке действий Application. Run "SetMacroReturnPoint", 4 Exit Function ' после выхода из фукции (и возврата к действиям), выполнится переход на действие номер 4 End If If Not txt$ Like "*" & Category$ & "*" Then ' проверяем текст из предыдущего действия на наличие категории Destination.EntireRow.Delete ' удаляем последнюю выведенную строку MsgBox "Ошибка в работе парсера", vbCritical ' вывод сообщения ActiveWorkbook.Save ' сохранение текущего файла Excel ' принудительный останов парсера (если вызвать макрос SetMacroReturnPoint с параметром -9) Application.Run "SetMacroReturnPoint", -9: Exit Function End If MacroName2 = txt$ ' возвращаем исходное значение End Function
Пример макроса из прикреплённого файла: Function MyMacro(ByVal txt$, ByRef Destination As Range, ParamArray args()) As String On Error Resume Next ' меняя значение txt, мы не затрагиваем текущее текстовое значение в действиях txt = Split(txt, "/")(UBound(Split(txt, "/"))) MyMacro = "=""Программа №""&" & args(0). Item("{row}") & "-1&"" (" & txt & ")""" If txt = args(1) Then Destination.Interior.Color = vbGreen MyMacro = "самая продаваемая программа" End If If txt = args(2) Then Destination.EntireRow.Range("a1:c1").Interior.Color = vbRed MyMacro = "программа, которой вы сейчас пользуетесь" End If If txt = args(3) Then Destination.EntireRow.Delete ' эта строка нам не нужна - удаляем её End If Destination.EntireColumn.AutoFit ' автоподбор ширины столбца End Function
Вложения:
|
Скопировать модуль макроса в другую книгу
Excel для Microsoft 365 Excel для Microsoft 365 для Mac Excel 2021 Excel 2021 для Mac Excel 2019 Excel 2019 для Mac Excel 2016 Excel 2016 для Mac Excel 2013 Excel 2010 Excel 2007 Больше. ..Меньше
Если рабочая книга содержит макрос Visual Basic для приложений ( VBA ), который вы хотели бы использовать в другом месте, вы можете скопировать модуль, содержащий этот макрос, в другую открытую книгу, используя кнопку 9.0005 Редактор Visual Basic ( VBE ).
Макросы и инструменты VBA можно найти на вкладке Разработчик , которая по умолчанию скрыта, поэтому первым шагом будет ее включение.
Для Windows перейдите к Файл > Параметры > Настроить ленту .
Для Mac перейдите к Excel > Настройки… > Лента и панель инструментов .
org/ListItem»>
Затем в разделе Настройка ленты в разделе Основные вкладки установите флажок Разработчик .
Обзор макросов и VBA
Если вы не знакомы с макросами и VBA в целом, следующая информация может оказаться полезной.
Макрос — это действие или набор действий, которые можно использовать для автоматизации задач.
Вы можете записывать макросы с помощью команды Record Macro на вкладке Developer .
Макросы записаны на языке программирования VBA.
org/ListItem»>
Вы можете просматривать и редактировать свои макросы в редакторе Visual Basic, окне, которое открывается в Excel. Вот пример окна VBE для Windows:
Макросы с именами MakeCellGreen и SetRowHeight находятся в модуле с именем Module1 , который хранится в Book1.
Копирование модуля из одной книги в другую
Откройте книгу, содержащую макрос, который вы хотите скопировать, и книгу, в которую вы хотите его скопировать.
На вкладке Developer щелкните Visual Basic , чтобы открыть редактор Visual Basic .
В редакторе Visual Basic в меню View щелкните Project Explorer или нажмите CTRL+R .
На панели Project Explorer перетащите модуль, содержащий макрос, который вы хотите скопировать, в рабочую книгу назначения. В данном случае мы копируем Module1 из Book2.xlsm в Book1.xlsm.
Module1 скопирован из Book2.xlsm
Копия Module1 скопирована в Book1. xlsm
Нужна дополнительная помощь?
Вы всегда можете обратиться к эксперту в техническом сообществе Excel или получить поддержку в сообществе ответов.
Как запустить макрос из макроса (из другой книги)
В VBA есть несколько способов запустить макрос из макроса и даже запустить макрос из другой книги. На форумах эти методы взаимозаменяемы в зависимости от личных предпочтений комментатора. Это может привести к путанице для любого, кто пытается изучить VBA. В зависимости от метода запуска/вызова макроса синтаксис немного отличается.
В этом посте показаны эти распространенные методы запуска и макроса из макроса и способы их использования.
Содержание
Запуск макроса из макроса в той же книге
Существует 3 распространенных метода вызова макроса, содержащегося в одной книге.
- Использование только имени макроса
- Вызов макроса
- Запуск макроса
Эти 3 метода подробно описаны ниже.
Используйте имя макроса
В этом примере кода требуется только имя макроса.
Sub CallAnotherMacro() ИмяМакроса End Sub
При использовании этого метода с параметрами/аргументами первый аргумент следует за именем макроса, каждый последующий аргумент отделяется запятой.
Sub CallAnotherMacro() Dim arguments1 как строка Dim аргумент2 как целое число аргумент1 = "Пример текста" аргумент2 = 1 NameOfMacro аргумент1, аргумент2 End Sub
Вызов макроса
Использование оператора Call является моим предпочтительным методом. Его легко читать, потому что видно, что выполняется другой макрос.
Sub CallAnotherMacro() Call NameOfMacro End Sub
Параметры, используемые в этом методе, заключены в круглые скобки и разделены запятой.
Sub CallAnotherMacro() Dim arguments1 как строка Dim аргумент2 как целое число аргумент1 = "Пример текста" аргумент2 = 1 Вызов NameOfMacro(аргумент1, аргумент2) End Sub
Выполнить макрос
Команда Выполнить аналогична Вызов , но требует, чтобы имя макроса было в виде текстовой строки.
Sub CallAnotherMacro() Запустите "ИмяМакроса" End Sub
Чтобы использовать аргументы, за текстовой строкой следует запятая, каждый аргумент отделяется запятой.
Sub CallAnotherMacro() Dim arguments1 как строка Dim аргумент2 как целое число аргумент1 = "Пример текста" аргумент2 = 1 Запустите "NameOfMacro", аргумент1, аргумент2 End Sub
Поскольку имя макроса представляет собой текстовую строку, его можно рассматривать как переменную. Поэтому код может запускать разные макросы в зависимости от сценария. Это подробно описано в разделе ниже.
Запустить макрос на основе переменной
Можно запустить макрос на основе значения строковой переменной. Это позволяет запускать другой макрос в зависимости от значения строковой переменной в этой точке.
В приведенном ниже примере:
- NameOfMacro — имя подпроцедуры (такое же, как в примерах выше)
- MacroName — строковая переменная, содержащая текст «NameOfMacro»
Sub CallAnotherMacro() Dim MacroName как строка ИмяМакроса = "ИмяМакроса" Запустить имя_макроса Конец суб
В приведенном выше коде за командой «Выполнить» следует не текстовая строка, а переменная. Функция Run работает, потому что переменная представляет собой текстовую строку.
Чтобы использовать параметры с помощью этого метода, используйте следующий синтаксис:
Sub CallAnotherMacro() Dim MacroName как строка Dim arguments1 как строка Dim аргумент2 как целое число ИмяМакроса = "ИмяМакроса" аргумент1 = "Пример текста" аргумент2 = 1 Запустить имя_макроса, аргумент1, аргумент2 End Sub
Запуск макроса, содержащегося в другой книге
Примечание. Рабочая книга, содержащая макрос, должна быть открыта. Если вам нужно сначала открыть книгу, ознакомьтесь с кодом в этом посте.
Чтобы запустить макрос, содержащийся в другой книге, используйте команду Application.Run следующим образом:
Sub CallAnotherMacro() Application.Run "'Другая рабочая книга.xlsm'!NameOfMacro" End Sub
Одинарные кавычки вокруг имени книги необходимы, если имя книги содержит пробел.
Если пробела нет, одинарные кавычки необязательны. Код по-прежнему будет работать правильно, если они включены. Я предпочитаю использовать их для согласованности и снижения риска, если код был изменен.
Sub CallAnotherMacro() Application.Run "AnotherWorkbook.xlsm!NameOfMacro" End Sub
Запуск макроса, содержащегося в другой рабочей книге, на основе переменной
Используя переменную текстовой строки, мы можем построить имя рабочей книги и макроса. Это позволяет нам вызывать любой макрос из любой открытой книги.
Sub CallAnotherMacro() Dim WorkbookName как строка Dim MacroName как строка WorkbookName = "AnotherWorkbook.xlsm" ИмяМакроса = "ИмяМакроса" Запустите "'" & WorkbookName & "'!" & Имя макроса End Sub
При использовании параметров их также можно включить следующим образом:
Sub CallAnotherMacro() Dim WorkbookName как строка Dim MacroName как строка Dim arguments1 как строка Dim аргумент2 как целое число WorkbookName = "AnotherWorkbook.xlsm" ИмяМакроса = "ИмяМакроса" аргумент1 = "Пример текста" аргумент2 = 1 Запустите "'" & WorkbookName & "'!" & Имя макроса, аргумент1, аргумент2 Конец суб
Вызов и запуск макросов из модулей Workbook, Worksheet или UserForm
Во всех приведенных выше примерах предполагается, что код VBA хранится в стандартном модуле. Но код VBA также может храниться в модулях Workbook, Worksheet и UserForm. Для вызова макроса из одного из этих типов модулей требуется небольшая настройка; имя объекта должно предшествовать имени макроса.
Используя тот же метод Run , что и выше, для запуска макроса, содержащегося в модуле рабочей книги, код будет следующим:
Sub CallAnotherMacro() Запустите "ThisWorkbook.NameOfMacro" End Sub
Обратите внимание, что NameOfMacro теперь стал ThisWorkbook.NameOfMacro .
Если код VBA содержится в модуле рабочей книги другой рабочей книги, код будет скорректирован следующим образом:
Sub CallAnotherMacro() Запустите "'AnotherWorkbook.xlsm'!ThisWorkbook.NameOfMacro" End Sub
Используйте кодовое имя объекта для ссылки на модуль рабочего листа или модуль пользовательской формы.
Заключение
Есть много способов запустить макрос из макроса. Разнообразие методов может вызвать путаницу, поскольку разные пользователи предпочитают разные методы. Надеюсь, этот пост дал вам знания, чтобы сделать это для себя.
Похожие сообщения:
- Автоматический запуск макроса при открытии книги
- Частные и общедоступные субтитры, переменные и функции в VBA
- Полезные коды VBA для Excel (30 примеров макросов + бесплатная электронная книга)
Об авторе
Привет, меня зовут Марк, и я запускаю Excel Off The Grid.
Мои родители рассказали мне, что в возрасте 7 лет я объявил, что стану квалифицированным бухгалтером. Либо я был экстрасенсом, либо у меня не было воображения, как это и произошло. Однако мое путешествие по-настоящему началось только в 35 лет.
В 2015 году я устроился на новую работу, на которой регулярно работал после 22:00. В результате я редко видел своих детей в течение недели. Итак, я начал искать секреты автоматизации Excel. Я обнаружил, что, создав небольшое количество простых инструментов, я могу комбинировать их по-разному, чтобы автоматизировать почти все свои обычные задачи. Это означало, что я мог работать меньше часов (и мне повысили зарплату!). Сегодня я обучаю этим техникам других специалистов в рамках нашей программы обучения, чтобы они тоже могли проводить меньше времени на работе (и больше времени со своими детьми и любимыми делами).
Вам нужна помощь в адаптации этого поста к вашим потребностям?
Я предполагаю, что примеры в этом посте не совсем соответствуют вашей ситуации. Мы все используем Excel по-разному, поэтому невозможно написать пост, который удовлетворит все потребности. Потратив время на то, чтобы понять методы и принципы, изложенные в этом посте (и в других местах на этом сайте), вы сможете адаптировать его к своим потребностям.
Но если вы все еще испытываете трудности, вам следует:
- Почитайте другие блоги или посмотрите видео на YouTube по той же теме. Вы получите гораздо больше пользы, открыв для себя собственные решения.
- Спросите «Excel Ninja» в вашем офисе. Удивительно, какие вещи знают другие люди.