VBA调用SHELL脚本并等待程序结束

VBA调用Shell是异步处理,以下为同步处理代码,注释写的还行,就不多说了。可以直接拿到本地DEBUG以下,注意将下面的本地路径替换为你要运行的bat文件。

' 引入外部函数 PtrSafe用来避免不兼容问题(32位,64位  版本等)

'取得能够对进程进行操作的处理器,第一个参数决定能够进行哪些操作 第三个参数传入进程PID(一个处理器只对应传入PID参数的这一个进程)
Private Declare PtrSafe Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
 '拿到进程的运行状态并传递给第二个参数。第一个参数为处理器
Private Declare PtrSafe Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long
 
Private Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long


 
Const PROCESS_QUERY_INFORMATION = &H400 '十进制是1024
 
Const STILL_ALIVE = &H103  '十进制529 表明进程仍然存活

Sub wocao()
  '运行脚本并获取进程ID,第二个参数决定CMD窗口如何显示,此处为最小化。
  pid = Shell("C:\Users\82138\Desktop\process.bat", vbMinimizedFocus)
  '得到对进程进行操作的能力
  hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, 0, pid)
  isDone = False
  Do
  '通过处理器拿到进程状态码
  Call GetExitCodeProcess(hProcess, ExitCode)
  Debug.Print ExitCode
  DoEvents
  '如果状态码一直是运行中(529),则一直循环
  Loop While ExitCode = STILL_ALIVE
  
  
  
'-----------------END-------------------
'关闭处理器(类似于JAVA的释放对象内存)
  Call CloseHandle(hProcess)
  
  MsgBox "RUN END."


End Sub

 下面是我的测试bat文件,你可以使用自己的。

rem 打印1到10000
for /L %%i  in (1,1,10000) do echo %%i

上述VBA运行会等到bat脚本运行完之后,才会弹出RUN END 的提示框。

你可能感兴趣的:(VBA)