![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
![](http://oshiete.xgoo.jp/images/v2/common/profile/M/noimageicon_setting_09.png?e8efa67)
https://oshiete.goo.ne.jp/qa/8952035.html
前回質問では、shell実行した後待機、終了後に次行へうつりました。これを変更し、shell実行後は別なvba処理をしつつ終了監視し、終了したら別のshellを実行したいのです。
どうすればいいでしょうか?
No.2ベストアンサー
- 回答日時:
追伸
https://msdn.microsoft.com/ja-jp/library/cc42911 …
からの抜粋ですが
『戻り値
関数が成功すると、0 以外の値が返ります。
関数が失敗すると、0 が返ります。拡張エラー情報を取得するには、 関数を使います。』
なので#1の回答はあまり良くありません。
ProcessID(終了しているのでProcessIDは存在しない)を渡して0が帰ってくれば終了していると
考えたのですが・・・エラーになる場合は他にもあるでしょうから。。。
下記に差し替えを
Private Declare Function GetExitCodeProcess Lib "kernel32" _
(ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessID As Long) As Long
Private Declare Sub CloseHandle Lib "KERNEL32.DLL" (ByVal dwProcessID As Long)
Private Const PROCESS_QUERY_INFORMATION = &H400
Private Const STILL_ACTIVE = &H103
Function TaskEnd(ByVal dwProcessID As Long) As Boolean
Dim hProcess As Long
Dim lpdwExitCode As Long
Dim retVal As Long
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, True, dwProcessID)
retVal = GetExitCodeProcess(hProcess, lpdwExitCode)
Call CloseHandle(hProcess)
TaskEnd = Not (lpdwExitCode = STILL_ACTIVE)
End Function
Sub test()
Dim dwProcessID As Long
dwProcessID = Shell("C:\Windows\System32\calc.exe", 1)
MsgBox TaskEnd(dwProcessID)
Stop '電卓を閉じてください
MsgBox TaskEnd(dwProcessID)
End Sub
No.3
- 回答日時:
はい、そういう理解で良いと思います。
重複するProcessID が同時に存在することは無いので
これを手がかりに調べることになります。
No.1
- 回答日時:
VBA はマルチタスクの処理は出来ませんので
『しつつ』は無理かと。
逐一チェックして進めるか・・ぐらいでは。
sub test を実行してみてください。Calc.exe のパスが違うかも?
以下、標準モジュールにて。
Private Declare Function GetExitCodeProcess Lib "kernel32" _
(ByVal hProcess As Long, lpExitCode As Long) As Long
Private Declare Function OpenProcess Lib "kernel32" _
(ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, _
ByVal dwProcessID As Long) As Long
Private Declare Sub CloseHandle Lib "KERNEL32.DLL" (ByVal dwProcessID As Long)
Private Const PROCESS_QUERY_INFORMATION = &H400
Function TaskEnd(ByVal dwProcessID As Long) As Boolean
Dim hProcess As Long
Dim lpdwExitCode As Long
Dim retVal As Long
hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, True, dwProcessID)
retVal = GetExitCodeProcess(hProcess, lpdwExitCode)
Call CloseHandle(hProcess)
TaskEnd = (lpdwExitCode = 0)
End Function
Sub test()
Dim dwProcessID As Long
dwProcessID = Shell("C:\Windows\System32\calc.exe", 1)
MsgBox TaskEnd(dwProcessID)
Stop '電卓を閉じてください
MsgBox TaskEnd(dwProcessID)
End Sub
なお、長い処理時間のコード実行中に
別のプログラムなどを立ち上げた時にすでに閉じたプログラムと
同じProcessID が再度振り当てられる可能性については不明です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSPの処理の途中で、JavaScript...
-
非同期処理の終了監視2
-
VBA ステータスバー DoEvents
-
jscriptで空白を含む文字列の引...
-
初心者です。gulpでコンパイル...
-
デザイン時のVisible=Falseは実...
-
C#でボタン名を変更しても動く
-
VBA SORT Applyでエラー
-
jquery の書き始めについて
-
PowerPointで時計表示
-
リクエスト結果が一瞬しか表示...
-
Excelのマクロ一括実行ができな...
-
既存のwebサイトで、ローカルの...
-
ACCESS(VBA)の検索結果判定に...
-
シャットダウンスクリプトの記述
-
if(1){...}とはどういうことで...
-
MFC と CLIどちらを学ぶべきか。
-
resizeToメソッドが動作しません
-
〔Excel:VBA〕マクロの実行が異...
-
setTimeoutあるいはsetInterval...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSPの処理の途中で、JavaScript...
-
if(1){...}とはどういうことで...
-
デザイン時のVisible=Falseは実...
-
PowerPointで時計表示
-
初心者です。gulpでコンパイル...
-
〔Excel:VBA〕マクロの実行が異...
-
VBA ステータスバー DoEvents
-
リクエスト結果が一瞬しか表示...
-
innerHTMLなどの反映タイミング
-
JavaScriptでショートカットキ...
-
1つのVBAコードをすべてのコア...
-
C#でボタン名を変更しても動く
-
resizeToメソッドが動作しません
-
VBA SORT Applyでエラー
-
onload onunload onbeforeunloa...
-
VB.netの重複データ数カウント...
-
javascriptで最初のところに戻...
-
jQuery ui Datepicker 明日以降...
-
アクセスのフォームでタイマー...
-
計算結果が毎回違う。
おすすめ情報
ありがとうございます。
動作のしくみは以下のものでいいでしょうか?
電卓に限らずプログラムを起動すればプロセスIDを得られ、TaskEndを時々動かしてプロセスIDが稼働中かどうか調べ、プロセスIDが消失していたらプログラムが終了したと判る。RunスクリプトではプロセスIDを得られないため、Runで用意されている待機のみとなる。