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シート画面

「電卓を起動」ボタンがクリックされると下記の流れで実行されます。

  1. Shellで電卓を起動します。
  2. OpenProcessで起動した電卓のプロセスハンドルを取得します。
  3. WaitForSingleObjectで待機します。
  4. 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