Запуск макроса из другой книги 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 нельзя отменить, поэтому проверьте код в пустой книге или копии существующей книги. Если код не работает, вы можете закрыть книгу без сохранения изменений.

    org/ItemList»>

  1. Откройте вкладку Разработчик и щелкните элемент Visual Basic.

  2. В обозревателе VBA Project слева разверните папку VBA Project книги, а затем дважды щелкните модуль ThisWorkbook. Если вы не видите обозреватель Project, перейдите в > Project проводникаили нажмите CTRL+R.

  3. В окне модуля, которое открывается справа, вставьте следующий код:


    
    Private Sub Workbook_Open()
    
    ' Put your code here
    
    End Sub

  4. org/ListItem»>

    В конце и подмножите записи в процедуру Sub.


    Закройте редактор Visual Basic (вам не нужно ничего сохранять).

  5. Сохраните книгу как книгу Excel Macro-Enabled (XLSM)и закроем ее.

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

Прежде чем начать, убедитесь, что на ленте доступна вкладка Разработчик. Для этого:

  1. В меню выберите пункт Параметры Excel >… >ленты & панели инструментов.

  2. org/ListItem»>

    В категории Настройка ленты в списке Основные вкладки выберите вариант Разработчик.

  3. Нажмите кнопку Сохранить.

Чтобы использовать пример ниже, откройте новую книгу.

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

  1. Откройте вкладку Разработчик и щелкните элемент Visual Basic.

  2. org/ListItem»>

    В обозревателе VBA Project слева разверните папку VBA Project книги, а затем дважды щелкните модуль ThisWorkbook.

  3. В окне модуля, которое открывается справа, вставьте следующий код:


    
    Private Sub Workbook_Open()
    
    ' Put your code here
    
    End Sub

  4. В конце и подмножите записи в процедуру Sub.


    Закройте редактор Visual Basic (вам не нужно ничего сохранять).

  5. org/ListItem»>

    Сохраните книгу как книгу Excel Macro-Enabled (XLSM)и закроем ее.

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




Вы всегда можете задать вопрос специалисту Excel Tech Community или попросить помощи в сообществе Answers community.



Действие Запуск внешнего макроса | Инструкция по программе Parser

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

  • Название (имя) макроса
  • Параметр 1
  • Параметр 2
  • Параметр 3

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

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

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

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

 


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

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

 

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

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

 

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

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

 

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

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

 

 

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

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

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

 

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

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

Если макрос находится в ДРУГОМ запущенном файле 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 параметра:

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

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

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

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

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

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


 

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

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

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

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 со встроенным парсером (парсер использует макрос)70.5 КБ

Скопировать модуль макроса в другую книгу

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.

Копирование модуля из одной книги в другую

  1. Откройте книгу, содержащую макрос, который вы хотите скопировать, и книгу, в которую вы хотите его скопировать.

  2. На вкладке Developer щелкните Visual Basic , чтобы открыть редактор Visual Basic .

  3. В редакторе Visual Basic в меню View щелкните Project Explorer или нажмите CTRL+R .

  4. На панели Project Explorer перетащите модуль, содержащий макрос, который вы хотите скопировать, в рабочую книгу назначения. В данном случае мы копируем Module1 из Book2.xlsm в Book1.xlsm.

  1. Module1 скопирован из Book2.xlsm

  2. Копия 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 по-разному, поэтому невозможно написать пост, который удовлетворит все потребности. Потратив время на то, чтобы понять методы и принципы, изложенные в этом посте (и в других местах на этом сайте), вы сможете адаптировать его к своим потребностям.

Но если вы все еще испытываете трудности, вам следует:

  1. Почитайте другие блоги или посмотрите видео на YouTube по той же теме. Вы получите гораздо больше пользы, открыв для себя собственные решения.
  2. Спросите «Excel Ninja» в вашем офисе. Удивительно, какие вещи знают другие люди.