• ベストアンサー

数階層のあるフォルダのコピーを 簡単にするVBA

luka3の回答

  • ベストアンサー
  • luka3
  • ベストアンサー率74% (314/421)
回答No.3

どうしてもVBAでなければならないのでしょうか。 一度だけ統合してしまえばいいので、言語にこだわる必要がない気がしまして。 ちょうど先週、ファイルを整理するものを作っていたのでそれを少し改造しました。 下記のプログラムをコピーしてメモ帳かテキストエディタに貼り付けて、 『 統合.js 』といったファイル名で保存し、ダブルクリックで実行して下さい。 保存する際は、メモ帳なら文字コードを『ANSI』、エディタなら『シフトJIS』で保存してください。 余計なお世話かもしれませんが、コピーしたファイル名の結果を log.txt に保存します。 var WShell = WScript.CreateObject("WScript.Shell"); var fso = WScript.CreateObject("Scripting.FileSystemObject"); var ForReading=1, ForWriting=2, ForAppending=8; var slog = ""; // .jsでは \ を使う時2つ続けて \\ にします var srcDir = "C:\\統合元フォルダ名\\*.pdf"; // <= 統合元のフォルダ名と対象の拡張子 var dstDir = "C:\\統合先フォルダ名\\"; // <= 統合先のフォルダ名 var files = GetFileList(srcDir); for (var ia=0; ia<files.length; ia++) CopyFile(files[ia], dstDir); if (slog) WriteFile("log.txt", slog); Err("作業終了"); function GetFileList(pat) { // 指定ファイルの一覧を取得して配列で返す var tmpfile = "tmp$$$.$$$"; WShell.Run('%comspec% /c dir /s /on /b "' + pat + '">'+tmpfile, 8, true); if (!fso.FileExists(tmpfile)) Err("not found "+tmpfile); var str = ReadFile(tmpfile); fso.DeleteFile(tmpfile); return str.split(/\r?\n/); } function CopyFile(filename, dstDir) { // ファイルコピー if (!fso.FileExists(filename)) return ; var m = filename.match(/.*\\(.*)\\(.*)$/); // ファイル名と親フォルダの名前を取得 var newdir = dstDir+m[1]; // コピー先のフォルダ名 var newname = MakeNewName(m[2], newdir); // 新しいファイル名 if (!fso.FolderExists(newdir)) fso.CreateFolder(newdir); // フォルダが無ければ作成 fso.CopyFile(filename, newname); slog += filename + "\r\n => " + newname + "\r\n"; } function MakeNewName(name, pdir) { // コピー先の名前を返す 重複する場合は (1) を付加 var newname = fso.BuildPath(pdir, name); if (fso.FileExists(newname)) { // 同じ名前が存在するか var basename = fso.GetBaseName(name); // ファイル名主部 var ext = "."+fso.GetExtensionName(name); // ファイル名拡張子 for (var ic=1; ; ic++) { newname = fso.BuildPath(pdir, basename+" ("+ic+")"+ext); if (!fso.FileExists(newname)) break; // 存在しなければ終了 } } return newname; } function ReadFile(filename) { // テキストファイルを読み込んで返す var s = ""; if (fso.FileExists(filename) && fso.GetFile(filename).Size>0) { var ts = fso.OpenTextFile(filename,ForReading,true); s = ts.ReadAll(); ts.Close(); } return s; } function WriteFile(filename, s) { // テキストファイルを書き込む var ts = fso.OpenTextFile(filename,ForWriting,true); ts.Write(s); ts.Close(); } function Err(msg) {WScript.Echo(msg); WScript.Quit();}

