重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

この質問は直近で出した質問を誤って締め切ってしまったため、再質問として書いてます。

以下のマクロを作りましたが、うまくいきません。
フォルダBにあるバッチファイルを実行するだけのマクロで、バッチファイルはフォルダAにあるファイルを自身のフォルダつまりフォルダBにコピーするものです。
マクロ
Sub Test()
Dim Str As String
Str=shell("""" & folderB\batch.bat & """", vbnormalfocus)
End sub

Batch.batの中身
Copy "folderA\fileA" . '見えにくいですが、最後にピリオドがあります。

folderAやfolderBはそれぞれのフォルダのフルパスです。パスに空白を含むため " で囲むようにしてます。

実行すると、何故かフォルダBでなくてデスクトップにコピーされます。バッチファイルをクリックして直接起動すると、目論見通りフォルダBにコピーされます。コマンドプロンプトからフォルダBに移動し、バッチファイルを起動しても、目論見通りフォルダBにコピーされます。

マクロから起動した時だけ、どうしてデスクトップにコピーされるのでしょうか?

A 回答 (6件)

#4の回答者です。



>Wikipediaを読むと、VBSは収束方向で今後はVB.netが主流になるように書いてます。どちらを勉強しようか迷っていて、

くだんのWikipediaの内容は、ずいぶん、VBSに関して点が辛いですね。ただ、書かれている内容は、いわば建前論だと思います。それでも、VB.Net になるというのは誤解で、それは、OSの汎用性の高い「.Net」つまり、「.Net FrameWork」のことだと思います。

また、VBScript を含む、WSHは、
「WSHから Windows PowerShell へ移行すると言う」
というのですが、PowerShellは、言語的に違いがありすぎます。

Windowsのいくつからかは知りませんが、多少、VBScriptには制約が掛かっているようですから、昔(XP時代)のようにはフルでは使えなくなったような気がします。

VB系のユーザーが、そちらに流れていくかというと、それは "No"です。
あえていうなら、VBA自体が、VBScript と同じ運命を持っているということは言うまでもなく、いずれは、わたしたちの「VBのおもちゃ」を、Microsoft が強行的手段で取り上げるのは、この10年ぐらいの間に起こると思ってもいいのではないでしょうか。どこかで見切りをつけられるとは思います。

Excelから、VBAを廃したバージョンは、Macでありましたが、かなりの不評で、Microsoft 社に対して、クレームも付きなかったそうです。その時に、Microsoft の開発のリーダーは、OfficeにVBAを搭載することを継続を約束しました。(あまり、このあたりの事は、他人の受け売りになってしまいすからやめておきます。)

Microsoft 側では、WSHに後続という "PowerShelll"を、OSには用意されているのですが、私個人は、あまり興味が続きませんでした。今のところ、爆発的に普及する様子もありません。

VBScript は、ダーティな部分があるのは知っていますが、少なくとも、VBAを知っている身となれば、その日からでも、何の用意もなく、なんとかコードは書けます。それに比較して、VB.Net は、プログラミング言語ですから、最初のお約束事がいくつかあって、それが済まないと先には進めないと思ったほうがよいです。

私は、あえてVB.Netにアプローチすることは、あまりお勧めではないのですが、VBAをかじっていたら、入りやすいことは間違いありません。
    • good
    • 0
この回答へのお礼

ありがとうございます。
バッチファイルはうまく動くようになりました。VBSはお話しのようにまずはVBSから入ろうと思います。

お礼日時:2015/01/26 18:26

「.」は「現在のディレクトリ=カレントディレクトリ」を指す相対パスです。

「バッチファイルが存在するディレクトリ」を指すものではありません。

マクロからフルパス指定でバッチファイルを呼び出しているので、あくまで動いているのはマクロであって、バッチファイルではないです。

同じような現象を体感するなら、コマンドプロンプトで実行する際、ディレクトリを移動せず(カレントディレクトリを変更せず)、フルパスでバッチファイルを実行してみて下さい。

c:\Usars\xxxxxx> folderB\batch.bat

ファイルはカレントディレクトリである「c:\Usars\xxxxxx\」にコピーされるはずです。

また、エクスプローラーでバッチファイルがあるフォルダを開かず適当なフォルダを開いた状態で、アドレスバーに直接フルパスでバッチファイルを指定してみて下さい。ファイルはカレントディレクトリである「今開いているフォルダ」にコピーされるはずです。
※Windows Vista以降は、アドレスバーを右クリック→「アドレスの編集」で入力可能になります。



WSH使えばマクロだけで事足りる話ではありますが、バッチファイルがどうしても使いたいのであれば

Copy "folderA\fileA" .

ではなく

Copy "folderA\fileA" %~dp0

とすると、バッチファイルがあるフォルダにコピーされると思います。
※「%~dp0」は、自分自身のパスを格納する引数(%0)からダブルクォートを削除(~)し、ドライブ名のみ(d)+パスのみ(p)に展開する=ファイル名を含まない自分自身のパス=『自分自身が存在するフォルダ』と言う意味です。
    • good
    • 0
この回答へのお礼

再度回答ありがとうございます。
WSHは全く知らないので、現状手を付けてません。バッチファイルにした目的である、ファイル数が多い場合の対応さえ可能なら、どちらでも構いません。

お礼日時:2015/01/25 14:48

こんにちは。



すでに、#3さんのご説明で満足できるものだと思いますが、かなり重複しますが、こちらもちょっと違う話を書きましたので、載せておきます。

>copy forlderA/fileA folderB/fileA
>コピー先もフルパスで書けば、カレントフォルダに影響されないからOK?

そうなんですね。[暗黙のフォルダ(相対参照)]は、扱いがむつかしい、と感じます。
プログラミングには、その反対に、「明示的」という言葉がありますが、わかっているものでも、念のために書くのも良いかと思います。

実は、つい最近、同じことがあったのです。10年このかた使っていたマクロの中に、フォルダー指定をしていないバグがあって、これはExcelのバグか何かと思っていたぐらいです。

ふつうは、Excelのオプションのブックの保存の「既定のファイル場所」は、通常は変わらないようです。ChDir を使わないとカレントフォルダは動かないようですね。しかし、ファイルオープン・ダイアログでは変わるようです。これがややこしいです。

Copy "folderA\fileA" .
だけでは、 仮に、ThisWorkbook.Pathは合っていても、Application.DefaultFilePath が、カレントフォルダなのでしょう。

でも、デスクトップになるのは、また別の問題かもしれませんね。
Excel-ファイル-オプション-ブックの保存-「既定のファイル場所」
の位置が違っているのかもしれません。違っていても、別に何の問題もないはずですが。

>バッチファイルにする理由は、ファイル数が多い場合にバッチファイルに任せてエクセルを他仕事に使えるからです。

こういう場合ですが、バッチが得意なら、バッチでもよいのですが、VBSになると少し表現力が豊富になります。

また、ご存知でしょうが、思い切って、HTAスタイルに作りかえてみたらいかがですか?もう、完全なアプリになります。これがテキストファイルでできるかと思うぐらいのものが出来ます。

http://itpro.nikkeibp.co.jp/article/COLUMN/20100 …
http://itpro.nikkeibp.co.jp/article/COLUMN/20060 …

これは、テキストエディタやメモ帳で作れます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
HTA、まったく知りません。おそらく他質問へ私が回答した中の「独立したソフト」を受けての事と思いますが、単にプロシージャの集合体として独立したものの意味で(サブルーチンの集まりでなく)ソフトと書いたに過ぎません。

VBS
Wikipediaを読むと、VBSは収束方向で今後はVB.netが主流になるように書いてます。どちらを勉強しようか迷っていて、恥ずかしながら結局どっちも手つかずです。何か御意見ありましたら是非お願いします。
http://ja.wikipedia.org/wiki/VBScript

お礼日時:2015/01/25 09:20

> 「カレントフォルダ=バッチファイルのあるフォルダ」と思ってましたが、そうではないということですか?



その通りです。

下記の、カレントフォルダを確認するコマンドなんかを実行させるとかすれば、確認できます。


> 起動時のカレントフォルダの確認方法とかあるのでしょうか?

コマンドで行うのなら、「cd」でEnter。

コマンドでカレントフォルダを移動するのなら、「cd folderA」でEnter。
バッチ処理中でも可能です。

cd folderB
copy folderA\fileA .
copy folderA\fileF .
copy folderA\fileN .

上の処理は、

copy folderA\fileA folderB
copy folderA\fileF folderB
copy folderA\fileN folderB

って書いても同様の動作をします。
どちらが良いってのは無いと思いますが、修正のしやすさとか、カレントフォルダって今どこよ?ってな事になりにくさとか、そういうの考慮して、お好みの方法で。


VBAの処理だと、CurDir()関数で確認できます。

こちらのサイトで、質問者さんと同じ誤解について説明してくれているので、一読してみると良いと思います。

VBA応用(絶対パス指定と相対パス指定)
http://www.asahi-net.or.jp/~ef2o-inue/vba_o/sub0 …

--
その他、バッチ処理ではコマンドでカレントフォルダ指定しますが、そのバッチファイルを右クリックでドラッグ&ドロップ、ショートカットを作成すると、ショートカットのプロパティでショートカット起動時の作業フォルダ(カレントフォルダ)の指定が出来るとか。
    • good
    • 0
この回答へのお礼

ありがとうございます。
疑問が解消しました。検索してもなかなか見つかりませんでしたが、やっぱり誤解する人は多いのですね。

お礼日時:2015/01/25 09:06

こんにちは。



前回も見ていましたが、バッチは守備範囲外で割り込みにくかったのですが、
本来は、VBAだけで済むのではないでしょうか。(ネイティブVBAコードではありませんが)

>マクロから起動した時だけ、どうしてデスクトップにコピーされるのでしょうか?
カレントフォルダはファイルの開いたフォルダによって決ってしまうことがありますから、それ自体は、分かりません。むしろ、確実にフォルダを移動したほうがよいです。ただ、正直な所、なぜ、こんなに、ややこしいをしなくてはならないのか、そのほうが分かりませんが。(^^;

一応、以下をみれば、その理屈は分かってくださると思います。


Batch.bat:
Copy "FolderA\fileA" . '←ピリオド
--------------------------
'バッチ起動
Dim ret As Long
Dim Pfol as String
ChDir "FolderB\" 'フォルダの移動
Pfol= CurDir 'カレントフォルダの確認方法(マクロの稼働中のカレントフォルダ)
ret = Shell("batch.bat", vbNormalFocus)
ChDir ThisWorkbook.Path '本来のパスに戻る
==============

'VBA
Dim myDest As String
Dim mySource As String
Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
myDest = "FolderB\"  '目的フォルダ
mySource = "FolderA\" 'ソースフォルダ
FSO.CopyFile mySource & "FileA", myDest
    • good
    • 0
この回答へのお礼

いつもお世話になります。

ご回答を読み思ったのですが、
copy forlderA/fileA folderB/fileA
コピー先もフルパスで書けば、カレントフォルダに影響されないからOK?

バッチファイルにする理由は、ファイル数が多い場合にバッチファイルに任せてエクセルを他仕事に使えるからです。かといっていつまでも動かず手操作を続ける位なら、回答頂いたマクロを使わせて頂きます。

お礼日時:2015/01/24 09:12

> Copy "folderA\fileA" . '見えにくいですが、最後にピリオドがあります。


> folderAやfolderBはそれぞれのフォルダのフルパスです。

ならば、folderAのFileAを【カレントフォルダ】にコピーするって命令ですから、

> 実行すると、何故かフォルダBでなくてデスクトップにコピーされます。

実行時のカレントフォルダがデスクトップなら、正しい動作です。

> バッチファイルをクリックして直接起動すると、目論見通りフォルダBにコピーされます。

バッチファイルをダブルクリックした場合は、バッチファイルのあるフォルダがカレントフォルダとして処理されますので、こちらも正しい処理です。


> マクロから起動した時だけ、どうしてデスクトップにコピーされるのでしょうか?

どういうアプリケーション、手順でマクロから起動しているのか不明瞭ですが、マクロないしShellコマンドの実行時のカレントフォルダがデスクトップになるようになってるからでは。

--
> バッチファイルをクリックして直接起動すると、

試しに、
・コマンドプロンプトを起動。
・cdコマンドで適当なフォルダへ移動。
 →カレントフォルダが指定したフォルダになります。
・コマンドプロンプトのウィンドウへ、そのバッチファイルをドラッグ&ドロップ。
 →バッチファイルのフルパスが入力される。
・Enterでバッチファイルを実行。

すると、ファイルをカレントディレクトリへコピーしてるって動作が確認できると思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
バッチファイルはフォルダBにあります。エクセルファイルはデスクトップでもなく、まったく別フォルダにあります。

「カレントフォルダ=バッチファイルのあるフォルダ」と思ってましたが、そうではないということですか?起動時のカレントフォルダの確認方法とかあるのでしょうか?

お礼日時:2015/01/24 00:59

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