エクセル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)で上手くいかないのがどうしてかわかりません。
どうか詳しい方ご教授ください。よろしくお願いいたします。
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
ご回答ありがとうございました。
ご教授いただいた方法で試してみました。
結論から行きますとうまくいきませんでした。
こちらでいろいろ試してみたのですが、結果として次のことがわかりました。
1.BATファイルは実行されている。チェックディスクのコマンドにBATファイルの内容を置き換えてみると実行される。
2.XCOPYだとうまくいかない。
3.チェックでディスクとXCOPYを並べて書くとチェックディスクだけが実行されて、XCOPYは実行されない。
ただし、ダブルクリックで実行したときにはBATファイルは問題なく実行される。
以上のことからXCOPYの記述の仕方に問題があるのかなと思うようになりました。
この点について何かわかることはないでしょうか?
もし分かりましたらご教授いただきたいのですが、よろしくお願いいたします。
No.3
- 回答日時:
こんにちは。
すでに、問題点ときちんと書いています。
#パソコン自体を調べてみないと分かりませんが、おそらく、BATプログラム用のメモリ不足しているのではないかと思います。おそらく、完全に、VBAに移行するか、Excelの起動をやめるかしないと解決は難しいかもしれません。
「XCOPYの記述の仕方に問題があるのかなと思うようになりました。」
こちらでは、問題は確認できないものの、メモリ上の問題が含まれていることは容易に想像できます。
他の環境では出来るけれども、XPではうまくないというなら、現状ではBAT自体を使うことはやめたほうが良いと思います。そもそも、VBAから、コマンドプロンプトに出てBATプログラムを使うことは、一般のプログラマなら考えないことです。
もし、XCOPYの記述が問題だと思われるのでしたら、ご質問者さんの手で、トライ&エラーを行っていただきたいです。こちらのアドバイスする範疇ではありません。もっともメモリの少ない方法の実行する方法を提示したにも関わらずダメだというなら、現状の方法と現状の情報の中からでは解決する方法はありません。
もちろん、フォルダ名自体の確認さえ、現行のVBAもBATプログラムでは、そうした確認さえ取れていません。BATプログラム上では、エラーは、特殊な方法を取らないと見れません。
本来、この程度のことは、ある程度のVBAを知っている人なら簡単に出来るのに、わざわざBATにする意味もありません。ただ、公開したくない情報があるとして、そうした情報を、こちらは尊重して触れないことにしているだけです。公開できない内容について、こちらは言及はしません。
現状のままでは、どうやっても、物理的な問題が含まれているようですから、今、お考えの方向からは解決はしません。
もし、BATファイルの内容をVBAに移植するおつもりなら、ご相談には乗りますが、そうでないのでしたら、こちらでは、これ以上はお答えはしかねます。
ご回答ありがとうございました。
何分素人なものであれこれ調べつつやってる次第であります。
ご回答いただいた内容を参考にもう一度考え直してみます。ありがとうございました。
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上では、一般的な書き方は別に存在します。
ご回答ありがとうございます。私の環境ではどうもうまくいきません。他の処理との関連もあり、何とかBATファイルで起動できればと思っております。もう少し、この方法について詳しくご教授願えませんでしょうか。何分、素人なものでBATファイルがたちあがっているように見えるのに処理が実行されていないあたりが良く分らないのです。
申し訳ありませんが、この辺を中心に詳しくご教授願えませんでしょうか?
宜しくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- その他(プログラミング・Web制作) フォルダ内の特定 拡張子のファイルを一括実行するBat ファイルについて 4 2022/04/17 09:51
- Excel(エクセル) エクセルVBA、ファイル名をセルの値で保存の方法を教えてください。 おそれいります。こちらで数々のエ 6 2023/06/30 22:17
- その他(コンピューター・テクノロジー) batファイルでPCの設定内容やプロパティーを取得したいのですが、コマンド1個で1ファイルとなるのを 2 2022/04/27 15:27
- Excel(エクセル) エクセルVBA、間違っているコード内容を正して頂けませんか? エクセルワークシートに納品書を作ったの 2 2023/08/02 21:13
- Visual Basic(VBA) Excel-VBAでのファイルの開き方 4 2023/02/14 11:01
- Visual Basic(VBA) エクセルのマクロについて教えてください 物件ごとのフォルダを作成してます そのフォルダ内にサブフォル 2 2023/07/02 17:58
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) VBAコードを張り付け後のエクセルの進め方 2 2023/02/07 18:24
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
OLE又はDDEを使うVISUAL BESIC...
-
Access クエリ実行が急に非常に...
-
LINK : fatal error LNK1104に...
-
VB6で、C言語の(argv,argc)み...
-
VBAでMP3を鳴らしたい
-
exeファイルをすぐに終了させな...
-
VB6.0で作ったプロジェクトが起...
-
c/c++ ビルドしたにもかかわら...
-
Javaで作成したソフトの配布 J...
-
batからexeを実行し戻り値を受...
-
exeファイルを作成できるプログ...
-
複数のJarファイルにクラスパス...
-
JAVAのAPIのコールの仕方で質問...
-
バッチファイルをEXEファイ...
-
64bit環境で32bitのodbc参照
-
ディレクトリを変更して外部コ...
-
コンパイル ./aと./a.out の違い
-
JavaScriptでコマンドプ...
-
MATLAB から exe ファイルの実...
-
フォルダ内の特定 拡張子のファ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Access クエリ実行が急に非常に...
-
JavaScriptでコマンドプ...
-
OLE又はDDEを使うVISUAL BESIC...
-
VC++から引数付きexeファイルの...
-
VBAでEXEファイルを動かす方法...
-
LINK : fatal error LNK1104に...
-
64bit環境で32bitのodbc参照
-
WScript.Echo と msgbox
-
batからexeを実行し戻り値を受...
-
VBAでMP3を鳴らしたい
-
コマンドプロンプトで外のexeや...
-
batからexeを起動した際の戻り...
-
VBS形式ファイル:ダブルクリッ...
-
jarファイル実行時の環境変数の...
-
JAVA .jarファイルに再圧縮する...
-
jarファイルとjava.exeの関連付...
-
VBSでEXCELのXLSTARTにあるマク...
-
コンポーネント`MSCOMM32.cox'...
-
ローカルのHTMLからexeファイル...
-
c/c++ ビルドしたにもかかわら...
おすすめ情報