等到进程运行完毕

时间:2016-05-18 15:31:14

标签: vba shell excel-vba excel

我从VBA宏启动一个程序,我需要等待它完成运行才能进行后处理结果数据。 到目前为止,由于运行时间非常一致(大约2秒),我对以下内容表示满意:

    While FileLen(outputFilename) < 9000 And (Timer - Chrono) < 10
    Wend

事实上,我已经观察到所有结果数据都是一次性写入的,在此之前,输出大小不超过9Ko。 无论如何,由于某种原因,该程序不再一致,所以我更多地看待一个干净的解决方案,等待shell进程停止。 我找到了关于WaitForSingleObject和模块ShellAndWait的想法,我找到了hereThis post帮助我找到了一些功能。

我现在的问题是,在Shell仍处于打开状态时,宏会继续运行。根据我的理解,WaitForSingleObject返回0,这应该意味着Shell已关闭(或已完成运行),但事实并非如此。 更具体地说,在ShellAndWait

WaitRes = WaitForSingleObject(ProcHandle, DEFAULT_POLL_INTERVAL)

加注0。 我尝试通过稍微调整一下来提取代码的重要部分:

Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long

Private Const SYNCHRONIZE = &H100000
Public Const INFINITE = &HFFFF
Public Const PROCESS_ALL_ACCESS = &H1F0FFF

Sub launch()

analysisPath = "Path to the files to feed to the programm"
ShellCommand = "Program to run + arguments"

ChDrive ThisWorkbook.Path
ChDir analysisPath

fileID = Shell(ShellCommand, vbNormalFocus)

ProcHandle = OpenProcess(SYNCHRONIZE, False, fileID)

If ProcHandle<>0 Then
    WaitRes = WaitForSingleObject(ProcHandle, INFINITE)
Else
    MsgBox "Failed running Nastran"
End If
fileID = CloseHandle(ProcHandle)

End Sub

WaitRes仍然提升0。 我使用WaitForSingleObject错了,如果是的话,你能指出我正确的方向吗?

编辑:它也不适用于this post中接受的解决方案(意味着shell运行但不会阻止宏继续运行)。可能是因为我正在运行的特定程序会出现奇怪的行为吗?

1 个答案:

答案 0 :(得分:0)

所以,我一直在搜索,我找到了一些有用的代码。 我实际上发现了它here

相关问题