Vba excel application run
Ron de Bruin
Excel Automation
How do I use Application.Run in Excel
When you want to run a macro from an event or from another macro in the same workbook you can call the macro like this in your code :
You do not have to use Call but I think it is clearer when you read the code that another macro is called.
But what if you want to run a macro that is in another workbook or Add-In(File or add-in must be open).
We can use Application.Run if we want that like this :
If the workbook name includes spaces or some other particular characters it is necessary to enclose the name with single quotes, like this :
Application.Run «‘Book 1.xls’!MyMacroName»
It does not do any harm to use the single quotes even if not needed, and always include them if the workbook name is not known in advance, for example if the workbook name is a variable like this
Application.Run «‘» & strFileName & «‘!MyMacroName»
Note: If your workbook name contains apostrophe (‘) characters, such as in «Joe’s Workbook.xls», then you need to double-up the apostrophes like Application.Run «‘Joe»s Workbook’!MyMacroName»
Callbacks instead of macros in Excel 2007 -2016
But what if you use Excel 2007-2016 and use custom Ribbon controls with callbacks.
A normal macro looks like this :
And a callback looks like this :
You will notice that the Application.Run examples above will not work when you want to run a callback in another workbook or Add-in. Also Call MyMacroName will not work to call a callback in the same workbook.
But we can do this to call a callback in the same workbook :
Or to call a callback in an add-in or another workbook use :
Note: Instead of a object you can also use IRibbonControl like this :
Check if file or add-in is open
Before you try to run the Application.Run line that call a macro or callback in another workbook or add-in you can test if the workbook or add-in is open with the code below.
Tip: You could replace the MsgBox that says that the file is not open with code that opens the workbook/add-in. Set TestWkbk = Workbooks.Open(«C:YourPathToTheAddinRDBTestAdd-in.xlam»)
Do not forget to check if opening the file was succesful in the code before you try to call the macro or callback.
Returning values from functions or passing arguments to functions or macros
Another way to test if a workbook/add-in is open is to call a function like this with as argument the workbook name that you want to check.
But how do we use this function if it is not in the same workbook, you can use this to check if there is a file named RDBMerge.xlam open.
Dim MyResult As Boolean
MyResult = Application.Run(«‘» & TestWkbk.Name & «‘!IsOpen», «RDBMerge.xlam»)
Or use this to call a macro/function with arguments
Application.Run «‘» & TestWkbk.Name & «‘!MacroNameHere», «parm1», «parm2»
Acknowledgements
Many thanks to Peter Thornton, Jim Rech, Dave Peterson and Mike Rosenblum for their useful comments.
VBA Excel. Вызов процедуры Sub из другой подпрограммы VBA
Вызов процедур Sub (подпрограмм) из кода других процедур, расположенных в одном или разных модулях, в одной или разных книгах Excel (проектах VBA), с аргументами или без. Примеры.
Вызов процедур Sub в пределах одной книги
Вызов подпрограммы из кода другой процедуры Sub, расположенной в том же модуле или другом модуле одной рабочей книги (проекта VBA) осуществляется с помощью ключевого слова Call или без него по имени подпрограммы. Вызывающая процедура Sub может быть любой видимости, как Public, так и Private, а вызываемая, если расположена в том же модуле, может быть любой видимости, но если расположена в другом модуле, должна быть объявлена как Public.
Синтаксис вызова подпрограмм в пределах одной книги
[ Call ] ИмяПроцедуры [ (Аргументы) ]
- Call – необязательное ключевое слово;
- ИмяПроцедуры – обязательный компонент, имя вызываемой подпрограммы;
- Аргументы – необязательный компонент, список аргументов вызываемой процедуры Sub, разделенных запятой.
Вызов подпрограмм без аргументов в пределах одного модуля
Скобки рядом с именами вызываемых подпрограмм без аргументов не ставятся:
Вы можете скопировать приведенный код в свой модуль и посмотреть, запустив процедуру test1, как она последовательно запускает процедуры test2 и test3.
Вызов подпрограмм с аргументами в пределах одного модуля
При вызове процедур Sub с аргументами и ключевым словом Call, аргументы заключаются в скобки, без ключевого слова Call – аргументы не заключаются в скобки:
Вы можете разместить этот код в своем модуле и протестировать его.
Вызов подпрограмм из разных модулей одной книги
Правила, касающиеся использования оператора Call и заключения аргументов в скобки, верны и для вызова процедур Sub, находящихся в разных модулях. Единственным отличием является необходимость вместе с именем вызываемой подпрограммы указывать место ее расположения. Место расположения и имя подпрограммы разделяются точкой.
Вызываемая подпрограмма расположена в Стандартном модуле
- ИмяМодуля – уникальное имя стандартного модуля, отображаемое в проводнике проекта VBA.
Неуникальное имя процедуры возникает, когда создаются процедуры с одним именем в разных модулях. Если есть вероятность дублирования в дальнейшем имени подпрограммы и лишения ее уникальности, то лучше сразу вызывать ее с указанием имени стандартного модуля.
Вызываемая подпрограмма расположена в модуле книги, модуле листа, модуле формы
- ЭтаКнига – так и пишется, указывает на текущую книгу в которой расположены вызывающая и вызываемая подпрограммы.
- ИмяЛиста – уникальное имя листа, которое в проводнике проекта VBA указано без скобок (по умолчанию: Лист1, Лист2, Лист3 и т.д.).
- Имя ярлычка листа – дублирующее имя листа, которое в проводнике проекта VBA указано в скобках.
- ИмяФормы – уникальное имя пользовательской формы, отображаемое в проводнике проекта VBA.
Вызов процедур Sub из модулей разных книг
Если вызываемая подпрограмма расположена в другой книге, она должна быть объявлена как Public, а книга открыта. Запустить такую процедуру Sub можно с помощью метода Application.Run (протестировано в Excel 2016).
Синтаксис метода Application.Run
Application.Run “ИмяКниги!ИмяМодуля.ИмяПроцедуры”, Арг1, Арг2, …, Арг30
- ИмяКниги!ИмяМодуля.ИмяПроцедуры – обязательный компонент, полный адрес подпрограммы, заключен в двойные кавычки.
- ИмяКниги – имя рабочей книги Excel с расширением, в которой находится вызываемая подпрограмма, если имя содержит пробелы, оно заключается в одинарные кавычки – апострофы (‘Имя Книги’).
- ИмяМодуля – имя модуля для стандартного модуля (для уникальных имен вызываемых подпрограмм может не указываться), имя листа для модуля листа, словосочетание «ЭтаКнига» (без кавычек) для модуля книги.
- ИмяПроцедуры – имя вызываемой процедуры Sub.
- Арг1, Арг2, …, Арг30 – необязательные компоненты, аргументы вызываемой подпрограммы, максимальное количество которых ограничено 30 элементами.
Полный адрес вызываемой процедуры заключен в двойные кавычки, отделен от аргументов и аргументы друг от друга запятыми.
Полный адрес вызываемой процедуры
Может показаться сложным составить полный адрес вызываемой подпрограммы, но на самом деле все очень просто – Excel уже сделал это за нас.
Список макросов во всех открытых книгах
2. Найдите в списке вызываемую подпрограмму и кликните по ней. Ее полный адрес отобразится в поле «Имя макроса».
3. Скопируйте полное имя вызываемой процедуры Sub и вставьте ее в метод Application.Run, заключив в двойные кавычки.
Один нюанс: в окне «Макрос» не отображаются процедуры с аргументами. Чтобы отобразить такую процедуру, закомментируйте аргументы, а после копирования и вставки раскомментируйте их.
Стоит не забывать о том, что если книга с вызываемой подпрограммой будет переименована, то полное имя вызываемой процедуры Sub изменится и везде, где оно присутствует в коде, его необходимо будет отредактировать.
Пример вызова подпрограмм из другой книги
Допустим, у нас есть рабочая книга Excel под именем «Книга1.xlsm» (или «Книга1.xls» в ранних версиях программы). В ней находятся вызываемые из другой книги процедуры Sub, перечисленные ниже.
В стандартном модуле «Module1»:
В модуле листа «Лист1»:
В модуле книги «ЭтаКнига»:
Для последовательного запуска этих подпрограмм можно вставить в любой модуль другой книги Excel следующую процедуру:
Во второй строке кода пропущено имя стандартного модуля, так как имя подпрограммы оказалось уникальным, а в следующей строке этот же код продублирован, для примера, с именем модуля. В пятой строке – пример запуска процедуры Sub с двумя аргументами.
И еще раз напомню, что имя книги с пробелами заключается в одинарные кавычки (апострофы):
Если у вас есть процедуры, которые часто вызываются из других книг, поместите их в Личную книгу макросов, и они всегда будут доступны.
Заключение
В этой статье не рассмотрено добавление ссылок из одного проекта VBA на другой, которые позволяют работать с модулями и процедурами, находящимися в другом проекте так, как с находящимися в текущем. Причем книга, с которой установлена связь, может быть закрыта. Я предпочитаю работать с Личной книгой макросов, а при попытке, из любопытства, установить связь между двумя книгами, программа Excel, почему-то, отказала мне в этом и эксперименты закончились.
Если хотите поэкспериментировать со связанными книгами, откройте проект VBA, из которого надо установить связь с другой книгой, и выберите в главном меню «Tools» – «References…». В открывшемся окне «References – VBAProject» все открытые книги будут отображены одним словом – «VBAProject». Выделяйте по очереди строки с этим словом и внизу, в информационной рамке, смотрите, какой книге этот проект принадлежит. Поставьте галочку рядом с выбранным проектом и нажмите кнопку «OK». Если книга, с проектом которой устанавливается связь, закрыта, ее не будет в списке. В этом случае, нажмите на кнопку «Browse…», найдите, выбрав расширение, нужную книгу и откройте ее в проводнике. Связь будет установлена, и процедуры из связанных книг будут вызываться по имени с ключевым словом Call или без него, как будто они расположены в одной книге.
Vba excel application run
На этом шаге мы рассмотрим основные методы этого объекта .
Перечислим наиболее часто используемые методы объекта Application .
Методы | Выполняемые действия |
---|---|
Calculate | Вызывает принудительное вычисление во всех открытых рабочих книгах. Например: |
Run | Запускает на выполнение подпрограмму или макрос. Синтаксис:
Например: Application.Run Macro:= «Расчет» — запускает макрос Расчет |
Volatile | Вызывает перевычисление функции пользователя при изменении значений параметров. Например, функция Квадрат будет автоматически пересчитывать результат на рабочем листе при изменении значения аргумента: |
Wait | Временно приостанавливает работу приложения без остановки работы других программ. Синтаксис: |
OnKey | Устанавливает выполнение специфицированной процедуры при нажатии заданной комбинации клавиш. Синтаксис:
Допустимо использование сочетания одновременно нажатых клавиш. С этой целью для перечисленных трех клавиш установлены следующие коды:
В примере процедуре Амортизация назначена комбинация клавиш «Ctrl»+»+» , а процедуре ПроцентнаяСтавка — Shift+Ctrl+» стрелка вправо » : |
OnRepeat и OnUndo | Определяет процедуру, выполняемую при выборе команды Правка | Повторить (Edit | Repeat) и Правка | Отменить (Edit | Undo) соответственно. Синтаксис:
|
OnTime | Назначает выполнение процедуры на определенное время. Синтаксис:
В следующем примере демонстрируется, как запустить процедуру Очистка на выполнение через 15 секунд от текущего времени: |
Quit | Закрывает приложение. Например: На следующем шаге мы рассмотрим события этого объекта . Канал в Telegram Вы здесьВыполнение процедур в VBAРанее, с запуском процедур из меню «Макросы» мы уже сталкивались. Так же, мы уже назначали нашим процедурам горячие клавиши. Теперь поговорим о еще нескольких способах запуска процедур в VBA. Выполнение процедур из пользовательского меню ExcelЭтот способ позволяет нам создать свои элементы в пользовательских меню и назначить этим элементам макросы т.е. процедуры. Ниже приводится первый способ создания элемента меню и привязку к нему макроса. Данный способ использовать не предпочтительно т.к. отсутствует гибкость, при переходе на другую рабочую станцию (ПК) элементы придется создавать и настраивать повторно. Со вторым способом, а именно с программным созданием панелей меню и подключением их как надстройки, мы поговорим в следующих статьях, ну а для создания простенького меню из одного- двух элементов смотрим способ ниже. Итак, допустим, нам необходимо запускать простенькую процедуру, которая возвращает: Имя пользователя и Текущие время и дату ПК в сообщении. Код процедуры: Sub GetUserDate() Для запуска этой процедуры из пользовательского меню, проделываем следующее: Обратите внимание. При открытом окне «Настройка», Вы можете изменить любой пункт меню, как панелей, так и выпадающих меню. 2. Перетащите методом Drag & Drop из списка «Команды«, элемент который называется «Настраиваемая команда меню«, в нижнюю часть меню «Данные«, расположив его после элемента «Обновить данные«. 3. Щелкните правой кнопкой мыши на новом пункте меню «Настраиваемая команда меню» и в контекстном меню, в поле Имя введите название пункта меню «&Имя пользователя и дата» 4. Теперь нам остается только связать нашу процедуру (макрос) с этим пунктом. Для этого, в контекстном меню настройки элемента «Настраиваемая команда меню» т.е. уже «Имя пользователя и дата», выбираем пункт «Назначить макрос» и выбираем нашу процедуру из списка: Все. Жмем ОК и закрываем окно «Настройка». Тестируем, меню Данные — Имя пользователя и дата, получаем сообщение: Примечание: Приведенные выше действия создают постоянный пункт меню, т.е. данный пункт будет отображаться во всех книгах, даже после закрытия книги содержащей макрос. В последующих статьях будет рассмотрено создание собственных меню только для определенной книги. Выполнение процедуры из другой процедурыСамый распространенный способ вызова (выполнения) процедуры это вызов процедуры из другой процедуры. Существует три способа вызова:
Рассмотрим каждый способ на примерах. Для этого создадим в модуле с созданной ранее процедурой GetUserDate, вызывающую процедуру CallProc. Способ 1. Sub CallProc() Способ 2. Sub CallProc() Т.к. наша процедура GetUserDate не имеет входных аргументов, то вызываем ее без них. арг_1, арг_2 даны для примера. В правилах хорошего тона, вызов процедур правильнее делать вторым способом т.к. это явно указывает на вызов другой процедуры, но необязательно. Сознаюсь честно, сам ленивый и постоянно использую первый способ :). Способ 3. Этот способ требует особого внимания. Создадим процедуру, определяющую сегодняшний день недели и сообщающую нам в MsgBox, выходной сегодня или нет. Для этого создадим две процедуры, содержащие только сообщения: Sub Работаем() Sub Отдыхаем() И теперь добавим процедуру, которая определяет сегодняшний день недели и вызывает соответствующие процедуры с сообщением. Dim SubToCall As String ‘переменная содержащая имя процедуры Select Case Weekday(Now, vbMonday) Обратите внимание, имя вызываемой процедуры присваивается в текстовую переменную SubToCall в виде обычной текстовой строки. Функция Weekday определяет по текущей дате (которая возвращена встроенной функцией Now) день недели, который проверяется в Case-селекторе (по работе с Case читаем здесь ) и в соответствии с возращенным номером дня недели присваивает в переменную SubToCall строку, содержащую имя процедуры, которую необходимо вызвать. Далее в Application.Run передаем SubToCall как аргумент. Хочу обратить внимание на функцию Weekday — функция имеет еще второй необязательный параметр, который определяет, с какого дня недели вести счет дней. По умолчанию, счет ведется с воскресенья, поэтому константа vbMonday, в нашем примере, указывает функции, что счет необходимо начать с понедельника. Вызов процедуры из другого модуляVBA — язык не привередлив и снисходителен ко многим моментам, например, описание переменных (по этому поводу читайте здесь ). Тоже относится и к вызову процедур, содержащихся в разных модулях. Процедуры могут быть Public или Private (что это значит, можете ознакомиться в статье по области видимости переменных). Так вот, в случае с приватными процедурами, вызов их может происходить только в рамках общего модуля т.е. процедуры (вызываемая и вызывающая) должны находится в одном и том же модуле. Если же вызываемая процедура описана как Public, тогда она становится доступной, для вызывающих процедур, во всех модулях. В случае с Public возможно повторение имен процедур в разных модулях, но вот с вызовом будут проблемы, работа закончится с ошибкой Run-time error 1004: «Не найден макрос…» т.е. интерпретатор, в рамках всего проекта, нашел несколько доступных процедур с одинаковым именем, но не понял какую из них вызвать. Для того чтобы это избежать необходимо явно указать путь к данной процедуре. Это делается довольно просто и привычно для объектно-ориентированных языков, т.е. мы указываем название модуля, содержащего процедуру, ставим точку, и нам предлагается список всех доступных процедур (функций) или глобальных переменных. Например, Module2 содержит процедуру типа Public с именем Test. Для того чтобы ее вызвать из Module1 необходимо написать: Module2.Test. Хочу отметить, что в больших проектах может содержаться не один десяток глобальных процедур, функций, переменных, к которым происходит обращение из различных модулей, и чтоб облегчить жизнь, себе и другим, указывайте всегда полный путь к процедуре, даже если эта процедура имеет уникальное имя. Ну, а на этом все. В следующей статье еще захвачу один способ, это вызов процедур из других книг. А пока – пока! Adblockdetector |