Как запустить макрос независимо в отдельном экземпляре, не останавливая текущий экземпляр Excel?

В настоящее время у меня есть макрос, который создает и открывает экземпляры файлов Excel. Я хочу запускать макросы в этих новых экземплярах. Дело в том, что макросы большие и требуют значительного времени для выполнения, что приостанавливает оба экземпляра excel.

Есть ли способ запустить макрос другого экземпляра в vbeditor этого конкретного приложения Excel? Таким образом, текущий макрос может продолжаться, пока выполняется другой экземпляр.


person TJYen    schedule 10.08.2016    source источник
comment
Просто создайте для них новый Excel.Application экземпляр.   -  person Comintern    schedule 10.08.2016


Ответы (1)


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

Вот пример, я протестировал это для обычных вызываемых процедур, а также включил .EnableEvents, чтобы предотвратить запуск обработчиков событий во второй книге при ее открытии. Без этого обработчики событий, если таковые имеются, могут запускать и приостанавливать выполнение на время своего выполнения.

Sub main()
Dim oXL As Excel.Application
Dim wb As Workbook
Dim filePath$, fileName$, moduleName$, procName$

'## The locaation of the file you want to open, which contains the macro
filePath = "C:\debug\"
'## The name of the workbook containing the macro
fileName = "book2.xlsm"
'## The name of the module containing the macro:
moduleName = "Module1"
'## The name of the macro procedure
procName = "foo"
'## Create new instance of Excel
Set oXL = New Excel.Application
oXL.Visible = True 'or True, if you prefer
'## Open the file containing the macro
oXL.EnableEvents = False
Set wb = oXL.Workbooks.Open(filePath & "\" & fileName)
oXL.EnableEvents = True
'## Use the OnTime method to hand the thread to other instance of Excel
oXL.Application.OnTime Now + TimeValue("0:00:05"), fileName & "!" & moduleName & "." & procName
'## Inform user that the macro is running in the other workbook/instance of Excel
Debug.Print "The procedure " & procName & " is running in " & fileName

wb.Activate
Set oXL = Nothing
End Sub
person David Zemens    schedule 10.08.2016
comment
Спасибо за оперативный ответ! События все еще связывают друг друга и зависают, несмотря на задержку onTime. Я также отключил события. - person TJYen; 10.08.2016
comment
Я не уверен, что вы имеете в виду, говоря, что «События по-прежнему связывают друг друга» - я проверил это на нескольких простых случаях, и приведенная выше версия успешно печатает оператор Debug.Print перед выполнением любого кода в wb рабочей книге. - person David Zemens; 10.08.2016
comment
Спасибо за пример кода и ответ! Разъяснил мои ошибки. - person TJYen; 10.08.2016