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 Еще…Меньше

Если книга содержит макрос Visual Basic для приложений(VBA),который вы хотите использовать в другом месте, вы можете скопировать модуль, содержащий этот макрос, в другую открытую книгу с помощью редактора Visual Basic(VBE).

Макросы и средства VBA находятся на вкладке Разработчик, которая по умолчанию скрыта, поэтому сначала нужно включить ее.

  • Чтобы Windows, перейдите в меню Параметры > >Настроить ленту.

  • org/ListItem»>

    Для Macперейдите на Excel > параметры… >ленты & панели инструментов.

  • Затем в разделе Настройка ленты в разделе Основные вкладкиубедитесь в том, что в разделе Разработчик.

Общие сведения о макросах и VBA


Если вы не знакомы с макросами и VBA в целом, вам могут пригодиться следующие сведения:

  • Макрос — это действие или набор действий, которые можно использовать для автоматизации задач.

  • Макрос можно записать с помощью команды Запись макроса на вкладке Разработчик.

  • Макрос записуется на языке программирования VBA.

  • Вы можете проверить и изменить макрос в редакторе Visual Basic, которое открывается Excel. Вот пример окна VBE для Windows:

Макрос с именами MakeCellGreen и SetRowHeight находится в модуле Module1,который хранится в книге Book1.


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


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

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

  3. В редакторе Visual Basic меню Вид выберите Project проводник или нажмите CTRL+R .

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

  1. org/ListItem»>

    Модуль1, скопирован из Book2.xlsm

  2. Копия модуля1, скопированная в Book1.xlsm

Дополнительные сведения


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


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

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

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

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

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

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

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

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

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

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

2.1.
Синтаксис метода Application.Run

2.2.
Полный адрес вызываемой процедуры

2.3.
Пример вызова подпрограмм из другой книги

3.
Заключение

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

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

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

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

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

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 — аргументы не заключаются в скобки:

1

2

3

4

5

6

7

8

9

10

11

12

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

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

1

2

3

4

5

6

7

‘Процедура Sub с уникальным именем —

‘возможны два варианта:

УникальноеИмяПроцедуры

ИмяМодуля.УникальноеИмяПроцедуры

‘Процедура Sub с неуникальным именем —

‘возможен только один вариант:

ИмяМодуля.НеуникальноеИмяПроцедуры

  • ИмяМодуля — уникальное имя стандартного модуля, отображаемое в проводнике проекта VBA.

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

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

1

2

3

4

5

6

7

‘В модуле книги:

ЭтаКнига. ИмяПроцедуры

‘В модуле листа:

ИмяЛиста.ИмяПроцедуры

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. Откройте окно со списком макросов.

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

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 следующую процедуру:

1

2

3

4

5

6

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

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

excel — запустить макрос из другой книги

Задавать вопрос

спросил

Изменено
4 года назад

Просмотрено
80 тысяч раз

У меня есть макрос в книге A, который вызывает макрос в книге B. Я хочу, чтобы макрос в книге B был запущен, а затем я хочу закрыть книгу B. Я продолжаю получать сообщение об ошибке, говорящее, что макрос не может быть найден, который я хочу запустить из рабочей книги B. Я в значительной степени новичок в этом, но я провел довольно тщательный поиск и не смог ничего придумать самостоятельно. Вот мой код целиком.

 Публичный вспомогательный отдел ввода()
Dim Cap как рабочая тетрадь
Dim Cap2 как строка
При ошибке Возобновить Далее
Set Cap = Workbooks("Исходный файл NGD для Net Budget Reporting. xlsx")
Cap2 = Cap.Name
При ошибке Перейти к 0
Dim wb как рабочая книга
Dim Cap1 как вариант
Application.ScreenUpdating = Ложь
Если кепка ничего, то
Cap1 = Application.GetOpenFilename("Файлы Excel (*.xl*)," & "*.xl*", 1)
    Если Cap1 = Ложь Тогда
    Выйти из подпрограммы
    Конец, если
Установите wb = Workbooks.Open (Cap1)
Cap2 = ActiveWorkbook.Имя
Еще
Книги(Cap2).Активировать
Конец, если
Таблицы("Сводка отдела").Активировать
Cells.Find(What:="Direct", after:=ActiveCell, LookIn:=xlFormulas, _
    LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
    MatchCase:=False, SearchFormat:=False).Смещение(1, 0).Выбрать
