アプリ版:「スタンプのみでお礼する」機能のリリースについて

エクセル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)で上手くいかないのがどうしてかわかりません。
どうか詳しい方ご教授ください。よろしくお願いいたします。

A 回答 (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
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
ご教授いただいた方法で試してみました。
結論から行きますとうまくいきませんでした。
こちらでいろいろ試してみたのですが、結果として次のことがわかりました。

1.BATファイルは実行されている。チェックディスクのコマンドにBATファイルの内容を置き換えてみると実行される。
2.XCOPYだとうまくいかない。
3.チェックでディスクとXCOPYを並べて書くとチェックディスクだけが実行されて、XCOPYは実行されない。

ただし、ダブルクリックで実行したときにはBATファイルは問題なく実行される。

以上のことからXCOPYの記述の仕方に問題があるのかなと思うようになりました。
この点について何かわかることはないでしょうか?
もし分かりましたらご教授いただきたいのですが、よろしくお願いいたします。

お礼日時:2009/12/17 16:47

こんにちは。



すでに、問題点ときちんと書いています。
#パソコン自体を調べてみないと分かりませんが、おそらく、BATプログラム用のメモリ不足しているのではないかと思います。おそらく、完全に、VBAに移行するか、Excelの起動をやめるかしないと解決は難しいかもしれません。

「XCOPYの記述の仕方に問題があるのかなと思うようになりました。」

こちらでは、問題は確認できないものの、メモリ上の問題が含まれていることは容易に想像できます。

他の環境では出来るけれども、XPではうまくないというなら、現状ではBAT自体を使うことはやめたほうが良いと思います。そもそも、VBAから、コマンドプロンプトに出てBATプログラムを使うことは、一般のプログラマなら考えないことです。

もし、XCOPYの記述が問題だと思われるのでしたら、ご質問者さんの手で、トライ&エラーを行っていただきたいです。こちらのアドバイスする範疇ではありません。もっともメモリの少ない方法の実行する方法を提示したにも関わらずダメだというなら、現状の方法と現状の情報の中からでは解決する方法はありません。

もちろん、フォルダ名自体の確認さえ、現行のVBAもBATプログラムでは、そうした確認さえ取れていません。BATプログラム上では、エラーは、特殊な方法を取らないと見れません。

本来、この程度のことは、ある程度のVBAを知っている人なら簡単に出来るのに、わざわざBATにする意味もありません。ただ、公開したくない情報があるとして、そうした情報を、こちらは尊重して触れないことにしているだけです。公開できない内容について、こちらは言及はしません。

現状のままでは、どうやっても、物理的な問題が含まれているようですから、今、お考えの方向からは解決はしません。
もし、BATファイルの内容をVBAに移植するおつもりなら、ご相談には乗りますが、そうでないのでしたら、こちらでは、これ以上はお答えはしかねます。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/12/17 18:03

こんばんは。



> 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上では、一般的な書き方は別に存在します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/12/16 17:34

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!