• ベストアンサー

VBAでEXEファイルを動かす方法について

エクセルのVBAをつかってC++で作ったexeファイルを起動させるプログラムを書きたいと思いますが、うまくいきません。 プログラムは下記です。 Sub Macro1() Shell ("C:\test.exe") End Sub エラーは出ないのですが、計算をしません。 ・VBEの参照設定のmicrosft scripting runtimeはクリックいれてます。 ・test.exe自体はクリックすると起動して計算します。 もし、対応策をご存知なら教えていただければ助かります。 よろしくお願いします。

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

  • ベストアンサー
  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.4

> ただ、shellでexeを起動させると、なぜかマイドキュメントにファイルは作成されていました。 > これはなぜでしょうか? 最初の投稿で述べた > 「カレントフォルダ(作業ディレクトリ)」があっていないとか・・・ でしょうね。 「カレントフォルダ」はご存知ですよね? フルパス指定をしない場合(フォルダ指定が無い場合等)にファイルが作成されるフォルダです。 ですから、 > fp = fopen( "hello.txt", "w"); した場合、カレントフォルダにファイルが作成されます。 で、Excelの「カレントフォルダ」は、自動的に「マイドキュメント」になるようです。 ですから、VBAからShell関数で呼び出したプログラムで、 フルパス指定をしないファイルも「マイドキュメント」に作成されてしまいます。 Shell関数実行前に、カレントフォルダの変更を行ってみてください。 例えば、「D:\X」にしたい場合、 ---------------------------------------------- Sub Macro1() '------ 元のカレントフォルダを記憶しておく ---- Dim CF As String CF=CurDir() '------ カレントフォルダを変更 ---- ChDrive "D:" ChDir "D:\X" ' ----- Shellを実行 Shell ("D:\X\test.exe") '------ カレントフォルダを元に戻す ---- ChDrive CF ChDir CF End Sub ---------------------------------------------- とか・・・

8tomato8
質問者

お礼

dsuekichi様 最後までご丁寧な回答をいただき、本当にありがとうございます。 確かに、カレントフォルダのお話は最初から教えていただいていました。。。 EXEファイルを直接クリックしたときは、そのEXEファイルの置いてあるディレクトリのファイルを認識していたので、てっきりVBAでも同じことが行われると思っていましたが、大きな勘違いでした。 カレントディレクトリの問題はプログラムの基礎の基礎なので、特にSHLL関数の使い方のHPをチェックしても載ってなかったのだと思います。 総括すると、今回のSHELLの問題は二つあり 1、EXEファイルが終わるまで待つようにする 2、EXEファイルはカレントディレクトリが当然デフォルトで設定されているので、VBAでSHELLを使う時はディレクトリを変更する ということで、dsuekichi様は最初から見抜いていらっしゃったと思います。 それなりに調べたつもりだったのですが、結局元に戻ってきたということで赤面です。 おかげさまで、約一ヶ月悪戦苦闘してようやく動くようになりました。 本当にありがとうございます。

その他の回答 (3)

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.3

変ですね・・・ > ・shell()だと、窓が一瞬出てすぐに消えてしまいます。 実際のコードはどうなっています? > Shell ("C:\test.exe") とした場合や、 > www.moug.net/tech/exvba/0150034.htm のサンプルのコードのままだと、『DOS窓は表示されない』はずですが・・・ #「アイコン状態で起動する」のでタスクバーには表示されますが・・・ ためしに、起動するプログラムをメモ帳("C:\WINDOWS\NOTEPAD.EXE")にすると、どういう動作になりますか? また、 ------------------------------------- C:\test.exe PAUSE ------------------------------------- の2行だけのバッチファイルを作成して、それをShellで呼び出すとどうなります? また、似たようなサンプルに、 「[XL97]Shell関数で起動したアプリケーションの終了を認識する方法」 (http://support.microsoft.com/kb/408064/ja) こういうのがありますけど・・・同じでしょうか? #起動したプログラムの方の問題の可能性は?

8tomato8
質問者

お礼

dsuekichi様 何度もメールしていただき、本当にありがとうございます。 1、「[XL97]Shell関数で起動したアプリケーションの終了を認識する方法」 も残念ながらダメでした。 2、実際のコードはShell ("C:\test.exe")でパスがもう少し複雑になっていますが、DOS窓が一瞬開いてます。。。 3、>#起動したプログラムの方の問題の可能性は?   >("C:\WINDOWS\NOTEPAD.EXE")にすると、どういう動作 ShellExecuteを使って、 "C:\test.exe"を選ぶとexeファイルは起動されますので、プログラム自体は問題ないと思っていましたが、一度シンプルなexeファイルで動くようにしてみたいと思います。 4、>C:\test.exe PAUSEの2行だけのバッチファイルでは? バッチファイルがわかってないので(すみません、VBAもC++も付け焼刃で)なので、上記あわせてトライしてみてどちらにしてもご報告します。 迅速なお返事本当にありがとうございます。

