#292 実行可能ファイルを起動して終了まで待機する VBA、API

Accessから他の実行可能ファイル(.EXE)を実行し、それが閉じられるまで待機する方法です。
WindowsAPIを使って実行可能ファイルを起動し、ループによってそれが終了したかどうかを監視します。

次の例では、「ExecuteWaitProccess」というオリジナルのFunctionプロシージャを作っています。以下のコードをすべて標準モジュールに記述し、ExecuteWaitProccessを呼び出すことで実行可能ファイルを起動することができます。その実行可能ファイルが終了した時点でExecuteWaitProccessプロシージャが完了して呼び出し元コードにカレントステートメントが返ってきますので、呼び出し側はたった1行記述するだけです。
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 Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As Long, _
                                  lpExitCode As Long) As Long
Private Const PROCESS_QUERY_INFORMATION = &H400&
Private Const STILL_ACTIVE = &H103&

Public Function ExecuteWaitProccess(strExeFileName As String) As Boolean
'概要 指定の実行可能ファイルを起動して終了まで待機する
'引数 strExeFileName : 実行ファイルのパス+コマンドライン引数
'返値 プロセス成功時 : True  プロセス失敗時 : False

  Dim lngProcId As Long
  Dim lngProcHandle As Long
  Dim lngProcExitCode As Long

  '実行可能ファイルを起動
  lngProcId = Shell(strExeFileName, vbNormalFocus)
  'プロセスオブジェクトのハンドルを取得
  lngProcHandle = OpenProcess(PROCESS_QUERY_INFORMATION, False, lngProcId)
  If lngProcHandle <> 0 Then
  '新しいプロセスを作成できた場合
    'プロセスが終了するまでのループ
    Do
      'プロセスの終了状態を取得
      GetExitCodeProcess lngProcHandle, lngProcExitCode
      DoEvents
    Loop While lngProcExitCode = STILL_ACTIVE
    ExecuteWaitProccess = True
  Else
    ExecuteWaitProccess = False
  End If
  'プロセスオブジェクトのハンドルをクローズ
  CloseHandle lngProcHandle

End Function

使用例:
Sub test()

  'メモ帳を起動して終了まで待機します
  ExecuteWaitProccess "notepad.exe"
  
  MsgBox "メモ帳が終了しました。"

End Sub
| Index | Prev | Next |



T'sFactory
Accessで動く生産管理DB
Ureru Express
Webで使う販売顧客管理
Access開発&アドバイス
DB開発やテクニカルアドバイス
Copyright © T'sWare All rights reserved