◆◆MS-Excel2000スキルアップ講座/VBA編◆◆

Shell関数で起動したアプリケーションの終了を認識する方法
VBA を使用して、 Shell 関数でアプリケーションを起動し、そのアプリケーション終了後にマクロを継続する方法を紹介します。

をご覧になる前に

この文書は Excel 97 のプログラミングツールを使用して Excel 97 のアプリケーションを作成でき、かつ Microsoft(R) VisualBasic(R) Programming SystemApplications Edition (以下 VBA) を十分に理解している方を対象とします。
さらにこの文書では Win32 API 関数 を使用しているため Microsoft(R) Win32(R) Software Development Kit (以下 Win32 SDK) に関連した仕様と基礎技術、Windows の動作メカニズムとプログラミングテクニック等、 Win32 API 関数に関する知識が必要になります。

  VBA に関する詳細な情報はオンラインヘルプを、 Win32 API 関数に関する詳細な情

報はマイクロソフト デベロッパーズ ネットワーク (MSDN) レベル 2 で提供される Win32 SDK をご覧ください。

■ サンプル

  プロシージャ名: TaskEnd

このサンプルは、このサンプルではメモ帳を起動し、メモ帳での処理終了後、メッセージボックスを表示させています。

  ----------------------------------------------------------------------------
  Public Declare Function GetExitCodeProcess Lib "kernel32" _
      (ByVal hProcess As Long, lpExitCode As Long) As Long
  Public Declare Function OpenProcess Lib "kernel32" _
      (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
      ByVal dwProcessID As Long) As Long
  Public Const PROCESS_QUERY_INFORMATION = &h400
  ----------------------------------------------------------------------------
  Sub TaskEnd()
      Dim dwProcessID As Long
      Dim hProcess As Long
      Dim lpdwExitCode As Long
      Dim ret As Long

      dwProcessID = Shell("C:\WINDOWS\NOTEPAD.EXE", 1)
      hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, True, dwProcessID)
      Do
        ret = GetExitCodeProcess(hProcess, lpdwExitCode)
        DoEvents
      Loop While lpdwExitCode

      MsgBox "メモ帳は終了しました。"
  End Sub
  ----------------------------------------------------------------------------

■ 操作手順

  1.  
  2. [ツール] メニューの [マクロ] をポイントし [Visual Basic Editor] をクリックします。
  3. Visual Basic Editor がアクティブになったら、[挿入] メニューの [標準モジュール] をクリックします。
  4. モジュールウィンドウに上記プロシージャを記述します。
  5. Excel 97 をアクティブにします。
  6. [ツール] メニューの [マクロ] をポイントし [マクロ] をクリックします。
  7. [マクロ] ダイアログ ボックスの [マクロ名] コンボ ボックスから、 上記手順で作成したプロシージャ "TaskEnd" を選択し [実行] をクリックします。

■ 解説

VBA から外部のプログラムを起動するには Shell 関数を使用しますが、 VBA の Shell 関数はプログラムを非同期的に実行するため、起動したプログラムが終了したかどうかを確認せず次のコードに制御が移ります。Shell 関数により起動したプログラムの処理が終了した時点で次のコードに制御を移すには、 Win32 API 関数を利用することで、 Shell 関数により起動したプログラムの処理が終了したかどうか認識することができます。