教えて!ExcelVBA!

ExcelVBAの基礎知識・書き方について紹介します。

【ExcelVBA API操作】アプリケーション終了までプログラム実行を待機(GetExitCodeProcess)する方法を教えて!

GetExitCodeProcess関数は、WindowsAPIの1つで、対象のアプリケーションが終了するまでプログラム実行を待機させる事が可能です。

API宣言

ExcelVBAでは、GetExitCodeProcess関数を使用する前にAPI宣言を行う必要があります。API宣言を行うことで、ExcelVBAがWindowsAPI関数を認識することができるようになります。API宣言は次のように行います。

Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, lpExitCode As Long) As Long

解説

パラメータ 内容
Lib 使用する動的リンクライブラリ(DLL)の名前を指定します。ここでは "kernel32.dll"となります。

引数については以下の通りです。

引数 内容
hProcess 対象のプロセスのハンドル(識別子)を指定します。
lpExitCode プロセスの終了コードが格納される変数を指定します。

使い方

具体的な使い方を紹介します。

1.対象となるプロセスのハンドルと終了コードを取得する変数を用意します。

Dim processHandle As Long
Dim exitCode As Long

2.プロセスの終了コードを取得するためにGetExitCodeProcess関数を呼び出します。

GetExitCodeProcess processHandle, exitCode

これで、exitCodeに対象のプロセスの終了コードが格納されます。

プログラミング例

以下に、プログラミング例を紹介します。

Sub WaitForNotepad()
    Dim processHandle As Long
    Dim exitCode As Long
    ' Notepadを起動
    Shell "notepad.exe", vbNormalFocus
    ' Notepadのプロセスハンドルを取得する待機処理(省略)
    ' ...
    Do
        ' プロセスの終了コードを取得
        GetExitCodeProcess processHandle, exitCode
        DoEvents  ' 他のイベントを処理するために必要
        ' 終了コードがSTILL_ACTIVE(プロセスがまだ終了していない)なら待機
    Loop While exitCode = &H103
End Sub

この例では、Shell関数でNotepadを起動し、その後GetExitCodeProcess関数を用いてプロセスの終了を待機しています。

おわりに

GetExitCodeProcess関数を使用することで、外部アプリケーションの終了を待機するなど、プロセスの監視に役立つ機能を利用することができます。是非活用してください。