• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:EXCEL2000 VBA 他のブックのマクロを制御したい)

EXCEL2000 VBA 他のブックのマクロを制御したい

このQ&Aのポイント
  • EXCEL2000 VBA 他のブックのマクロを制御する方法について
  • EXCEL2000 VBAを使用して、複数プロセスで実行しているマクロを制御する方法を教えてください。
  • 複数プロセスで実行しているマクロを中断や継続する方法について、EXCEL2000 VBAを使用して教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.3

こういうのがWindowsAPI ↓ Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) CreateProcessもWindowsAPIの一種です。 Windows Scripting Hostはとても便利なので、覚えておいて損はない でしょう。 >「マクロAからマルチプロセス稼働中のマクロを制御できない」 再三、申し上げている通り、VBAでマルチスレッドはできません。 実際は実行中のプログラムがDoEventsを実行し、その時にイベントが 発生しており、しかもイベントプロシージャが記述されていると、 そのイベントプロシージャは実行されます。つまり、DoEventsを実行 したスレッドとイベントプロシージャを実行するスレッドが同時に 存在する状態になります。VBはこの状態を想定していないので、 その後の動作に不安が残ります。大丈夫ともダメとも言えません。 そういう意味でもDoEventsは怖いのです。 こういった諸々の事情を承知の上で、プログラムすることは可能 ですが、あまり薦められません。 >上記のSleepを使ったコードで問題ないか 問題ないです。 >同期をとる 他にはWindows Scripting HostのRunメソッドがあります。 http://msdn.microsoft.com/ja-jp/library/cc364421.aspx 尚、Sleepを使う方法はCtrl+Breakで中断できますが、Runメソッドを 使う方法では制御が戻るまで中断できません。 但し、絶対に中断しないというのであれば、Runメソッドの方がタイム スライスを使わないので、処理効率の点では有利です。

center69
質問者

お礼

nda23様、今回もいろいろとアドバイスをいただき、感謝いたします。 DoEventsを使わず、Sleepで待機させる方法でも問題なくマクロAは動きました。 ありがとうございました。 Runメソッドに関しては機会があれば挑戦してみたいと思います。 今後とも、よろしくお願いいたします。

その他の回答 (2)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

With CreateObject("WScript.Shell").Exec("外部プログラム名")   While .Status = 0    DoEvents   Wend End With これは"外部プログラム名"をコマンドプロンプトから実行する時と 同じように起動し、終了状態(Status)が未完の間、ループするという コードです。 先ず、第一にDoEventsが気に入りません。このステートメントの 意味、怖さを知った上で使う必要があります。私がPMなら事情の 如何を問わず、DoEventsの使用は却下します。 DoEventsを使っているので、「フリーズした」と言うのは勘違いだと 思います。シートの切り替えやスクロールは動くはずです。 ShellのExecメソッドを使う以上、コマンドプロンプト画面が表示 されるのですが、これは表示されているでしょうか? 表示されているなら、外部プログラムがフリーズしている状態です。 表示されていないなら、外部プログラムは起動していないか、終了 しています。 "外部プログラム名"を正確に知りたいですね。ここでExcelを使って いれば、多重起動の可能性、あるいは資源の競合が考えられます。 とりあえず、マクロAを実行せず、同じ状況でコマンドプロンプトから "外部プログラム名"を実行してみてください。 CreateProcessとShellのExecは似たような話で、どちらもプロセスを 起動させる機能があります。勿論、Execは中でCreateProcessを使って います。尚、Execはハンドルの継承はできず、コマンドプロンプトを 非表示にすることも出来ません。 http://msdn.microsoft.com/ja-jp/library/cc364436.aspx http://msdn.microsoft.com/ja-jp/library/cc364356.aspx

center69
質問者

補足

nda23様、回答ありがとうございます。 Windows Scripting Hostという新たな難題を私は使っていたのですね。 DoEventsに関しては調べてみて何となく怖さが分かりました。 予期しないイベントが発生したら、どうなるか分からないと言うことでしょうか。 今回の質問内容からは逸れますが、私がやりたいことは外部プログラムが終了するまでVBAに待っていて欲しいだけなので、下記コードのようにStatus=0の間Sleepでたとえば1秒間待たせればいいのでしょうか。 Private Declare Sub Sleep Lib "KERNEL32.dll" (ByVal dwMilliseconds As Long) With CreateObject("WScript.Shell").Exec("外部プログラム名")   While .Status = 0    Sleep(1000)   '←1秒待機   Wend End With さて、本題のマルチプロセス稼働中のマクロAのフリーズ(処理待ち状態?)の件ですが、外部プログラムはEXCELではなくUWSCというWindows自動化ソフトを起動しています。 フリーズの際、UWSCのプロンプトは閉じていますので、UWSCがフリーズしているわけではないようです。 原因を冷静に考え直しました。 先日の質問の際、マルチプロセス数は6プロセスでした。その際はマクロAは正常に動作していました。 現在は、ループ回数を偶数、奇数に分けて12プロセスで稼働させています。 どれくらい処理時間に変化が出るかを調べたかったからです。 たぶんそのせいではないかと思います。 マルチプロセスのプロセス数を元の6プロセスに戻せば問題は解決すると思います。 現在稼働中のマルチプロセスが終了したら、プロセス数を減らして試してみます。 今回の質問に対する結論は「マクロAからマルチプロセス稼働中のマクロを制御できない」と言うことで納得しました。 そして、プロセス数を多くしすぎると資源の競合が起こる可能性があるということだと思います。 お暇な時で結構ですので、上記のSleepを使ったコードで問題ないか、あるいは他にDoEventsを使わないで外部プログラムと同期をとる(VBAに外部プログラムの終了を待たせる)方法があれば、教えて頂ければと思います。 よろしくお願いいたします。

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

>フリーズする マクロAはマルチプロセスで稼働中のブック上にあるのですか? だとすれば動きません。VBはマルチスレッドにできません。 もし、全く別のブックにあり、別プロセスで動かしているのに 反応しないとすると、資源の競合が発生している可能性があります。 フリーズするマクロで、WindowsAPIなどを使っていますか? APIの入出力の中には資源が使えるようになるまで制御を戻さない ものが結構あります。 手動(CreateProcessを使わない)でプロセスを起動した場合、 起動したプロセスと、起動されたプロセスの間に親子関係がないので、 ハンドルを継承することが出来ません。これは排他や同期を制御でき ないことを意味します。 また、プロセスやスレッドのハンドル(CreateProcessの結果として 得られる)を使った制御(できることは少ないが)は全くできません。

center69
質問者

補足

nda23様、回答ありがとうございます。 返事が遅れましたことをお許しください。 マクロAはマルチプロセスで稼働中のブックとは全く別のブックにあるものです。 WindowsAPIというものがよくわかっていませんが、EXCEL外部とやりとりするコードはあります。 あるサイトで知った外部プログラムの実行、実行終了待ちができる下記コードを使っています。 恥ずかしながら、下記コードが何をやっているコードかはさっぱりわからず、コピペで使わせてもらっています。 With CreateObject("WScript.Shell").Exec("外部プログラム名")   While .Status = 0    DoEvents   Wend End With これが原因なのでしょうか。 これを知る以前はShell関数で外部プログラムを立ち上げて、Sleepを入れてShell関数の外部プログラムとの非同期を回避していたんですが、そっちに戻した方がいいのでしょうか。 ちなみにマルチプロセスは手動で行っています。 CreateProcessの使い方が全くわからないもので・・・ よろしくお願いいたします。

関連するQ&A