Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.09.2017, 10:55   #1
bdfy
Форумчанин
 
Регистрация: 12.11.2009
Сообщений: 258
По умолчанию Запуск и ожидание конца работы внешнего скрипта (autoit)

Необходимо из Excel запускать скрипт Autoit.
Скрипт запускает внешнее приложение, кликает в нужных местах экрана пару ра, сохраняет картинки результата.
Запускается скрипт командой shell
Dim runscript
runscript = Shell("C:\Program Files (x86)\AutoIt3\AutoIt3_x64.exe G:\calc_AD3.au3")
Все работает отлично пока запуск один. Но мне нужно сделать цикл с запуском этого самого скрипта.
Сам скрипт собственно не важен. Важно дождаться конца его работы (т.е не запускать скрипт по новой пока не отработает старый)

для контроля решил использовать ячейку в екселе. Перед началом работы скрипта задаю ей 1, во внешнем скрипте задаю 0
_Excel_RangeWrite($oWorkbook, "0", "A2", 0) ;это показывает что расчет окончен
В самом VBA макросе задаю ожидание
Код:
    ExWsIsx.Cells(2, 1) = 1 'эту ячейку скидываем после работы программы
    Calculate
... тут запуск внешнего скрипта
Do While ExWsIsx.Cells(2, 1) = 1
Sleep 0.5 * 1000
tim = tim + 0.5
Debug.Print "tim " & tim
Loop
Так вот проблема в том что внешний скрипт как-будто запускается только после отработки VBA макроса который его запустил.
т.е счетчик крутится бесконечно, но стоит оборвать выполнение VBA макроса - корректно запускается и отрабатывает внешний скрипт.
Так чего я не понимаю в работе команды shell ?
bdfy вне форума Ответить с цитированием
Старый 09.09.2017, 13:29   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

да, в одном экземпляре Excel не могут одновременно выполняться 2 макроса
вам нужно открыть еще один экземпляр Excel и уже в нем открыть след файл - тогда сможете получить два параллельных процесса.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 09.09.2017, 14:21   #3
bdfy
Форумчанин
 
Регистрация: 12.11.2009
Сообщений: 258
По умолчанию

но речь не идет об одновременной работе.
мне нужно последовательно N раз запустить внешний скрипт через shell. Причем каждый раз дожидаясь конца работы этого внешнего скрипта.
bdfy вне форума Ответить с цитированием
Старый 09.09.2017, 14:57   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

ну, раз надо, что тут поделаешь...
последовательно N раз откройте НОВЫЙ экземпляр Excel откройте в нем нужный файл и сделайте там все, что нужно

понимаете, в Windows можно открыть 1 Excel и в нем открыть 100 файлов, а можно открыть 100 Excel-ей и в каждом открыть по одному файлу. эти два режима работы с сотней файлов допускаются системой, но принципиально отличаются между собой по количеству сьеденных в результате ресурсов и по последующим способам взаимоотношений между одновременно открытыми 100 файлами.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 09.09.2017, 15:28   #5
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Причем тут Эксели? Вы сообщение автора читали?
Он хочет, чтоб Shell был не асинхронным (ждал завершения программы).

В мсдн по VB.NET у него вроде бы есть параметр для этого. А вот в офисе как я понял нет https://support.office.com/en-us/art...6-6832eadd3c63
Но почему-то написано
Цитата:
By default, the Shell function runs other programs asynchronously
только непонятно как с этого "default" изменить.

Гугл советует WshShell.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.09.2017, 15:40   #6
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

я сам в шоке
Цитата:
Причем тут Эксели?
в ветке форума Micrisoft Office VBA > Microsoft Office Excel
а во все буквы действительно не вчитывался и мог не правильно понять вопрос. такое бывает)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 09.09.2017, 15:45   #7
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Я про экземпляры Экселя.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.09.2017, 16:00   #8
bdfy
Форумчанин
 
Регистрация: 12.11.2009
Сообщений: 258
По умолчанию

Еще раз
Есть документ Excel (поэтому я и в разделе екселя) с данными и макросами.
Один из макросов запускает внешний скрипт (Autoit) для работы с внешним приложением. Вот этот макрос нужно запускать в цикле, предварительно дожидаясь конца работы внешнего скрипта. Почему-то это не работает так как я ожидал. Внешнее приложение запускается только после того как макрос запустивший его заканчивается. Почему это так и что с этим делать ?
bdfy вне форума Ответить с цитированием
Старый 09.09.2017, 16:03   #9
Alex11223
Старожил
 
Аватар для Alex11223
 
Регистрация: 12.01.2011
Сообщений: 19,500
По умолчанию

Цитата:
Сообщение от bdfy Посмотреть сообщение
предварительно дожидаясь конца работы внешнего скрипта
Цитата:
Сообщение от bdfy Посмотреть сообщение
Почему это так и что с этим делать ?
Прочитать сообщение #5.
Ушел с форума, https://www.programmersforum.rocks, alex.pantec@gmail.com, https://github.com/AlexP11223
ЛС отключены Аларом.
Alex11223 вне форума Ответить с цитированием
Старый 09.09.2017, 16:59   #10
kuklp
Участник клуба
 
Регистрация: 02.05.2010
Сообщений: 1,390
По умолчанию

Код:
Public Const STILL_ACTIVE = &H103
Public Const PROCESS_QUERY_INFORMATION = &H400

Public Declare Function OpenProcess Lib "kernel32" _
    (ByVal dwDesiredAccess As Long, ByVal bInheritHandle _
    As Long, ByVal dwProcessID As Long) As Long
Public Declare Function GetExitCodeProcess Lib "kernel32" _
    (ByVal hProcess As Long, lpExitCode As Long) As Long

'! -----------------------------------------------------------
'!  Имя    :  RunShell
'!  Автор  :  Сергей Kuklp
'!  Date   :  22.02.2003
'!  Params :  ByVal AppToRun As String
'!  Returns:  As Boolean
'! -----------------------------------------------------------
Public Function RunShell(ByVal AppToRun As String) As Boolean
    
    On Error GoTo ErrorHand
    
    Dim hProcess As Long
    Dim RetVal As Long
    
    hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 1, _
        Shell(AppToRun, vbNormal))
    
    Do
        GetExitCodeProcess hProcess, RetVal
        DoEvents
        
    Loop While RetVal = STILL_ACTIVE
    
    RunShell = True
    
    Exit Function
    
ErrorHand:
    MsgBox "Ошибка" & Err & Error
    'ShellAndContinue = False
    Exit Function
End Function
mailto: kuklp60@gmail.com, ящики для благодарностей:
WM Z206653985942, R334086032478, U238399322728
kuklp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Запуск внешнего exe vaximan Помощь студентам 3 29.07.2014 13:08
VBA Excel:Работа скрипта до конца таблицы student2008 Microsoft Office Excel 7 17.05.2013 08:51
Запуск скрипта Python и ожидание его отработки Stilet Win Api 7 21.11.2012 14:59
Запуск внешнего приложения с функцией Viru$174 C# (си шарп) 4 24.02.2011 00:40
Запуск внешнего приложения Fia Общие вопросы Delphi 13 18.09.2008 07:27