Excelスキルアップコレクション
           〜 Something U Want 〜


Google  

WWW を検索
Excelスキルアップコレクション内 を検索
 @     Top  >     Excel VBA スキルアップコレクション Topics  >     (27) VBAから実行した非同期処理の終了を監視する

 
(27) VBAから実行した非同期処理の終了を監視する

 VBAのプログラムから非同期処理を実行する為の関数Shell() については、「(26) VBAからの非同期処理を実行する」で紹介しました。 ここでは、Win32 APIを使って、関数Shell()にて実行したプログラムのハンドルを取得し、非同期処理の終了を監視する方法を紹介します。これにより、関数Shell()を用いたVBAプログラムにおいても順次処理が可能になります。

 次のVBScriptとVBAコードを用意します。
 <Sample.vbsの内容>

Msgbox "Sample.vbsが呼び出されました"
 <VBAのコード>

 1行目:  ' *
 2行目:  ' * 実行中のプログラムのハンドルを取得
 3行目:  ' *
 4行目:  Private Declare Function OpenProcess Lib "KERNEL32.DLL" ( _
 5行目:        ByVal Access As Long _
 6行目:      , ByVal Handle As Long _
 7行目:      , ByVal taskId As Long _
 8行目:  ) As Long
 9行目:  
10行目:  ' *
11行目:  ' * ハンドルのExitを検出
12行目:  ' *
13行目:  Private Declare Function GetExitCodeProcess Lib "KERNEL32.DLL" ( _
14行目:        ByVal Process As Long _
15行目:      , ByRef Code As Long _
16行目:  ) As Long
17行目:  
18行目:  ' *
19行目:  ' * ハンドルを閉じる
20行目:  ' *
21行目:  Private Declare Sub CloseHandle Lib "KERNEL32.DLL" ( _
22行目:        ByVal Object As Long _
23行目:  )
24行目:  
25行目:  Public Sub Sample_WaitOtherProcess_01()
26行目:      ' Shell() 関数で非同期処理を実行する。タスクIDを取得する。
27行目:      Dim taskId As Long
28行目:      taskId = Shell("WScript C:\Sample.vbs", vbNormalFocus)
29行目:  
30行目:      ' 実行中のプログラムのハンドルを取得する。
31行目:      Dim hdl As Long
32行目:      hdl = OpenProcess(&H400&, True, taskId)
33行目:  
34行目:      ' プログラムのハンドルを監視して、Codeが0になるまで待機する。
35行目:      ' これにより、Shell( ) 関数を利用した非同期処理の終了を検出できす。
36行目:      Dim rCode As Long, eCode As Long
37行目:      eCode = 0
38行目:      Do
39行目:          rCode = GetExitCodeProcess(hdl, eCode)
40行目:          DoEvents
41行目:      Loop While eCode = &H103
42行目:  
43行目:      ' ハンドルを閉じる。
44行目:      Call CloseHandle(hdl)
45行目:  
46行目:      ' 終了メッセージを表示する。
47行目:      MsgBox "終了"
48行目:  
49行目:  End Sub
 [Alt]+[F8]で"マクロ"ダイアログを起動し、Sample_WaitOtherProcess_01()を実行します。
 VBScriptが関数Shell()にて呼び出され、以下のメッセージボックスが表示されます。
 ここで、VBAプログラムはVBScriptの終了を検知するまで待機し続けます。VBAコードの47行目のメッセージボックスは表示されません。
 VBScriptのメッセージボックスの[OK]ボタンをクリックします。VBScriptのメッセージボックスを閉じた時点で、VBScriptのお役ごめんです。VBScriptの処理が終了したことを検出したVBAが終了メッセージを表示します。
 VBAから関数Shell()を用いた場合、その処理は非同期処理として扱われますが、この方法を用いれば、順次処理を実現できます。
ページの先頭へ