- ベストアンサー
エクセルVBAでBATファイルを起動する方法
- エクセルVBAを使用してBATファイルを起動する方法を教えてください。
- 現在、エクセルVBAでBATファイルを実行しようとしていますが、うまくいきません。
- エクセル2003ではうまくいかず、エクセル2007では成功しています。詳しい方に助言をお願いします。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんばんは。 私は、こちらで試してみて、BATのパス・ファイル名のショートネーム(8.3型)の制約があるからだと解釈しましたが、もう一度読み直してみて、それは違ったようです。 >上手くいかないのがどうしてかわかりません。 パソコン自体を調べてみないと分かりませんが、おそらく、BATプログラム用のメモリ不足しているのではないかと思います。おそらく、完全に、VBAに移行するか、Excelの起動をやめるかしないと解決は難しいかもしれません。 ただ、もう一度、他の方法を二つ作ってみましたので、以下を試してみてください。きわめて微妙な内容です。貼り付けるのはそのままでよいのですが、出来るなら、試すのは、2番目からにしてください。2番目で成功すれば、1番目は使わなくてよいです。 '------------------------------------------- 'モジュールの先頭に置く Private Declare Function ShellExecute Lib "SHELL32" Alias "ShellExecuteA" (ByVal hWnd&, ByVal lpOperation$, ByVal lpFile$, ByVal lpParameters$, ByVal lpDirectory$, ByVal nShowCmd&) As Long Private Const SW_SHOWNORMAL As Long = 1 'ウィンドウをアクティブにして、表示します Private Const SW_SHOW As Long = 5 'ウィンドウをアクティブにして、現在の位置とサイズで表示します。 '------------------------------------------- '1番目 Sub Test1() 'Sub CommandButton5_Click() Dim ret As Long Const FILENAME As String = "D:\test.bat" ret = ShellExecute(Application.hWnd, "Open", FILENAME, vbNullString, vbNullString, SW_SHOWNORMAL) If ret = 0 Then MsgBox "失敗しました。", vbExclamation End If End Sub '------------------------------------------- '2番目 Sub Test2() 'Sub CommandButton5_Click() Const FILENAME As String = "D:\test.bat" CreateObject("WScript.Shell").Run FILENAME End Sub
その他の回答 (2)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 すでに、問題点ときちんと書いています。 #パソコン自体を調べてみないと分かりませんが、おそらく、BATプログラム用のメモリ不足しているのではないかと思います。おそらく、完全に、VBAに移行するか、Excelの起動をやめるかしないと解決は難しいかもしれません。 「XCOPYの記述の仕方に問題があるのかなと思うようになりました。」 こちらでは、問題は確認できないものの、メモリ上の問題が含まれていることは容易に想像できます。 他の環境では出来るけれども、XPではうまくないというなら、現状ではBAT自体を使うことはやめたほうが良いと思います。そもそも、VBAから、コマンドプロンプトに出てBATプログラムを使うことは、一般のプログラマなら考えないことです。 もし、XCOPYの記述が問題だと思われるのでしたら、ご質問者さんの手で、トライ&エラーを行っていただきたいです。こちらのアドバイスする範疇ではありません。もっともメモリの少ない方法の実行する方法を提示したにも関わらずダメだというなら、現状の方法と現状の情報の中からでは解決する方法はありません。 もちろん、フォルダ名自体の確認さえ、現行のVBAもBATプログラムでは、そうした確認さえ取れていません。BATプログラム上では、エラーは、特殊な方法を取らないと見れません。 本来、この程度のことは、ある程度のVBAを知っている人なら簡単に出来るのに、わざわざBATにする意味もありません。ただ、公開したくない情報があるとして、そうした情報を、こちらは尊重して触れないことにしているだけです。公開できない内容について、こちらは言及はしません。 現状のままでは、どうやっても、物理的な問題が含まれているようですから、今、お考えの方向からは解決はしません。 もし、BATファイルの内容をVBAに移植するおつもりなら、ご相談には乗りますが、そうでないのでしたら、こちらでは、これ以上はお答えはしかねます。
お礼
ご回答ありがとうございました。 何分素人なものであれこれ調べつつやってる次第であります。 ご回答いただいた内容を参考にもう一度考え直してみます。ありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 > myID = Shell("D:\test.bat", vbMaximizedFocus) myID は、String 型ではなくて、Long型ではあるけれども、試してみましたが、きちんと出来ています。 Batch の場合は、もちろん、Shell の戻り値を取る必要はありません。 また、xcopy "d:\test1" "d:\test2"/I/Y のパス名は、XPでは、実際には、8.3形式 またはShortName でいれますから、このサンプルでは成功しても、実際で違ったりする可能性もあると思います。 なお、以下のようにVBAで行えば、わざわざバッチプログラムを呼び出す必要がありません。 '------------------------------------------- Sub MacroTest1() Dim Ret As Long Dim myFolder As Object Dim mSource As String Dim mDestin As String mSource = "D:\Test1" mDestin = "D:\Test2" '←コピー先は、存在すること--存在しない場合は実行部分で行う '8.3形式--ShortName 取得 With CreateObject("Scripting.FileSystemObject") Set myFolder = .GetFolder(mSource) mSource = myFolder.ShortPath Set myFolder = .GetFolder(mDestin) mDestin = myFolder.ShortPath End With 'コマンド実行部分 Ret = Shell("XCOPY " & mSource & " " & mDestin & "/i/y") ''mDestin &"\Test2 が存在しない場合 'mDestin = "D:\" 'Ret = Shell("XCOPY " & mSource & " " & mDestin & "\Test2 " & "/i/y") End Sub ''コマンドとパラメータの間の半角スペースには注意すること あくまでも、XCOPYというコマンドを使った場合としてください。本来は、このような書き方も、VBA上では、一般的な書き方は別に存在します。
お礼
ご回答ありがとうございます。私の環境ではどうもうまくいきません。他の処理との関連もあり、何とかBATファイルで起動できればと思っております。もう少し、この方法について詳しくご教授願えませんでしょうか。何分、素人なものでBATファイルがたちあがっているように見えるのに処理が実行されていないあたりが良く分らないのです。 申し訳ありませんが、この辺を中心に詳しくご教授願えませんでしょうか? 宜しくお願いいたします。
お礼
ご回答ありがとうございました。 ご教授いただいた方法で試してみました。 結論から行きますとうまくいきませんでした。 こちらでいろいろ試してみたのですが、結果として次のことがわかりました。 1.BATファイルは実行されている。チェックディスクのコマンドにBATファイルの内容を置き換えてみると実行される。 2.XCOPYだとうまくいかない。 3.チェックでディスクとXCOPYを並べて書くとチェックディスクだけが実行されて、XCOPYは実行されない。 ただし、ダブルクリックで実行したときにはBATファイルは問題なく実行される。 以上のことからXCOPYの記述の仕方に問題があるのかなと思うようになりました。 この点について何かわかることはないでしょうか? もし分かりましたらご教授いただきたいのですが、よろしくお願いいたします。