Excel VBA:他のアプリケーションを起動し終了するまで待つ
Shell関数とWindows APIのOpenProcess・WaitForSingleObject・CloseHandleを使用します。
Homeに戻る >
Excel 数値・文字列・検索・印刷のTipsへ
Excel VBAで外部アプリケーションの起動を掲載しましたが、ここでは起動したアプリケーションが終了するまで待機させます。
起動に関しては「外部アプリケーションの起動方法|Shell関数の使い方」を参照してください。
その他使用する、Windows APIのOpenProcess・WaitForSingleObject・CloseHandleに関しては下記の通りです。
OpenProcessの構文
Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long,ByVal bInheritHandle As Long,ByVal dwProcessId As Long) As Long
プロセスハンドルを取得します。
引数:
- dwDesiredAccess:(省略不可)アクセス方法を指定します。
- bInheritHandle:(省略不可)取得したプロセスハンドルを継承するかどうか指定します。「1」で継承します。
- dwProcessId:(省略不可)プロセスIDを指定します。
戻り値:成功するとプロセスのハンドルが返ります。失敗するとNULLが返ります。
WaitForSingleObjectの構文
Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
プロセスのシグナル待ちます。
引数:
- hHandle:(省略不可)プロセスハンドルを指定します。
- dwMilliseconds:(省略不可)タイムアウト時間をミリ秒単位で指定します。
INFINITEを指定するとシグナル状態になるまで待機し続けます。
戻り値:
- WAIT_OBJECT_0(0x00000000):プロセスがシグナル状態になった
- WAIT_ABANDONED(0x00000080):プロセスが所有権を解放しないで終了した場合
- WAIT_TIMEOUT(0x00000102):タイムアウト時間が経過
- WAIT_FAILED(0xFFFFFFFF):エラーが発生した
CloseHandleの構文
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
プロセスハンドルを閉じます。
引数:
- hObject:(省略不可)閉じるハンドルを指定します。
戻り値:正常終了の場合は0以外が、失敗すると0が返ります。
アプリケーションが終了するまで待機させるVBA
Excelシート画面
「電卓を起動」ボタンがクリックされると下記の流れで実行されます。
- Shellで電卓を起動します。
- OpenProcessで起動した電卓のプロセスハンドルを取得します。
- WaitForSingleObjectで待機します。
- CloseHandleで終了処理を行います。
Excel VBA実行コード
Option Explicit
Private Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, _
ByVal bInheritHandle As Long, _
ByVal dwProcessId As Long) As Long
Private Declare Function WaitForSingleObject Lib "kernel32" _
(ByVal hHandle As Long, _
ByVal dwMilliseconds As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" _
(ByVal hObject As Long) As Long
Private Const SYNCRONIZE As Long = &H100000
Private Const INFINITE As Long = &HFFFF
Private Sub CommandButton1_Click()
Dim IdProc As Long
Dim hProc As Long
Dim lret As Long
Cells(2, 4) = "開始"
'電卓の起動
IdProc = Shell("C:\WINDOWS\SYSTEM32\CALC.EXE", vbNormalFocus)
Cells(3, 4) = "起動"
hProc = OpenProcess(SYNCRONIZE, 1, IdProc)
lret = WaitForSingleObject(hProc, INFINITE)
lret = CloseHandle(hProc)
Cells(4, 4) = "終了"
End Sub
Homeに戻る >
Excel 数値・文字列・検索・印刷のTipsへ
■■■
このサイトの内容を利用して発生した、いかなる問題にも一切責任は負いませんのでご了承下さい
■■■
当ホームページに掲載されているあらゆる内容の無許可転載・転用を禁止します
Copyright (c) Excel-Excel ! All rights reserved