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

 

dru_seb

Пользователь

Сообщений: 70
Регистрация: 19.03.2016

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

Код
    rngShop.Value = arrShop
    rngStorage.Value = arrStorage

вставить вызов другого макроса, не могу понять как….в конце этого макроса я вставил вызов другого  » Call clear» но там всё просто, там конец, а вот как в нужном месте вставлять …. что перед «Call макрос» и что после должно быть?

Код
Sub in_actualize_stocs()
    Dim arrTmp, i As Long, wb As Workbook, wsh As Worksheet, lLastRow As Long, _
        rngShop As Range, arrShop, dictShop As Object, _
        rngStorage As Range, arrStorage, dictStorage As Object

    Const sSTORAGE_NAME_WSh As String = "продано"
    Const sSHOP_NAME_WSh As String = "магазин"
     
    Set wb = ActiveWorkbook

    arrTmp = Array(sSTORAGE_NAME_WSh, sSHOP_NAME_WSh)
    With wb
        On Error Resume Next
        For i = LBound(arrTmp, 1) To UBound(arrTmp, 1)
            Set wsh = .Sheets(arrTmp(i))
            If wsh Is Nothing Then
                MsgBox "111""" & arrTmp(i) & """" & Chr(10) & _
                    "111 """ & .Name & """." & Chr(10) & _
                    "111.", vbCritical
                Exit Sub
            End If
        Next i
        On Error GoTo 0
 
        With .Sheets(sSHOP_NAME_WSh)
            lLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
            If .Range("A2").Row > lLastRow Then
                MsgBox "111." & Chr(10) & _
                    "111.", vbCritical
                Exit Sub
            End If
            Set rngShop = .Range("A2:D" & lLastRow)
        End With ' .Sheets(sSHOP_NAME_WSh)
        Set dictShop = CreateObject("scripting.dictionary")
        arrShop = rngShop.Value

        For i = 1 To UBound(arrShop, 1)
            If dictShop.exists(arrShop(i, 1)) Then
                dictShop(arrShop(i, 1)) = dictShop(arrShop(i, 1)) + arrShop(i, 4)
            Else
                dictShop(arrShop(i, 1)) = arrShop(i, 4)
            End If
            arrShop(i, 4) = Empty
        Next i     

        With .Sheets(sSTORAGE_NAME_WSh)
            lLastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
            If .Range("A5").Row > lLastRow Then
                MsgBox "111." & Chr(10) & _
                    "111.", vbCritical
                Exit Sub
            End If
            Set rngStorage = .Range("A5:C" & lLastRow)
        End With ' .Sheets(sSTORAGE_NAME_WSh)
        Set dictStorage = CreateObject("scripting.dictionary")
        arrStorage = rngStorage.Value

        For i = 1 To UBound(arrStorage, 1)

            If dictStorage.exists(arrStorage(i, 1)) Then
                MsgBox "111""" & arrStorage(i, 1) & """." & Chr(10) & _
                    "111.", vbCritical
                Exit Sub
            Else
                dictStorage(arrStorage(i, 1)) = arrStorage(i, 3)
            End If
            If dictShop.exists(arrStorage(i, 1)) Then

                arrStorage(i, 3) = arrStorage(i, 3) + dictShop(arrStorage(i, 1))

                dictShop.Remove (arrStorage(i, 1))
            End If
        Next i
    End With ' wb

    rngShop.Value = arrShop
    rngStorage.Value = arrStorage

    If dictShop.Count > 0 Then
        MsgBox "111", vbCritical
    Else
        MsgBox "Work complete!", vbInformation
    End If

    Call clear    
End Sub

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

Изменено: dru_seb12.08.2016 15:45:52

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

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

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



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