Shell
次の関数を使用して、VBA からバッチ スクリプトを起動しています。
myRes = Shell("myScript.cmd")
正常に実行されたかどうか、または実行エラーが発生したかどうかを知る方法はありますか?
Shell
次の関数を使用して、VBA からバッチ スクリプトを起動しています。
myRes = Shell("myScript.cmd")
正常に実行されたかどうか、または実行エラーが発生したかどうかを知る方法はありますか?
ネイティブのシェル関数ではなく、 WshShellオブジェクトを試すことをお勧めします。
Dim wsh As Object
Set wsh = VBA.CreateObject("WScript.Shell")
Dim waitOnReturn As Boolean: waitOnReturn = True
Dim windowStyle As Integer: windowStyle = 1 'or whatever suits you best
Dim errorCode As Integer
errorCode = wsh.Run("myScript.cmd", windowStyle, waitOnReturn)
If errorCode = 0 Then
MsgBox "Execution successful. No error to report."
Else
MsgBox "Program exited with error code " & errorCode & "."
End If
ただし、次のことに注意してください。
が false (デフォルト) に設定されている場合
bWaitOnReturn
、Run メソッドはプログラムの開始直後に戻り、自動的に 0 を返します (エラー コードとして解釈されません)。
したがって、プログラムが正常に実行されたかどうかを検出するwaitOnReturn
には、上記の例のように True に設定する必要があります。それ以外の場合は、何があってもゼロを返します。
私のこの以前の回答も役立つかもしれません。
コマンドが成功時に 0 を返す場合は、エラー レベルをキャッチできます: http://www.devx.com/vb2themax/Tip/18663
プロセスの終了コードを取得する
場合によっては、特に VB アプリケーション内から MsDos バッチ ファイルを実行するときに
ERRORLEVEL
、外部アプリケーションによってセットを決定することが必要になる場合があります。単純な Shell ステートメントではできませんが、GetProcessExitCode
API 関数のサポートにより、作業が簡単になります。Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Private Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As _ Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long Private Declare Function GetExitCodeProcess Lib "kernel32" (ByVal hProcess As _ Long, lpExitCode As Long) As Long Const STILL_ACTIVE = &H103 Const PROCESS_QUERY_INFORMATION = &H400 Private Sub cmdRunNotepad_Click() Dim hTask As Long Dim hProcess As Long Dim exitCode As Long hTask = Shell("Notepad", vbNormalFocus) hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, hTask) ' loop until the process returns a valid exit code Do ' relinquish this CPU time slice Sleep 100 DoEvents ' query for exit code GetExitCodeProcess hProcess, exitCode Loop While exitCode = STILL_ACTIVE MsgBox "Exit code = " & exitCode, vbInformation End Sub
フランチェスコ・バレナ
または、次のようなことを試すことができます。
myRes = Shell("cmd /c myScript.cmd&&echo success")
条件付き実行に関する詳細はこちら: http://www.robvanderwoude.com/condexec.php
ただし、どちらの場合も、終了コードに依存しています。