Диапазон (Выделение, Выбор. Конец (xlDown)). Выберите
Dim cRng As Range
Dim dRng As Range
Установить dRng = Выбор
Для каждого cRng в dRng
Если cRng.Interior.ThemeColor = xlThemeColorAccent3 Тогда
    Dim mCalc как строка
    Dim mSum как рабочая книга
    При ошибке Возобновить Далее
    Установить mSum = Workbooks("Мастер вычислений с макросом.xlsm")
    mРасч = mSum. Имя
    При ошибке Перейти к 0
    Application.ScreenUpdating = Ложь
    Если mSum ничто, то
        mSum1 = Application.GetOpenFilename("Excel Files.xl*),"& "*.xl*", 1)
    Если mSum1 = Ложь Тогда
        Выйти из подпрограммы
    Конец, если
        Установите wb1 = Workbooks.Open (mSum1)
        mCalc = ActiveWorkbook.Имя
    Еще
        Книги(mCalc).Активировать
    Конец, если
    cRng.Copy
    Книги(mCalc).Активировать
    Листы("Данные").Выбрать
    Диапазон("A5").Выбрать
    Selection.PasteSpecial Вставить:=xlPasteValues
    Листы("Отчет").Активировать
    Книги(mCalc).Application.Run("!SummarizeMaster")
    Листы("Отчет").Выбрать
    ActiveSheet.Копировать
    Ячейки.Выбрать
    Ячейки.Копировать
    Selection.PasteSpecial Вставить:=xlPasteValues
    ActiveWorkbook.SaveAs _
        Имя файла:=Application.ThisWorkbook.Path & "\" & Format(Date - 28, "MMM") & "Files\" & Left(cRng, 7) & ".xlsx"
    ActiveWorkbook.Close
    Workbooks(mCalc).Закрыть savechanges:=False
Конец, если
Следующее кольцо
Конец сабвуфера
 
  • Excel
  • ВБА

1

Эта строка:

 Workbooks(mCalc). Application.Run ("!SummarizeMaster")
 

нужно немного изменить. Вам необходимо включить имя книги в одинарные кавычки, даже если кажется, что вы указываете правильную книгу с помощью Workbooks(mCalc) :

 Workbooks(mCalc).Application.Run ("'Master Calc with Macro .xlsm'!SummarizeMaster")
 

Вы можете просто сократить его до:

 Application.Run ("'Master Calc with Macro.xlsm'!SummarizeMaster")
 

4

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

 Dim relativePath As String, programFileName As String
Dim selectedProgramsFiles() как строка,programArrayLastIndex как байт, I как байт
For I = 0 ToprogramArrayLastIndex 'Пройтись по всем выбранным программам
    ProgramFileName = selectedProgramsFiles(I)
    относительный путь = ThisWorkbook. Path & "\" & имя_файла_программы
    Workbooks.Open Filename:=relativePath
    Application.Run ("'" & относительный путь & "'!ModuleName.Main")
   Книги (programFileName). Активировать
   ActiveWorkbook.Close SaveChanges:=False
Далее I 'For I = 0 ToprogramArrayLastIndex 'Перебрать все выбранные программы
 

1

 Application.Run "PERSONAL.xlsb!ClearYellow", 0
 

ClearYellow — это имя исполняемой подпрограммы в Personal.xlsb .
«0» является первым аргументом этого подпункта (если бы аргументов не было, можно было бы опустить, можно было бы добавить дополнительные аргументы, разделенные запятыми)

Приложение кажется не нужным

Это также можно использовать для запуска из какой-либо другой книги ; рабочая тетрадь должна быть открыта; если бы в имени этой книги был пробел, имя должно было бы быть окружено ''

Вызов не работает между книгами; не тестировался в той же книге или в одном модуле

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

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

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Нажимая «Опубликовать свой ответ», вы соглашаетесь с нашими условиями обслуживания и подтверждаете, что прочитали и поняли нашу политику конфиденциальности и кодекс поведения.

excel — запустить макрос vba в книге из другой книги

Задавать вопрос

спросил

Изменено
6 лет, 4 месяца назад

Просмотрено
9k раз

Я пытаюсь написать macroB в WorkbookB , который открывает другую WorkbookA и запускает macroA на листе1.

Я погуглил и нашел два метода:

  • Использование Application.Run

     Dim i As Integer, en As Integer
    en = Диапазон ("B4")
    Application.Run "C\Mtest\WorkbookA.xlsb !macroA"
     

    Но я получаю ошибку 1004: либо макрос не существует на этом листе, либо макрос деактивирован

  • Использование RunAutoMacros

     Workbooks.