エクセルVBAでBATファイルを起動する方法

このQ&Aのポイント
  • エクセルVBAを使用してBATファイルを起動する方法を教えてください。
  • 現在、エクセルVBAでBATファイルを実行しようとしていますが、うまくいきません。
  • エクセル2003ではうまくいかず、エクセル2007では成功しています。詳しい方に助言をお願いします。
回答を見る
  • ベストアンサー

エクセルVBAよりBATファイルを起動する方法。

エクセルVBAよりBATファイルを起動する方法を教えてください。 現在下記の様な内容で作ってみましたがうまくいきません。 ***VBA側*** Private Sub CommandButton5_Click() Dim myID As String myID = Shell("D:\test.bat", vbMaximizedFocus) End Sub ***BATファイル側*** xcopy "d:\test1" "d:\test2"/I/Y エクセル2003で実行してみましたがうまくいきません。BATファイルは起動しているようなのですが、BATファイルの処理がうまくいかなくて困っています。(ちなみにBATファイル単体をダブルクリックで実行すると問題ないのですが…) 同じ内容をエクセル2007で実行するとうまくいきました。(ちなみにOSはVISTA) 2003(ちなみにOSはxp)で上手くいかないのがどうしてかわかりません。 どうか詳しい方ご教授ください。よろしくお願いいたします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 私は、こちらで試してみて、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

yurarin99
質問者

お礼

ご回答ありがとうございました。 ご教授いただいた方法で試してみました。 結論から行きますとうまくいきませんでした。 こちらでいろいろ試してみたのですが、結果として次のことがわかりました。 1.BATファイルは実行されている。チェックディスクのコマンドにBATファイルの内容を置き換えてみると実行される。 2.XCOPYだとうまくいかない。 3.チェックでディスクとXCOPYを並べて書くとチェックディスクだけが実行されて、XCOPYは実行されない。 ただし、ダブルクリックで実行したときにはBATファイルは問題なく実行される。 以上のことからXCOPYの記述の仕方に問題があるのかなと思うようになりました。 この点について何かわかることはないでしょうか? もし分かりましたらご教授いただきたいのですが、よろしくお願いいたします。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 すでに、問題点ときちんと書いています。 #パソコン自体を調べてみないと分かりませんが、おそらく、BATプログラム用のメモリ不足しているのではないかと思います。おそらく、完全に、VBAに移行するか、Excelの起動をやめるかしないと解決は難しいかもしれません。 「XCOPYの記述の仕方に問題があるのかなと思うようになりました。」 こちらでは、問題は確認できないものの、メモリ上の問題が含まれていることは容易に想像できます。 他の環境では出来るけれども、XPではうまくないというなら、現状ではBAT自体を使うことはやめたほうが良いと思います。そもそも、VBAから、コマンドプロンプトに出てBATプログラムを使うことは、一般のプログラマなら考えないことです。 もし、XCOPYの記述が問題だと思われるのでしたら、ご質問者さんの手で、トライ&エラーを行っていただきたいです。こちらのアドバイスする範疇ではありません。もっともメモリの少ない方法の実行する方法を提示したにも関わらずダメだというなら、現状の方法と現状の情報の中からでは解決する方法はありません。 もちろん、フォルダ名自体の確認さえ、現行のVBAもBATプログラムでは、そうした確認さえ取れていません。BATプログラム上では、エラーは、特殊な方法を取らないと見れません。 本来、この程度のことは、ある程度のVBAを知っている人なら簡単に出来るのに、わざわざBATにする意味もありません。ただ、公開したくない情報があるとして、そうした情報を、こちらは尊重して触れないことにしているだけです。公開できない内容について、こちらは言及はしません。 現状のままでは、どうやっても、物理的な問題が含まれているようですから、今、お考えの方向からは解決はしません。 もし、BATファイルの内容をVBAに移植するおつもりなら、ご相談には乗りますが、そうでないのでしたら、こちらでは、これ以上はお答えはしかねます。

yurarin99
質問者

お礼

ご回答ありがとうございました。 何分素人なものであれこれ調べつつやってる次第であります。 ご回答いただいた内容を参考にもう一度考え直してみます。ありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんばんは。 > 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上では、一般的な書き方は別に存在します。

yurarin99
質問者

お礼

