• ベストアンサー

VBAのShellの同期的実行

ExcelVBAについての質問です。コマンドプロンプトで実行するプログラムをCで作成しました(これをXXX.exeとします)。このプログラムは計算が終了した後で、その結果のファイルを作成します(これをYYY.txtとします)。このプログラムを操作し、結果を表にして出力するために、ExcelVBAでshellを使って以下のようなプログラムを作成しました。   shell("XXX.exe")   call Output Outputでは、XXX.exeが作成したファイルYYY.txtからデータを読み込んでシートに結果を出力するのですが、うまくファイルを読み込みません。多分、shellにより実行したXXX.exeが終了する前にOutputが呼ばれているのだと思うのですが、もしそうだとしたらどのような解決方法があるのでしょうか。よろしくお願いします。 WinXp、Excel2000です

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

  • ベストアンサー
  • MovingWalk
  • ベストアンサー率43% (2233/5098)
回答No.2

VBならこういう風にするのですが... ExcelVBAでは確認していませんが。 http://www.ops.dti.ne.jp/~allergy/vb/vbvba.html#exec

参考URL:
http://www.ops.dti.ne.jp/~allergy/vb/vbvba.html#exec
kary
質問者

お礼

教えていただいた方法をExcelVBAで試してみましたが、shellで実行したプログラムの終了を待つことができ、思い通りの処理を行うことができました。ありがとうございました。

その他の回答 (2)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.3

こんにちは。 TimerとDirでYYY.txtの作成を待つとか。。 Sub Test() Dim i As Integer, Start Shell("XXX.exe") i = 0 Do While i < 10 And Dir("C:\YYY.txt") = ""   Start = Timer   Do While Timer < Start + 0.5    DoEvents   Loop  i = i + 1 Loop If i = 10 Then Exit Sub Call Output End Sub でもきちんとプロセス終了を待つのが正でしょうね。^^; ↓ http://www2.moug.net/cgi-bin/technic.cgi?exvba+TI15010034

参考URL:
http://www2.moug.net/cgi-bin/technic.cgi?exvba+TI15010034
kary
質問者

お礼

XXX.exeですが、2回目以降の実行では同じファイル名に上書きして結果を出力するので、Dirを使った方法では以前の結果を読み込むことになってしまいます。教えていただいた参考URLの方法はXXX.exeの終了を待つことができるのでうまくいきました。ありがとうございました。

  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.1

ret = shell("XXX.exe") とし、CのEXEは戻り値を返すようにしたらいかがでしょう? 戻り値が取得できなけば、処理は勝手に前へ進まないと思いますが…。

kary
質問者

お礼

XXX.exeは戻り値を返すのですが、shell関数はタスクIDを返すのでうまくいかないのではないのでしょうか