8tomato8
質問者

補足

dsuekichi様 返事が遅くなり、申し訳ありませんでした。 1、("C:\WINDOWS\NOTEPAD.EXE")は成功しました 2、バッチファイルはだめでした。 ですが、実はexeファイルは起動していました。 テストに使ったexeファイルはダブルクリックするとそのexeファイルがあるディレクトリにテキストファイルを作成するシンプルなものです。(ソースは下記参照) ただ、shellでexeを起動させると、なぜかマイドキュメントにファイルは作成されていました。 これはなぜでしょうか? もし、ダブルクリックしたときと同じように、exeファイルがあるディレクトリにテキストファイルを作る方法があれば教えてください。 よろしくおねがいします。 (ソース) main( ) { FILE *fp; /* ファイルポインタ */ fp = fopen( "hello.txt", "w"); fprintf(fp,"hello!\n"); fclose(fp); return 0; }

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.2

> 計算は一分くらい掛かるものなので、それが原因かなあ、とも思ってます。 確認です。 > 計算をしません。 と判断した理由は何なんでしょう? #どういうコードで「計算していない」ことを確認しましたか? Shell関数は、「非同期処理」なので、呼び出したプログラムの終了を待ってはくれません。 例えば、C++プログラムが計算終了時(つまり起動の1分後)に、結果をファイル出力する仕組みになっていて、 VBプログラムが、Shell実行直後に、そのファイルの有無をチェックしていいたりすると、 ファイルは存在しないことになりますが・・・

8tomato8
質問者

お礼

dsuekichi様 お返事していただき、本当にありがとうございます。 ご指摘の通り、このexeファイルをエキスプローラーからクリックさせて起動させると、あるテキストファイルを読み込み、計算をし、結果のテキストファイルを複数出します。 最初のテキストファイルを出すのに5秒程度、全てのファイルを出すのに一分程度掛かります。 対策として下記HPなどを参考にして、exeファイルが終了するまで待つような仕組みをVBAに入れてみました。 http://www.moug.net/tech/exvba/0150034.htm このプログラムではエラーは出なかったものの、exeファイルの起動が確認できないまま終わってしました。。。 (単なるshellだと、一瞬窓が開くのが確認出来ます) 大変困っており、他の対策(vbaの工夫、exeファイルのプログラムの工夫や有料相談所など)をご存知なら大変助かります。 お返事本当にありがとうございました。

8tomato8
質問者

補足

dsuekichi様 補足です よく読むと >と判断した理由は何なんでしょう? >#どういうコードで「計算していない」ことを確認しましたか? に答えてませんでした。 通常はexeファイルをクリックさせて起動させると、テキストファイルを読み込み、計算し、テキストファイルを出すのですが(最低5秒)、それが出ません。 ・shell()だと、窓が一瞬出てすぐに消えてしまいます。 ・HPなどをみて、exeファイルが終わるまで待つVBAを書いてみましたが、エラーはでないものの、窓も出ずに終わってしまいました。 よろしくおねがいします。

  • dsuekichi
  • ベストアンサー率64% (171/265)
回答No.1

> test.exe自体はクリックすると起動して計算します。 というのは、エクスプローラからですか? では、 「スタートメニュー」の「ファイル名を指定して実行」で実行するとどうなります? どういう「計算」をするのか分かりませんが・・・ 「カレントフォルダ(作業ディレクトリ)」があっていないとか・・・ #その「C++で作ったexeファイル」は、カレントフォルダに、 #設定ファイルや入力ファイル、出力ファイルが必要なつくりになっているとか・・・ 余談ですが、 > Shell ("C:\test.exe") この呼び方、実は間違いですよ。 > Shell "C:\test.exe" か、 > Call Shell ("C:\test.exe") か、 > Dim ret As Long > ret = Shell ("C:\test.exe") にしましょう。

8tomato8
質問者

お礼

dsuekichiさん お返事ありがとうございます 文法を教えていただきありがとうございました! 「スタートメニュー」の「ファイル名を指定して実行」だと大丈夫でした。 計算は一分くらい掛かるものなので、それが原因かなあ、とも思ってます。

