- ベストアンサー
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です
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
VBならこういう風にするのですが... ExcelVBAでは確認していませんが。 http://www.ops.dti.ne.jp/~allergy/vb/vbvba.html#exec
その他の回答 (2)
- papayuka
- ベストアンサー率45% (1388/3066)
こんにちは。 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
お礼
XXX.exeですが、2回目以降の実行では同じファイル名に上書きして結果を出力するので、Dirを使った方法では以前の結果を読み込むことになってしまいます。教えていただいた参考URLの方法はXXX.exeの終了を待つことができるのでうまくいきました。ありがとうございました。
- PAPA0427
- ベストアンサー率22% (559/2488)
ret = shell("XXX.exe") とし、CのEXEは戻り値を返すようにしたらいかがでしょう? 戻り値が取得できなけば、処理は勝手に前へ進まないと思いますが…。
お礼
XXX.exeは戻り値を返すのですが、shell関数はタスクIDを返すのでうまくいかないのではないのでしょうか
お礼
教えていただいた方法をExcelVBAで試してみましたが、shellで実行したプログラムの終了を待つことができ、思い通りの処理を行うことができました。ありがとうございました。