Страницы: 1
RSS
Параллельный запуск макросов в книгах, созданных в новых потоках, лак избежать окончания выполнения макроса перед запуском макроса в следующей книге
 
Здравствуйте!
Ни как не могу наладить одновременный запуск макросов в книгах, которые открываются в новых потоках.

Сначала я создаю копию книги, затем, оставаясь в текущем экземпляре книги, открываю её копию в Новом Потоке  и хочу запустить выполнения долго расчета (Поиск решения). Но проблема в том, что при запуске макроса в первой книге   макрос во второй книге запустится только после выполнения в первой.

Если делать запуск не в цикле, а в единичном случае, то основная книга остается "висеть" до выполнения макроса в её копии.

Если запускать руками, то каждый файл запускается без проблем! (100% загрузка ЦП).

Могу ли я как-то после запуска макроса вернуть управление основной книге и дальше идти по циклу?  Или может хотя бы можно полностью остановить выполнение кода в основной книге (тогда смогу сделать 10 кнопок)?


Буду признателен за помощь, спасибо!

Код
Public newXLAppArr(1 To 10) As Variant


Public Sub creatNewVAR(ByVal varnum)
    FilePathh = ThisWorkbook.path &  "\VAR_" & varnum& ".xlsm"
    ThisWorkbook.SaveCopyAs filename:=FilePathh
    If Dir(FilePathh) <> "" Then
    
        Set newXLAppArr(varnum) = New Excel.Application
        With newXLAppArr(varnum)
            .Workbooks.Open FilePathh
            .WindowState = xlMaximized
            .Visible = True
        End With
        
        newXLAppArr(varnum).Application.Run "RunTestMacros"
        
    End If
End Sub

...

for i=1 to 10
 call creatNewVAR(i)
next 
Изменено: vainu - 04.12.2019 00:44:38
 
Что такое по-вашему
Цитата
vainu написал:
Новом Потоке
?  По-моему у вас все запускается в одном и том же потоке. Поэтому и
Цитата
vainu написал:
во второй книге запустится только после выполнения в первой
VBA не поддерживает вычисление в паралелльных потоках.
Можно, конечно, придумать костыль.
«Бритва Оккама» или «Принцип Калашникова»?
 
bedvit, Нет, когда запускаю руками, то все работает. Идет 100% загрузка ЦП.
Если мне удастся прервать ожидание выполнения макроса и запустить второй, то все будет работать. Но я не знаю, как прервать ожидание выполнения

То, что описано в коде, эквивалентно вызову этого окна: http://prntscr.com/q5sm5u


 
Изменено: vainu - 04.12.2019 00:50:09
 
vainu, вы прочитали инфу по моей ссылке? Думаю это вам поможет разобраться.
«Бритва Оккама» или «Принцип Калашникова»?
 
Почитайте еще статью автора сайта.
Изменено: sokol92 - 04.12.2019 15:11:29
Владимир
 
Цитата
vainu написал:
Нет, когда запускаю руками, то все работает. Идет 100% загрузка ЦП.
Это потому, как я и писал выше, транслятор VBA выполняет код в "однопоточном" режиме, да вы сделали новый поток через New, транслятор выполняет код для нового потока (все предыдущие заморожены), после завершения кода в новом потоке, транслятор продолжает выполнять код в предыдущем потоке и т.д. для всех новых потоков. В VBA нет штатного механизма распараллеливания потоков/расчетов. А когда вы запускаете руками, вы используете ресурсы системы, которая прекрасно работает в многопоточном режиме.
Вы, наверное, так и не смотрели, ссылку, которую я вам скинул.
Можно попробовать через костыль
Код
wShell.Run
, но стоит ли оно того, мы не знаем вашей задачи.
«Бритва Оккама» или «Принцип Калашникова»?
 
Спасибо тем, кто откликнулся!

bedvit,  По ссылке переходил.

Запуск через скрипты решил описываемую проблему, но создал новые))
Решил свою задачу путем вызова макроса при загрузке книги с задержкой в выполнении.  
Изменено: vainu - 05.12.2019 14:34:51
 
Цитата
vainu написал:
задержкой в выполнении
Через Application.onTime, при открытии книги?
«Бритва Оккама» или «Принцип Калашникова»?
Страницы: 1
Наверх