• ベストアンサー

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を返すのでうまくいかないのではないのでしょうか

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C# Process.Start で標準入力

    はじめまして。 現在、C#で以下のような仕様のEXEをProcess.Startで起動し、ReadToEndで 結果を受け取りたいのですが、できません。 EXEの仕様: DOSプロンプトから以下のように起動します。 ■ xxx.exe < yyy.txt (yyy.txtを解析してDOSプロンプトに結果が出力されるプログラムです) 単に、xxx.exe yyy.txtと実行したのではエラーになるプログラムです。 期待する動き: ■ readToEndに出力ないようが表示される たとえばnotepad.exeのようなプログラムの際には、 Process.Start("notepad.exe", "open.txt"); とすればopen.txtがメモ帳で開かれますが、 今回質問させていただいた関数のように リダイレクト"<"が必要なプログラムで どう実装すれば、Process.Startで正常に動作してくれますでしょうか? よろしくお願いします。

  • Shellの使い方について

    VBを最近はじめたのですが、Shellがうまくいかず、困っています。 下記のような内容で、MS-DOS上で動作するプログラムをShellで呼び出していますが、ファイルが見つからないというエラーが出てしまいます。(<D:\kakasi\401.txt:No such file or directory) com1 = "kakasi.exe " + param + " <" + lbl_open_file + " > " + lbl_save_file retval = Shell(com1, vbNormalFocus) kakasi.exeには、パスが通してありますので、lbl_open_fileやlbl_save_fileのファイルが見つからないと思われます。 実行時のcom1の値は、kakasi.exe -Jk -Hk -Kk <D:\kakasi\401.txt > D:\kakasi\401.txt1 になっていて、DOSプロンプトから手入力、実行ではうまくいきます。 何が問題なのか分かる方、教えてください。 よろしくお願いします。

  • shell diff の使い方について

    shellで差分をとりたいとおもっているのですが・・・ aaa.txtの中身 ※1 aaaaaa_xxx.c ※2 bbbbbb_yyy.c . . . bbb.txtの中身 ※1 aaaaaa.c ※2 bbbbbb.c . . . aaa.txt、bbb.txtそれぞれに200近くのファイル名のみが入っています。 両方のテキストファイルを読み込み、それぞれの※1と※1、※2と※2というふうに 差分を見ていきたいと思っています。行はすべてバラバラです。 差分を見たい対象になる基準は・・・ 例えば、※1であればaaaaaaの部分が同じなので。 (ディレクトリもそれぞれファイルごとにばらばらです) ついでに差分の行数も出力したいと考えています。 なにか良い方法を教えていただけませんでしょうか? shellでつくりたいと思っています。 どうかよろしくお願いいたします。

  • shell関数について

    毎度、お世話になっています。 現在、C言語で書いた複数のプログラムをBATファイルで処理するように記述しています。VBでその制御を行っているのですが、VBの処理手順として子フォーム(textあり)にデータを書きこんで、ボタンを押すとshellでbatファイルを起動し、バッチファイルの結果として、あるディレクトリにresult.txtが作成され、VBで他の子フォームに読みとらせようとしているのですが、shellだと、実行の終了を待たずに次にいってしまうので、そのバッチファイルの実行処理が終わらず、result.txtの内容を読み込むことができません。 待つようにするにはどうすればよいのでしょうか? ちなみにVBは一週間前にはじめて、自分でも調べてなんとか作ろうとしたのですが、時間がないため、ここに質問させていただきました。なるべく簡単なアルゴリズムで、よろしくお願いします。 VBのプロセス    テキストにデータを書き込む      ↓     ボタン   →        テキストの内容を*.txtとして保存                        ↓                      バッチファイル起動    ↓(ここで右の実行を待たない     ↓     ので読み込むことができない)   C言語で書かれたプログラム実行                        ↓ result.txtを    ←        結果としてresult.txtが出来上がる 読み込んで表示     

  • VBAで他のプログラムを動かす

    VBAで他のプログラムを動かす時、 shellがあると思うのですが、これはexeファイルしか指定できないのですか? 具体的には指定したtxtファイルをメモ帳等で実行したいのです。 x=shell("目的のプログラム.txt",1) とやってもエラーが起こってしまいます。 どのようにしたらいいのでしょうか?

  • adb shellが実行出来ない。

    海外版のスマホを購入しました。 今は日本語表示がされないので、その設定をネットで調べてやっていってますが、コマンドプロンプトで“adb shell”と入力し実行すると、adbは内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッジファイルとして認識されません、と表示され実行されません。 ネットで参考にした情報は下記の通りです。 http://juggly.cn/archives/86324.html おそらく、「installer_r18-windows.exe」ファイルをダブルクリックして下さい。インストールが開始されます。という手順で、ダウンロードしたファイルで「installer_r18-windows.exe」というファイルが見当たらず インストールも出来ません。 何かが間違えているかもしれません。 お詳しい方お教え下さい。 よろしくお願いします。

  • VBAのSHELLを用いてEXEファイルを起動したものの、微妙にうまくいかない

    エクセルのVBAのshellを用いて、exeファイルを起動させてました。 exeファイルはCを用いたシンプルなもので、テキストファイルを作成します。(ソースは下記参照) C:\testのディレクトリにエクセルファイルを作成し、 Shell "C:\test\test.exe" を実行させたところ、ファイルはC:\testのディレクトリに出来ずに、マイドキュメントに出来ました。 このexeファイルを直接ダブルクリックしたときは、C:\testのディレクトリにテキストファイルが作成されます。 ダブルクリックしたときと同じように、C:\testのディレクトリにテキストファイルを作成する方法があれが教えてください。 よろしくおねがいします。 (ソース、hello.txtというファイルをつくり、hello!を書く) main( ) { FILE *fp; /* ファイルポインタ */ fp = fopen( "hello.txt", "w"); fprintf(fp,"hello!\n"); fclose(fp); return 0; }

  • WSHプログラミングで、Shell実行プロセスが終了しない内に、次の処理が実行されちゃいます・・・

    WSH(WindowsScriptingHost)でプログラミングを行っております。 以下のように、「A.exe」実行後、「B.exe」を実行するようにスクリプトを記述しています。 ところが、実際に実行してみると、「A.exe」が終了しない内に、「B.exe」が実行されてしまっている様なのです。 しかし、プログラム処理上、「A.exe」が実行終了してからでないと、「B.exe」を実行するのはまずいのです。 WSHで、「A.exe」が実行終了するまで、「B.exe」を実行させないようなスクリプトの記述方法を教えて下さい。 Set Shell = CreateObject("WScript.Shell") Shell.Run "cmd.exe /c D:\A.exe" Shell.Run "cmd.exe /c D:\B.exe"

  • Shell とcmd.exe /c start

    Shell "cmd.exe /c start " & Label1.Caption ラベルにURLを設定し、クリックした時にURLに飛ぶとあります。 コードの理解が難しく、お助け頂けませんか。 プログラミングもPCもド素人ですのでご了承下さい。。。 Shell:実行可能なプログラム(この場合ならcmd.exe?)を実行し、実行が完了するとプログラムのタスクIDを示す(このタスクidでプログラムを操作することになるのだろうか?)。 cmd.exe:コマンドプロンプト cmd.exe/c:コマンドプロンプトで特定のコマンド(URL先へ飛ぶ?)を実行後に終了させる? Label1.Caption:ラベルの内容(URL) startがわからない。何をstartするためのstart? cmd.exeのstart(起動)をShellが実行して、URL先に飛ぶ命令は残りのコードにある? 参照ページでも歓迎です。宜しくお願いします。

  • VBAでXCOPYの実行結果を取得したい

    VBAでshell関数を利用してXCOPYを実行し、テキストファイルにその実行結果を出力しています。 しかし、結果には D:\>xcopy D:\test\ssss.txt D:\test2 ファイルが見つかりません - ssss.txt 0 個のファイルをコピーしました もしくは D:\>xcopy D:\test\sssss.txt D:\test2 D:\test\sssss.txt 1 個のファイルをコピーしました というDOS画面で表示される内容が出力されているだけです。 ここでコピーに失敗している(0個のファイルをコピーしました)ファイル名だけを取得することは可能でしょうか? 色々サイトを検索してみましたが、答えが見つかりません。 恐れ入りますが、どなたかご存知の方がいらっしゃいましたらご教示ください。 よろしくお願いします。

スキャナーが使用できない
このQ&Aのポイント
  • プリンターを使用している間、スキャナーが使用できない状況です。1年以上使用していなかったため、久しぶりにスキャナーを使用しようとしましたが、「ネットワーク上にパソコンが見つかりません。パソコンと本製品が同じネットワークに接続されているか確認してください」というエラーメッセージが表示されます。
  • 問題解決のために、ソフトダウンロードや本製品の再起動、パソコンの再起動などを試しましたが、問題は解決されません。また、パソコンの「スキャナーとカメラ」に本製品が更新されていないことも確認しました。
  • お使いの環境はWindows 10から無料アップグレードしたWindows 11であり、無線LANで接続されています。関連するソフトやアプリについての情報は提供されていません。また、電話回線の種類はひかり回線です。
回答を見る

専門家に質問してみよう