• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAで外部プログラムを非表示で実行するには)

VBAで外部プログラムを非表示で実行する方法

このQ&Aのポイント
  • Excel2010のVBAから、外部プログラム(test.exe)を非表示で実行する方法について教えてください。
  • test1のプログラムでエラーを回避する方法、または、test2のプログラムでコマンドプロンプトのウィンドウを非表示にする方法を教えてください。
  • VBAとVBScriptを混同しているかもしれませんが、Excel2010のVBAからtest.exeを非表示で実行し、終了を待ってから次の処理を行いたいです。

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

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

Runメソッドを何処で調べましたか? 詳しくはこちらを見てください。 http://msdn.microsoft.com/ja-jp/library/cc364421.aspx 先ず、Aで失敗する理由ですが、Runメソッドの戻り値は何型ですか? 説明を見れば分かると思いますが、整数です。オブジェクトでは ありません。従って、戻り値の型が違うし、Set文を使うのもオカシイ 次に、プログラムの終了を待つなら、Runメソッドの第3引数は 省略するか、Trueを指定すべきです。 test2のExecメソッドはオブジェクトを返しますが、この中には 標準入出力やエラー出力用の出し入れ口があり、人に代わって データを送り込んだり、出力結果を見て、処理を変更するなどを 行う場合に使いますので、今回の仕様では使いません。 尚、DoEventsでグルグル回る処理は絶対にすべきではありません。 必ずSleepを入れるべきだし、DoEventsの使用そのものを避ける べきだからです。この文がどのような効果をもたらすかを理解しており、 それを制御できるだけの技術があれば別ですが・・・

yam2012
質問者

お礼

教えて頂きました間違いの箇所を修正しましたらコンドプロンプトのウインドウが非表示のままで正しく実行することができました。ありがとうございました。 なお、回答の中で、「DoEventsでグルグル回る処理は絶対にすべきではありません。必ずSleepを入れるべきだし、DoEventsの使用そのものを避けるべきだからです。」ということが書かれていて、なぜなのかがよく分かりませんでしたので、いろいろ調べていましたが結局よく分かりませんでした。ネット上でもこのような処理をしているのをよく見かけるのですが(http://officetanaka.net/excel/vba/tips/tips27.htmなど)、どのような問題が起こり得るのでよろしくないのかがよく分からないので教えて頂けないでしょうか。よろしくお願いします。

その他の回答 (2)

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

#2です。 DoEvents文を実行すると、溜まっていた各種イベントが実行されます。 これに伴い、イベントプロシージャ(VBA)が実行されたり、セルの 内容が変化することもあります。極端な例ではプロセスの終了も 起こり得ます。本来の処理が中途で終わってしまったり、実行条件の 共通変数の内容が変化する可能性があります。このような事象が発生 することを承知の上で使うなら良いのです。 「何でDoEventsがいけないの?」と質問されるということはこの辺の 事情をご存じないのではないでしょうか? 故に「勧めない」と申し上げたのです。 尚、Sleepを入れないと、CPUタイムスライスを浪費して全体の パフォーマンスに甚大な悪影響が出ます。 SleepはVBAではDeclarationsで以下のように定義します。 Declare Sub Sleep Lib "kernel32" (ByVal 休止時間 As Long) 【使用例】 Do Until we.Status   DoEvents   Sleep 1 '1ミリ秒休止 Loop Sleepを入れないと、CPU使用率は100%近くになるはずです。 Sleepを入れると、CPU使用率はほぼ0です。 尚、Runメソッドで待機をTrueにすれば、上記の問題は起きません。

yam2012
質問者

お礼

DoEventsだけだと少なくとも60%以上には上がっていましたがSleep 1を入れるとほぼ0%に下がっていました。このあたりのことはVBAの書籍ではあまり触れられていないのでとても参考になりました。 これからはSleep 1を入れるようにします。 ありがとうございました。

  • rinkun
  • ベストアンサー率44% (706/1571)
回答No.1

良く分かってないので勘違いがあるかもしれないけど。 test.exeはGUIアプリ? それともコンソールアプリ? GUIアプリならRunに "%ComSpec% /c " は不要で、それで上手くいくかも。 コンソールアプリなら完全に非表示にするのは多分無理なのでウィンドウを7(最小化)にしてみる。

yam2012
質問者

お礼

実行したいのはコンソールアプリの方です。 nda23さんの回答の対策をしましたらコマンドプロンプトのウインドウが非表示のまま実行できました。 また、ウィンドウを7(最小化)でも確認してみましたら、タスクバーにアイコンは表示されますが、コマンドプロンプトのウインドウは非表示で実行できました。 ありがとうございした。

関連するQ&A