Home >> ヒント・サンプル集 >> プログラムサンプル >> (VBA[関数] コマンドを実行して終了まで待つ

<VBA> [関数] コマンドを実行して終了まで待つ
SHELLコマンド(アプリケーションの実行コマンド)は、その終了を待たずに次のステップに進んでしまいます。(非同期実行) アプリケーションに何か作業をさせて、その終了を待って次に進みたいときはこのコマンドを使います

    Declare PtrSafe Function OpenProcess Lib "kernel32" (ByVal dwAccess As Long, ByVal lpCommandLine As Long, ByVal IDProcess As Long) As LongPtr 
    Declare PtrSafe Function GetExitCodeProcess Lib "kernel32" (ByVal lpdExitCode As LongPtr, hHandle As LongPtr) As Long 
    Declare PtrSafe Function CloseHandle Lib "kernel32" (ByVal hObject As LongPtr) As Long 

Public Function saExecCmd(cmdline As String)
    Const PROCESS_QUERY_INFORMATION = &H400
    Const STILL_ACTIVE = &H103
    Dim hProc As LongPtr
    Dim lExit As LongPtr
    Dim hShell As Long
    Dim bret As Long
    Dim rtn As Integer

    hShell = Shell(cmdline, 1)
    hProc = OpenProcess(PROCESS_QUERY_INFORMATION, False, hShell)
    Do
        GetExitCodeProcess hProc, lExit
        DoEvents
    Loop While lExit = STILL_ACTIVE

    bret = CloseHandle(hProc)
    If bret <> 0 Then rtn = 0 Else rtn = 1
    saExecCmd = rtn
End Function


上記コードをModuleに貼り付けます

【引数】・・・コマンド

【サンプル】
 c:\XXX.cmdを実行して、終了するまで待ちます
 r = saExecCmd("c:\XXX.cmd")
 if r = 0 then
  msgbox("終わりました")
 else
  msgbox("うまく終われませんでした")
 end if

【特記事項】
・リターンコードは、あくまでもプロセスが終了できたかどうかのため、処理が正常終了したかどうかの確認は別途行う必要があります
 バッチ処理等の場合は、処理の内部で結果をテキストファイルに書き込み、本関数終了後にそのテキストファイルを読み込んで処理結果を取得する等の対応が必要です

  お気軽にご相談ください お問合せ・ご相談はこちら お問合せ・ご相談はこちら  
更新日:2017/02/21 12:17