関連するQ&A

  • 何階層もあるフォルダツリー内に散らばったファイルをひとつのフォルダにコピーするソフト

    たとえば、Aと言う名のフォルダが頂点にあり、その中に10数個のフォルダがあります。その10数個のフォルダそれぞれにも複数のフォルダがあるとします。そしてそのフォルダそれぞれに何かしらのファイルが存在しています。 このファイルをひとつのフォルダに移動、またはコピーをしたいのですが、手動でやっていたのでは時間がかかるし、見落としもありえます。 自動でやってくれるフリーソフトなどはないのでしょうか? ちなみに、散らばったファイルには同名ファイルも存在したりします。それらがひとつのフォルダに移動されるわけですが、そのとき、勝手に上書きしたりせず、ちゃんと聞いてくるようなソフトを希望です。 何をやりたいかと言うと、長年にわたってため続けたiTunesの保存フォルダをリフレッシュしたいのです。

  • Windows7 フォルダの上書きコピーについて

    Windows7のフォルダの上書きコピーについて質問です。 ファイルサーバにフォルダAがあり、中にファイル1があります。 クライアントPCのフォルダAの中には ファイル1-2、ファイル2、ファイル3、ファイル4、ファイル5があった場合 フォルダAをファイルサーバからクライアントへ『フォルダごとコピー』すると、 『統合しますか』の次に『コピーして置き換える』を選択してもフォルダBのファイル1が更新されるだけで ファイル2、ファイル3、ファイル4、ファイル5が削除されません。 ファイル2、ファイル3、ファイル4、ファイル5を削除するにはどういったコピーをすれば良いでしょうか。 フォルダコピーをしたときに中身も上書きするためにはどうしたら良いでしょうか。 ファイルサーバのフォルダA、ファイル1をフォルダごとクライアントに上書きコピーしたいです。 XPだとフォルダ内ごと上書きできたと思うのですが、7だとできません。 ご存知の方がいらっしゃいましたらご教授願います。

  • パソコンのすべてのファイルとフォルダが上書きできない!

    パソコンの全てのファイルとフォルダが上書きできません!フォルダ名と上書き保存しようとすると 『保存できません。ファイルがロックされています。windowsエクスプローラーのプロパティコマンドで、ファイルのロックを解除してください。ID=-45』 そこでプロパティを見ると読み取り専用にするに■の緑になってる。 だからそこを空白にし直して適用&OKを押して大丈夫かと思いきや もう一度プロパティを開くと、同じ状態です。 上書き保存できないので、全然仕事になりません。(とりあえずは別名保存しまくってます。) 誰か助けてくださいましm(_ _)m

  • フォルダ作成と別名保存【VBA】

    教えてください 現在、下の2つのマクロを使っています。 「O27」の値でフォルダを作るものとブックを別名保存するものです。 これを1つにまとめたいのですが単純に1つにまとめるとフォルダは作成されるのですがブックの別名保存がセルの値を参照してくれません。 また、MkDir でフォルダを作成すると同じ名前のフォルダが先にあるとエラーになってしまいます。 この2点を解消できる方法はないでしょうか? よろしくお願いいたします。 Sub 別名フォルダ() MkDir Worksheets("オーダーシート").Range("O27").Value End Sub Sub 別名保存() Application.Dialogs(xlDialogSaveAs).Show Arg1:=Range("O27").Value End Sub

  • フォルダのコピーについて

    Dドライブに保存したデータを外付けのハードディスクにコピーする時に、同名のファイルやフォルダがあると毎回「上書きしますか?」 と聞かれるんですが、元のフォルダに新しく保存したデータだけコピーするにはどうしたらよいでしょうか? 例えば、Dドライブにa,b,c,d,e,f,gとファイルがあるとします。 外付けにはa,b,c,dはすでにコピーしてありますが、e,f,gはまだしていません。この状態でe,f,gだけコピーするやり方を教えて頂きたいのですが…すべて上書きだととても時間がかかってしまうし、単純に新しいデータだけ選択してコピーすればいいんですが、フォルダの中身コピー元とコピー先でがバラバラに並んでいるので抽出するのが大変なので… どなたかよろしくお願いします。

  • 3つのフォルダをコピーしたい

    3つのフォルダがあります。(1)A・B・Cファイル(2)A・B・Dファイル(3)B・C・D・Eファイルの3種類をまとめたA・B・C・D・Eファイルのフォルダを作成したいのですが、エクスプローラーだと上書きを1つずつすれば、良いのでしょうが自動でまとめれるソフトがあるのでしょうか?

  • VBA PDFを同じフォルダに保存する

    EXCELの差し込み印刷でPDFファイルを出力する方法 https://excel.kuuneruch.com/sasikomi-pdf-select/ 保存場所を同じフォルダに保存したいのですが、どうしたらよいでしょうか? '⑥ひな形シートでPDFを作成する(作成PDFファイル名を指定する) Call CreatePdfFile("D:\100_PDF\" & .Range("A" & nowRow) & ".pdf")

  • イラストレーターCS2でPDFを編集したいのですが

    イラストレーターCS2でPDFファイルをちょっとだけ編集して、 そのままPDFのまま保存したいのですが、イラストレーターCS2の保存が できないようになっています。これはプロテクトが働いているのでしょうか?別名なら保存が可能なのですが、別名ですると複数枚あったPDFファイルが1枚になって保存されてしまいます。 また、複数枚のPDFファイルを1つに統合するフリーウェアはないのでしょうか?

  • 同名のファイル 上書きにならないように

    宜しくお願い致します。 複数のフォルダのなかにある 複数のファイルを ひとつの新規のフォルダにすべてコピーするという作業をするときに 同名のファイルがあると 上書きするかという ダイアログが でてきますが これを 上書きでなく 別名のファイルにして 当該のフォルダに 保存したいのですが 元フォルダにおいて 別名に どちらかをしてから コピーするというのは 多数の場合は 手間が かかります 自動的に 同名ファイルであっても どちらかの名前を 変更して 上書きが 起こらないように 保存できる ソフト ご存知のかた 教えてください 同名ファイルは 3つ以上のこともありえます 宜しくお願い致します。

  • 上書き保存できなくて困っています。

    上書き保存できなくて困っています。 会社でネットワークが組まれている共有フォルダの中のファイルが上書き保存できません。 エクセルだと“ファイルを保存できませんでした” ワードだと“ネットワークまたはファイルアクセス権のエラーです。ネットワーク接続が切断された可能性があります” というメッセージがでます。 デスクトップなど、そのフォルダの外に別名で保存し、それをそのフォルダに入れると上書きできます。 どうすれば今まで通り普通に上書き保存できるのでしょうか。