🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

Q&A

解決済

2回答

3812閲覧

ExcelVBAでコマンド実行 非同期の場合の終了確認

poporon7

総合スコア22

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

コマンドライン

コマンドライン(別名:Command Line Interface)は、ユーザに命令の入力を促す(プロンプト)文字列の表示を行い、すべての操作をキーボードを用いて文字列を打ち込む事でプログラムを走らせるユーザインターフェースです。

0グッド

0クリップ

投稿2021/02/08 10:36

編集2021/02/09 00:56

いつもお世話になっております。
ExcelVBAで WshShellを使いRunメソッドで非同期にしてバッチファイルを実行した後、
pauseで画面を止めているのですが、画面を×で閉じた後に
MsgBox("終了しました。")
とメッセージが出す方法はないでしょうか。
つまり、コマンド画面を閉じたかどうかがわかるような方法はありますでしょうか。

同期にすればよい話なのですが、パソコンが5分ごとにSleepになる設定で、バッチ処理が40分程かかるために3分ごとにSendKeysでCtrlキーを押すことによりSleepを回避しています。

(1)同期にするとスリープ対策ができない。
(2)非同期だと終了メッセージが出せない。

ということで、悩んだ末、非同期でSleep対策をすることにしたのですが、上記の処理でつまずきました。
1,2について何か良い方法がありましたらご教示いただけるとありがたいです。

よろしくお願いいたします。


●案2でテストしてみました。

vba

1 2 myTITLE="aaa" 3 WSH.Run "%ComSpec% /c " & Cmd, 1, False 4 5 Do 6 DoEvents 7 WSH.AppActivate myTITLE 8 Loop While Err = 0 9 10 Err.Clear 11 12 MsgBox ("終了しました") 13 14としたのですがタイトルのウインドウを閉じてもErr=0のままになってしまい、ループしたままです。 15タイトル名も変えてみたのですが状況は変わりませんでした。 16何がいけないのでしょうか!?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

案1:プロセス一覧を取得して、コマンドラインを見て起動したのと同じ物があるか見る。

案2:バッチ内でtitleコマンドでウィンドウタイトルを指定し、VBAのAppActivateでそのウィンドウタイトルのウィンドウをアクティブにして、エラーになれば終了していると判断する。

投稿2021/02/08 11:29

otn

総合スコア85882

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

poporon7

2021/02/08 11:52 編集

otnさん ありがとうございます! 案1は私の力不足で無理だと思うのですが、案2は想像がつきます。 ですが、アクティブにしてエラーになれば終了していると判断するという方法が私には思いつきませんでした!ありがとうございます!試してみます。
otn

2021/02/08 11:54

丁度一致するウィンドウが無い場合、部分一致でも成功するようなので、設定するタイトルに注意です。
poporon7

2021/02/08 11:58

そうなのですね!ありがとうございます。 絶対にかぶらないようなウインドウタイトルを付けて試してみます。
poporon7

2021/02/09 00:57

otnさん、上記追加のように試してみましたが、ウインドウが閉じてもエラーにならずに困っています。 お知恵を拝借できないでしょうか。。
otn

2021/02/09 09:10

やってみましたが、存在しないウィンドウタイトルを指定すると、実行時エラー5になります。 他のウィンドウタイトルに合致しているのでは?
poporon7

2021/02/09 10:41

お手数おかけして申し訳ありませんでした。Errがでるなんて羨ましい限りです。きっとタイトルの付け方が悪いのだと思いますが、どう頑張ってもできなかったので、FindWindowで何とか解決しました。 otnさんのヒントのおかげで道が開けましたのでベストアンサーとさせていただきます。 本当にありがとうございました!
guest

0

パソコンのスリープを回避するために指定時間ごとにSendKeysでCtrlを打つ処理を行いたいので、
非同期でコマンド処理を実行し、ウインドウが終了したらタイマー解除とメッセージを表示する方法です。

```VBA 'スリープにしないためのタイマー起動 Call TimerStart 'コマンド cmdTxt = 〇〇〇

  ’非同期で実行
WSH.Run "%ComSpec% /c " & cmdTxt, 1, False

'ウインドウが開くまで待機 Sleep 1000 'ウインドウが閉じるまでループ Do DoEvents 'コンソールウインドウのハンドル取得 hwnd = FindWindow("ConsoleWindowClass", vbNullString) Loop While hwnd <> 0 'タイマー終了 Call TimerStop

  MsgBox("終わりました")

投稿2021/02/09 10:37

poporon7

総合スコア22

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問