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で質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBA ユーザーフォーム 3 2022/04/14 10:30
- フリーソフト タスクソフト? 1 2023/01/14 07:52
- 日本語 「2014年に終了」「2014年で終了」「2014年をもって終了」の違い 8 2022/11/28 20:08
- Visual Basic(VBA) VBAでOutlookを終了させたい ExcelVBAで既に起動されているOutlookを終了させる 3 2022/03/24 07:37
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Excel(エクセル) Excel2010 VBAが特定動作で実行出来なくなる 7 2022/12/29 14:26
- Visual Basic(VBA) エクセルVBA コードが同じでもファイルによって処理速度が大きく変わるのはなぜ 5 2022/11/06 21:34
- 電車・路線・地下鉄 「幕回し」から「幕」が外されるタイミングは? 定期運行が終了したら「幕」が外されるとは限らない? 3 2022/07/12 20:33
- 高齢者・シニア Windows11適用の最低性能に満たないPC利用者がサポート終了でパソコンを買い替えるでしょうか? 2 2023/05/27 06:43
- iPhone(アイフォーン) 容量は半分以上あるのにアプリが強制終了する理由はなんですか? CPUがどのような状態なのでしょうか? 8 2023/08/27 00:50
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
デザイン時のVisible=Falseは実...
-
PowerPointで時計表示
-
if(1){...}とはどういうことで...
-
jQuery ui Datepicker 明日以降...
-
VBA SORT Applyでエラー
-
VB.netでタイマーがスタートし...
-
初心者です。gulpでコンパイル...
-
JSPの処理の途中で、JavaScript...
-
VBA ステータスバー DoEvents
-
ラベルの色がかわってくれない
-
オーバーライドについて。
-
GoTo文とかSelect文の処理の仕...
-
JavaScriptでショートカットキ...
-
system関数を使用時にDos窓を最...
-
乱数の表示
-
CreateFile、CloseHandleの繰り...
-
VB.netの重複データ数カウント...
-
Excel VBA にて JavaScript の...
-
javascriptでsjisの文字列からu...
-
1つのVBAコードをすべてのコア...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
以下のコードを実行しても、オ...
-
JSPの処理の途中で、JavaScript...
-
if(1){...}とはどういうことで...
-
1つのVBAコードをすべてのコア...
-
VBA ステータスバー DoEvents
-
〔Excel:VBA〕マクロの実行が異...
-
jQuery ui Datepicker 明日以降...
-
デザイン時のVisible=Falseは実...
-
VBA SORT Applyでエラー
-
リクエスト結果が一瞬しか表示...
-
C#でボタン名を変更しても動く
-
PowerPointで時計表示
-
innerHTMLなどの反映タイミング
-
javascriptで最初のところに戻...
-
初心者です。gulpでコンパイル...
-
onbeforeunload と aタグの hre...
-
ラベルの色がかわってくれない
-
エクセル VBA タイマー動作 の...
-
JavaScriptで、実行するたび値...
-
Excel VBA にて JavaScript の...
おすすめ情報
ありがとうございます。
動作のしくみは以下のものでいいでしょうか?
電卓に限らずプログラムを起動すればプロセスIDを得られ、TaskEndを時々動かしてプロセスIDが稼働中かどうか調べ、プロセスIDが消失していたらプログラムが終了したと判る。RunスクリプトではプロセスIDを得られないため、Runで用意されている待機のみとなる。