ご回答ありがとうございます。私の環境ではどうもうまくいきません。他の処理との関連もあり、何とかBATファイルで起動できればと思っております。もう少し、この方法について詳しくご教授願えませんでしょうか。何分、素人なものでBATファイルがたちあがっているように見えるのに処理が実行されていないあたりが良く分らないのです。 申し訳ありませんが、この辺を中心に詳しくご教授願えませんでしょうか? 宜しくお願いいたします。

関連するQ&A

  • VBAでのBAT起動

    VBAでのBAT起動 VBAでBAT起動が上手く行きません。 excel2003、xpを使っています。 C:\test/ の中に、 connect FTP_DL.bat の二つのファイルがあります。 connectの中に記述し、 FTP_DL.batをクリックすることで動くbatとなっております。 Shell "C:\test/FTP_DL.bat", 1 でDOS画面は一瞬でるのですが、batの中身の動作はしてくれません。 普通にダブルクリックでbatを起動すると動作します。 どう記述を変えればよいでしょうか?

  • エクセルVBAで、バッチ処理を起動すると・・・

    Windows/XP/pro、エクセル2002 使用です。 c:\autocsvフォルダーに、MS-DOSコマンドを使ってFTPを自動実行しサーバーからCSVを自動的に取得する.TXTファイルと、バッチファイルの.batファイルをおいています。 参考URL http://www.ponko2.com/ftp_bat.html この.batファイルをVBAから呼び出して実行させるように下記のコードを記述ましたが、ファイルは起動するものの、CSVファイルを取得(またはLogin)できません。Openメソッドを使ってもうまくいきませんでした。実行する関数の間違いと思っていますが、それとも、VBAからバッチファイルを実行する場合の何か決まりごと等があるのでしょうか? Sub test() Dim str As Variant str = Shell("c:\autocsv\auto.bat", vbNormalFocus) Application.Wait Now + TimeValue("00:00:10") End Sub (VBAの実行をステップインを使って1行ずつ実行してもファイルを取得できません) なお、.batファイルを単独で起動させた場合は、問題なくcsvファイルの取得はできています。 お手数ですが、ご指導いただけますようお願いします。

  • Excel VBAでbatファイルを実行

    ExcelのVBAでbatファイルを実行し、 batファイル内でセットした環境変数を取得することは可能でしょうか? batファイルの内容は set MYDRIVE=E: set MYDIR=%MYDRIVE%\WORK のような感じです。 環境変数「MYDIR」の値をVBA側で取得できないかと思い、 ' 参照設定: Windows Script Host Object Model Sub ボタン1_Click() Dim myWshShell As New WshShell Dim myLong As Long Dim myWshEnvironment1 As WshEnvironment Dim myWshEnvironment2 As WshEnvironment Dim myWshEnvironment3 As WshEnvironment Dim myWshEnvironment4 As WshEnvironment myLong = myWshShell.Run("E:\work\test.bat") Set myWshEnvironment1 = myWshShell.Environment("System") Set myWshEnvironment2 = myWshShell.Environment("User") Set myWshEnvironment3 = myWshShell.Environment("Volatile") Set myWshEnvironment4 = myWshShell.Environment("Process") ' ブレークポイントを設定して内容確認 Set myWshShell = Nothing Set myWshEnvironment1 = Nothing Set myWshEnvironment2 = Nothing Set myWshEnvironment3 = Nothing Set myWshEnvironment4 = Nothing End Sub のようなコードを書いてみて「myWshEnvironment1」~「myWshEnvironment4」の内容を ウォッチ式で確認してみましたが、batファイルの中でセットした「MYDIR」の値は 含まれておりませんでした。 batファイルで設定した環境変数の値を取得する方法があれば 教えていただけないでしょうか?

  • Batファイルでxcopyを実行するとループする

    BatファイルでCドライブのaaaフォルダからDドライブのaaaフォルダへファイルをコピーするxcopyの記述をしました。 xcopy c:\aaa d:\aaa /i 作成したBatファイルを実行するとループしてるのか、このコマンドが何度も繰り返され、コマンドプロンプトの×ボタンを押すまで終わりません。 コマンドプロンプトから直接xcopyを入力すると問題なくコピーされます。 どこか私の記述が間違っているのでしょうか?

  • エクセルで、batを実行するには?

    エクセルのvbaで、batファイルを実行したいのですが、opentextでは、実行されません。内容としては、FDの中にあるexlファイルをcドライブの指定フォルダにコピーするだけです。

  • エクセルVBAでテキストファイル(バッチファイルの作成)

    エクセルVBA超初心者です。 言語は基本的にC言語しか知りません。 エクセルVBAでボタンを実行したら たとえば以下のような内容のバッチファイルが デスクトップに出来る・・・ というものを作らなくてはいけなくなりました。 色々調べてるのですが、ファイル入出力関連の記述の仕方がまったくわからず、あまり時間がなく困っています。 ちなみにバッチファイルの内容は ↓ REM サーバー上からプログラムフォルダをダウンロードする。 XCOPY \\hk001a24\va\data\ツール配信用\セグメント D:\セグメント /I/Y/F/E REM フォルダへ移動する。 D: CD D:\セグメント REM ショートカットをデスクトップに作成する。 csc.exe "D:\セグメント\入力シート.xls" "?desktop?\セグメント入力シート.lnk" csc.exe "D:\セグメント\出力シート.xls" "?desktop?\セグメント出力シート.lnk" csc.exe "D:\セグメント\出力帳票" "?desktop?\セグメント出力帳票.lnk" exit ↑ ここまで。。。 これをボタン実行後、 test.batというファイルに作成しデスクトップに保存する。 似たようなロジックや参考になるURLがあったら教えてください。 長々とすみません、よろしくお願いいたします。

  • BATファイルについて

    BATファイルについて教えてください。 現在エクセルのVBAでテキストファイルから読み込んだデータを一行づつ解析し条件文でそれぞれ決められた書式のテキストファイルに書き直して新たなテキストファイルを作成するというプログラムを作成して使っています。 この機能をエクセルのVBAではなくBATファイルのようなインタープリンターを介さないプログラムができないかと悩んでいます。 BATファイルで上記の処理が可能か、または作成方法など教えていただけると助かります。 どなたかご存知の方教えてください。

  • バッチファイルからVBAに引数を渡したい

    お世話になります。 a.batというバッチファイルがあります。 このファイルを起動させた時にABC.xlsというEXCELが起動するようにしたいのですが、その際にバッチファイル側から"1303"という文字列をabc.xlsに引数として渡したいのです。 EXCEL側ではauto_open(a)で待ち受けて、このaに"1303"が入ってmsgで"1303"と表示させたいのですが、引数は省略出来ません、というエラーが出てしまいます。 どなたかやり方をご教授いただけませんでしょうか?よろしくお願い致します。 環境 WindowsXP SP3 Excel2003 ============================== バッチファイル側 ============================== @echo off echo バッチファイルを実行します。 ABC.xls "1303" echo 終了しました。 ============================== EXCEL VBA側 ============================== Sub auto_open(a As String) Msg a end sub

  • batファイル callを連続実行したい

    batファイルを作っています。 batファイルの中で、2つのファイルを実行したいのですが、1つ目は実行しますが、2つ目に自動で行きません。 どうすればよいでしょうか? 実行したいファイル 1つ目:batファイル 2つ目:mdbファイル(の起動) 現在の状況 ---------------- @echo off call D:\aaa.bat call D:\ccc.MDB ---------------- と記述しています。

  • BATファイルでstartからcallを行う方法

    現在BATファイルにて指定されたアプリケーションを使用して、イベントログの抽出を行っています。 元々MainBATとSubBATの作成を行い、1台毎に作業を行っていたのですが 台数が非常に多い為、MainBatの分割を行い、その上にMainBatを一度に起動するBAtファイルを作成した所 SubファイルのCallが認識できなくなりました。 申し訳ありませんが、作業を行う方法がございましたら教えて下さい。 本来の作業方法 MainBAT Call sub サーバー名 Call sub サーバー名 Call sub サーバー名 Call sub サーバー名 Call sub サーバー名 Call sub サーバー名 Call sub サーバー名 Call sub サーバー名 Call sub サーバー名 Subファイルにてアプリケーションの起動 アプリケーション名 %1 上記をMain1、Main2、MAin3、Main4と分割しその上に4つのBATを実行するALLBATの作成し実行 ALLBAT start Main1.bat start Main2.bat start Main3.bat srart Main4.bat Main1.bat Call sub サーバー名 Sub.batの中身 アプリケーション名 %1 この%1の部分が認識できなくなってしまいました(他に%2 ~ %9まで変更してみたが不可能) このcallの部分を認識できる方法がありましたら教えて下さい。

専門家に質問してみよう