エクセルのVBAをつかってC++で作ったexeファイルを起動させるプログラムを書きたいと思いますが、うまくいきません。
プログラムは下記です。
Sub Macro1()
Shell ("C:\test.exe")
End Sub
エラーは出ないのですが、計算をしません。
・VBEの参照設定のmicrosft scripting runtimeはクリックいれてます。
・test.exe自体はクリックすると起動して計算します。
もし、対応策をご存知なら教えていただければ助かります。
よろしくお願いします。
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
----------------------------------------------
とか・・・
dsuekichi様
最後までご丁寧な回答をいただき、本当にありがとうございます。
確かに、カレントフォルダのお話は最初から教えていただいていました。。。
EXEファイルを直接クリックしたときは、そのEXEファイルの置いてあるディレクトリのファイルを認識していたので、てっきりVBAでも同じことが行われると思っていましたが、大きな勘違いでした。
カレントディレクトリの問題はプログラムの基礎の基礎なので、特にSHLL関数の使い方のHPをチェックしても載ってなかったのだと思います。
総括すると、今回のSHELLの問題は二つあり
1、EXEファイルが終わるまで待つようにする
2、EXEファイルはカレントディレクトリが当然デフォルトで設定されているので、VBAでSHELLを使う時はディレクトリを変更する
ということで、dsuekichi様は最初から見抜いていらっしゃったと思います。
それなりに調べたつもりだったのですが、結局元に戻ってきたということで赤面です。
おかげさまで、約一ヶ月悪戦苦闘してようやく動くようになりました。
本当にありがとうございます。
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)
こういうのがありますけど・・・同じでしょうか?
#起動したプログラムの方の問題の可能性は?
この回答への補足
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様
何度もメールしていただき、本当にありがとうございます。
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++も付け焼刃で)なので、上記あわせてトライしてみてどちらにしてもご報告します。
迅速なお返事本当にありがとうございます。
No.2
- 回答日時:
> 計算は一分くらい掛かるものなので、それが原因かなあ、とも思ってます。
確認です。
> 計算をしません。
と判断した理由は何なんでしょう?
#どういうコードで「計算していない」ことを確認しましたか?
Shell関数は、「非同期処理」なので、呼び出したプログラムの終了を待ってはくれません。
例えば、C++プログラムが計算終了時(つまり起動の1分後)に、結果をファイル出力する仕組みになっていて、
VBプログラムが、Shell実行直後に、そのファイルの有無をチェックしていいたりすると、
ファイルは存在しないことになりますが・・・
この回答への補足
dsuekichi様
補足です
よく読むと
>と判断した理由は何なんでしょう?
>#どういうコードで「計算していない」ことを確認しましたか?
に答えてませんでした。
通常はexeファイルをクリックさせて起動させると、テキストファイルを読み込み、計算し、テキストファイルを出すのですが(最低5秒)、それが出ません。
・shell()だと、窓が一瞬出てすぐに消えてしまいます。
・HPなどをみて、exeファイルが終わるまで待つVBAを書いてみましたが、エラーはでないものの、窓も出ずに終わってしまいました。
よろしくおねがいします。
dsuekichi様
お返事していただき、本当にありがとうございます。
ご指摘の通り、このexeファイルをエキスプローラーからクリックさせて起動させると、あるテキストファイルを読み込み、計算をし、結果のテキストファイルを複数出します。
最初のテキストファイルを出すのに5秒程度、全てのファイルを出すのに一分程度掛かります。
対策として下記HPなどを参考にして、exeファイルが終了するまで待つような仕組みをVBAに入れてみました。
http://www.moug.net/tech/exvba/0150034.htm
このプログラムではエラーは出なかったものの、exeファイルの起動が確認できないまま終わってしました。。。
(単なるshellだと、一瞬窓が開くのが確認出来ます)
大変困っており、他の対策(vbaの工夫、exeファイルのプログラムの工夫や有料相談所など)をご存知なら大変助かります。
お返事本当にありがとうございました。
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")
にしましょう。
dsuekichiさん
お返事ありがとうございます
文法を教えていただきありがとうございました!
「スタートメニュー」の「ファイル名を指定して実行」だと大丈夫でした。
計算は一分くらい掛かるものなので、それが原因かなあ、とも思ってます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
許せない心理テスト
私は「あなたの目の前にケーキがあります。ろうそくは何本刺さっていますか」と言われ「12本」と答えたら…
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
バッチファイルでキー操作を行う。
その他(プログラミング・Web制作)
-
EXCELマクロのEXE化
Visual Basic(VBA)
-
exeファイルの作り方
Visual Basic(VBA)
-
-
4
exeファイルの中身を見ることは可能ですか?
フリーソフト
-
5
コマンドプロンプト実行後に画面を閉じない方法
Visual Basic(VBA)
-
6
excelのexe化について
Excel(エクセル)
-
7
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
8
VBA(エクセル)で自動的にボタンをクリックさせるには
その他(プログラミング・Web制作)
-
9
VBAでブックを非表示で開いて処理して閉じる方法
Excel(エクセル)
-
10
特定のPCだけ動作しないVBAマクロがあります。その理由は?
Visual Basic(VBA)
-
11
Excel VBAで複数のバッチファイルの同時処理の方法を教えてほしいです。
その他(プログラミング・Web制作)
-
12
excel vbaから実行するexe実行の黒い画面の非表示
Visual Basic(VBA)
-
13
Changeイベントでの複数セルのクリアの処理について
Visual Basic(VBA)
-
14
batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Access クエリ実行が急に非常に...
-
JavaScriptでコマンドプ...
-
OLE又はDDEを使うVISUAL BESIC...
-
vbsで起動したexeを終了させる方法
-
VC++での外部プログラムの実行
-
以下のように複数のファイルを...
-
VC++から引数付きexeファイルの...
-
【HTML】 Wordファイルの指定...
-
BufferedWriter(OutPutStream)....
-
コンポーネント`MSCOMM32.cox'...
-
なぜプロセスはファイルにアク...
-
コマンドプロンプトで外のexeや...
-
htaファイルが実行されません
-
OpenCVを Borland C++ Builder...
-
コマンドプロンプトにてスター...
-
c/c++ ビルドしたにもかかわら...
-
外部プログラムを実行してその...
-
eclipseで作ったプログラムを他...
-
アプリで作成したexeファイルを...
-
batからexeを起動した際の戻り...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access クエリ実行が急に非常に...
-
OLE又はDDEを使うVISUAL BESIC...
-
JavaScriptでコマンドプ...
-
VBAで他のプログラムが起動して...
-
VBAでEXEファイルを動かす方法...
-
LINK : fatal error LNK1104に...
-
c/c++ ビルドしたにもかかわら...
-
jarの開き方を教えてください。
-
eclipseで作ったプログラムを他...
-
VBAでMP3を鳴らしたい
-
ローカルのHTMLからexeファイル...
-
コンパイル ./aと./a.out の違い
-
VC++から引数付きexeファイルの...
-
WScript.Echo と msgbox
-
コンポーネント`MSCOMM32.cox'...
-
実行ファイルと実行モジュール...
-
jarファイルとjava.exeの関連付...
-
JAVA .jarファイルに再圧縮する...
-
ネットワーク越しのEXEファ...
-
コマンドプロンプトで外のexeや...
おすすめ情報