• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBA バッチファイルでコピーできない)

VBAバッチファイルコピーできない

このQ&Aのポイント
  • VBAバッチファイルでのファイルコピーがうまくいかないという質問です。マクロからバッチファイルを実行してファイルをコピーする処理を行っていますが、いくつか問題が発生しています。
  • 具体的には、実行するとフォルダBではなくデスクトップにファイルがコピーされるという現象が発生しています。直接バッチファイルを起動したり、コマンドプロンプトからバッチファイルを起動する場合は、目標どおりにフォルダBにファイルがコピーされます。
  • なぜマクロから起動した場合にファイルがデスクトップにコピーされるのか、原因を特定する必要があります。問題の解決策や対策方法を教えてください。

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

  • ベストアンサー
回答No.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をかじっていたら、入りやすいことは間違いありません。

High_Score
質問者

お礼

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

その他の回答 (5)

  • Kaneyan-R
  • ベストアンサー率42% (1340/3126)
回答No.5

「.」は「現在のディレクトリ=カレントディレクトリ」を指す相対パスです。「バッチファイルが存在するディレクトリ」を指すものではありません。 マクロからフルパス指定でバッチファイルを呼び出しているので、あくまで動いているのはマクロであって、バッチファイルではないです。 同じような現象を体感するなら、コマンドプロンプトで実行する際、ディレクトリを移動せず(カレントディレクトリを変更せず)、フルパスでバッチファイルを実行してみて下さい。 c:\Usars\xxxxxx> folderB\batch.bat ファイルはカレントディレクトリである「c:\Usars\xxxxxx\」にコピーされるはずです。 また、エクスプローラーでバッチファイルがあるフォルダを開かず適当なフォルダを開いた状態で、アドレスバーに直接フルパスでバッチファイルを指定してみて下さい。ファイルはカレントディレクトリである「今開いているフォルダ」にコピーされるはずです。 ※Windows Vista以降は、アドレスバーを右クリック→「アドレスの編集」で入力可能になります。 WSH使えばマクロだけで事足りる話ではありますが、バッチファイルがどうしても使いたいのであれば Copy "folderA\fileA" . ではなく Copy "folderA\fileA" %~dp0 とすると、バッチファイルがあるフォルダにコピーされると思います。 ※「%~dp0」は、自分自身のパスを格納する引数(%0)からダブルクォートを削除(~)し、ドライブ名のみ(d)+パスのみ(p)に展開する=ファイル名を含まない自分自身のパス=『自分自身が存在するフォルダ』と言う意味です。

High_Score
質問者

お礼

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

回答No.4

こんにちは。 すでに、#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/20100218/344797/ http://itpro.nikkeibp.co.jp/article/COLUMN/20060116/227312/ これは、テキストエディタやメモ帳で作れます。

High_Score
質問者

お礼

ありがとうございます。 HTA、まったく知りません。おそらく他質問へ私が回答した中の「独立したソフト」を受けての事と思いますが、単にプロシージャの集合体として独立したものの意味で(サブルーチンの集まりでなく)ソフトと書いたに過ぎません。 VBS Wikipediaを読むと、VBSは収束方向で今後はVB.netが主流になるように書いてます。どちらを勉強しようか迷っていて、恥ずかしながら結局どっちも手つかずです。何か御意見ありましたら是非お願いします。 http://ja.wikipedia.org/wiki/VBScript

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.3

> 「カレントフォルダ=バッチファイルのあるフォルダ」と思ってましたが、そうではないということですか? その通りです。 下記の、カレントフォルダを確認するコマンドなんかを実行させるとかすれば、確認できます。 > 起動時のカレントフォルダの確認方法とかあるのでしょうか? コマンドで行うのなら、「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/sub05_110_140.html -- その他、バッチ処理ではコマンドでカレントフォルダ指定しますが、そのバッチファイルを右クリックでドラッグ&ドロップ、ショートカットを作成すると、ショートカットのプロパティでショートカット起動時の作業フォルダ(カレントフォルダ)の指定が出来るとか。

High_Score
質問者

お礼

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

回答No.2

こんにちは。 前回も見ていましたが、バッチは守備範囲外で割り込みにくかったのですが、 本来は、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

High_Score
質問者

お礼

いつもお世話になります。 ご回答を読み思ったのですが、 copy forlderA/fileA folderB/fileA コピー先もフルパスで書けば、カレントフォルダに影響されないからOK? バッチファイルにする理由は、ファイル数が多い場合にバッチファイルに任せてエクセルを他仕事に使えるからです。かといっていつまでも動かず手操作を続ける位なら、回答頂いたマクロを使わせて頂きます。

  • neKo_deux
  • ベストアンサー率44% (5541/12319)
回答No.1

> Copy "folderA\fileA" . '見えにくいですが、最後にピリオドがあります。 > folderAやfolderBはそれぞれのフォルダのフルパスです。 ならば、folderAのFileAを【カレントフォルダ】にコピーするって命令ですから、 > 実行すると、何故かフォルダBでなくてデスクトップにコピーされます。 実行時のカレントフォルダがデスクトップなら、正しい動作です。 > バッチファイルをクリックして直接起動すると、目論見通りフォルダBにコピーされます。 バッチファイルをダブルクリックした場合は、バッチファイルのあるフォルダがカレントフォルダとして処理されますので、こちらも正しい処理です。 > マクロから起動した時だけ、どうしてデスクトップにコピーされるのでしょうか? どういうアプリケーション、手順でマクロから起動しているのか不明瞭ですが、マクロないしShellコマンドの実行時のカレントフォルダがデスクトップになるようになってるからでは。 -- > バッチファイルをクリックして直接起動すると、 試しに、 ・コマンドプロンプトを起動。 ・cdコマンドで適当なフォルダへ移動。  →カレントフォルダが指定したフォルダになります。 ・コマンドプロンプトのウィンドウへ、そのバッチファイルをドラッグ&ドロップ。  →バッチファイルのフルパスが入力される。 ・Enterでバッチファイルを実行。 すると、ファイルをカレントディレクトリへコピーしてるって動作が確認できると思います。

High_Score
質問者

お礼

ありがとうございます。 バッチファイルはフォルダBにあります。エクセルファイルはデスクトップでもなく、まったく別フォルダにあります。 「カレントフォルダ=バッチファイルのあるフォルダ」と思ってましたが、そうではないということですか?起動時のカレントフォルダの確認方法とかあるのでしょうか?

関連するQ&A