関連するQ&A

  • 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; }

  • VBA Shell

    VBA のコマンドボタンで他のソフトを起動したいのですが Private Sub CommandButton1_Click() Shell "C:\Windows\Notepad.exe", 1 End Sub でノートパットは起動しますが マイドキュメントに置いてある XX.EXEを起動したくて Private Sub CommandButton1_Click() Shell "C:\Users\X\Documents\XX.exe", 1 End Sub としても起動しません この方法で マイドキュメントに置いてある XX.EXEを起動することは出来ないのでしょうか

  • vbaでpdfを開く方法

    Sub test() Dim myFile As String myFile = "C:\Users\ダミー.pdf" Shell """C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe""" & myFile End Sub これでいけるかと思ったのですが、AdobeReader自体は起動するのですが、肝心のファイルは開きません。 エラーにもなりません。 Program Files (x86)の中身を確認しても、バージョンは10で正しいようです。 AdobeReaderを起動するだけではなく、ファイルを開く方法を教えてください。

  • レジストリエディタを起動させて手前に表示させたい

    VBE画面から Sub test() Dim i As Long i = Shell("C:\WINDOWS\regedit.exe") End Sub を実行するとレジストリエディタを起動できるのですがアクティブ(前画面)になりません。 Sub test() Dim i As Long i = Shell("C:\WINDOWS\regedit.exe") AppActivate i End Sub これにしたも同じく全画面になりません。 ただ、一度起動した後に再度このコードを実行すると、 プロシージャの呼び出し、または引数が不正です。(Error 5) と言うエラーになりますが、1回目に開いたレジストリエディタがアクティブになります。 vbaコードで起動だけではなく、手前に表示させるにはどうすればいいですか?

  • vbaで参照設定する方法

    sub フォルダをコピーする() Dim myFSO As New FileSystemObject myFSO.CopyFolder "D:\TEST", "D:\TEST2" End Sub を実行したいのですが、 Visual Basic Editor の [ツール]-[参照設定] で、 "Microsoft Scripting Runtime" にチェックせずに、 vbaで参照設定する方法を教えてください。 バージョンは2007です。 ご回答よろしくお願いします。

  • VBA Shell関数 

    エクセルVBA shell関数でプログラムを立ち上げ (DOSプロンプト画面が起動) そのあとに、続けてDOSプロンプトにコマンドと"Sheet1のA1"のセルに入力してある文字を打ち込みたいのですが上手くいかなく困っています。 どのようにしたらよいのでしょうか。 以下のように記述しています。 (初心者です) ------------------------------------ Sub ShellSamp1() Dim myID As Double   myID = Shell("C:\****\*****\*****.EXE & " & cd C:\Documents and Settings & " & Range("A1").Value & """") End Sub ------------------------------------

  • VBA Shell について(アプリの起動)

    Shellを使用して特定のアプリケーションの起動および操作をしたいと考えています。 起動は以下の式で出来たのですが、 Sub VbaToCmd() Call Shell("C:...........................................................................exe", vbNormalFocus) End Sub 起動後の画面でパスワード入力が求められます。 (1)パスワードを自動入力にしたい。 (2)起動後、キーボード操作を行いたい。 VBA初心者ですみません。。 ご回答よろしくお願いします。

  • vba pdfを手前に開きたい  Shell

    Sub Sample() Dim myFile As String myFile = "C: \test.pdf" Shell """C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe"" " & myFile End Sub vbaからこれでPDFファイルを開くことができるのですが アクセスの後ろで開いてしまいます。 このコードを実行したら、開いたPDFファイルを画面の手前に表示したいので 何を付け足せばいいのでしょうか?

  • vbaで画像ファイルを開き、サイズを変更して保存

    vbaで画像ファイルを開き、その後サイズを変更して保存することは出来るのでしょうか? ペイントで画像を開くのは Sub test() MyFileName = "C:\セット.jpg" Shell "C:\WINDOWS\system32\mspaint.exe" & " " & Chr(34) & MyFileName & Chr(34), vbNormalFocus End Sub これで出来たのですが その後、サイズ変更→ピクセル→ 水平方向 300 垂直方向 225 を指定して保存したいのですが そこまでVBAで可能でしょうか?

  • VBAでMP3を鳴らしたい

    vbaについて質問です。 MP3ファイルを鳴らしたいのですがうまくいきません。 --------------------------------------------------------- Sub Macro1() Dim SoundFile As String SoundFile = "C:\終了音.mp3" If Dir(SoundFile) = "" Then MsgBox SoundFile & vbCrLf & "がありません。", vbExclamation Exit Sub End If Shell "mplay32.exe /play /close " & SoundFile End Sub --------------------------------------------------------- を実行すると、 「Shell "mplay32.exe /play /close " & SoundFile」 の部分で 実行時エラー53 ファイルが見つかりません。 になります。 しかし、 If Dir(SoundFile) = "" Then MsgBox SoundFile & vbCrLf & "がありません。", vbExclamation Exit Sub End If の部分では問題ないので、ファイルはある事になってると思うのですが、 なぜ「Shell "mplay32.exe /play /close " & SoundFile」の部分でエラーになるのでしょうか? スペックは、エクセル2007、windows7です。 ご回答よろしくお願いします。

専門家に質問してみよう