Есть ли режим "ожидания"?
Спасибо.
ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal desiredAccess As Long, _
ByVal inheritHandle As Long, ByVal processId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal processHandle As Long) As Long
Sub Example()
Dim taskId As Long
Dim stopFlag As Long
Dim procHandle As Long
Const SYNCHRONIZE = &H100000
Const INFINITE = &HFFFF
taskId = Shell("calc.exe", vbNormalFocus)
procHandle = OpenProcess(SYNCHRONIZE, True, taskId)
stopFlag = WaitForSingleObject(procHandle, INFINITE)
If stopFlag <> -1 Then
CloseHandle procHandle
MsgBox "Процесс завершён."
End If
End Sub
Спасибо.
В примере синхронизируется работа макроса и работа процесса, запущенного с помощью функции [color=blue]Shell()[/color].
Алгоритм прост:
- запускается макрос;
- в процессе своей работы макрос инициирует запуск калькулятора
[color=blue]taskId = Shell("calc.exe", vbNormalFocus)[/color]
- после запуска калькулятора работа макроса приостанавливается до момента завершения работы калькулятора
[color=blue]procHandle = OpenProcess(SYNCHRONIZE, True, taskId)
stopFlag = WaitForSingleObject(procHandle, INFINITE)[/color]
- после завершения работы калькулятора работа макроса возобновляется.
Или Вам нужно было что-то другое?
Или Вам нужно было что-то другое?
Наверное, как раз это. Т.е. вместо запуска калькулятора мне надо запустить процедуру копирования...
Попробую.
Так. У меня процедура копирования сидит в Sub и я ее дожен вызвать Call MyFoldCopy()
Но при написании строки
TaskID = Call MyFoldCopy()
пишется, что неверный синтаксис. Т.е. можно ли вызову процедуры присваивать какой-то ID?
Или просто ничего не писать, а код сам дождется, когда одна его часть выполнится и перейдет к след. инструкции? Может так быть?
Do
DoEvents
Loop While Dir(CurDir & "\solution.txt") = ""
Dmitry2064, если у Вас просто два макроса, один из которых вызывает другой, то будет именно так.
'...
Call Ex2
'вызов DoEvents НЕ НУЖЕН
'...
End Sub
Sub Ex2()
'...
End Sub
Приведённый же мной пример годится лишь в том случае, когда макрос запускает некий процесс через Shell(), т.к. по умолчанию такой процесс относительно макроса будет выполняться в асинхронном режиме.