- ベストアンサー
ある条件のもとでのファイル削除
お世話になります。 あるフォルダにデータがたくさん入っています。(画像データが主) またそのフォルダの中で必要なデータのファイル名を入力したエクセルファイルがあります。 対象のフォルダから、エクセルに入力されたファイル名と同名のファイルのみ残して他のファイルは削除したい。(もしくは必要なファイルのみ別のフォルダに移すというのでも可) 例) 対象のフォルダに 0001.tif,0002.tif,0003.tif,0004.tif,0005.tif があり エクセルのデータに 0002.tif,0005.tif が入力されているとすると 0001.tif,0003.tif,0004.tif をフォルダから削除する。 ちなみにエクセルに入力されているファイル名のデータは同じ列に1行ずつ入力されている。(A1に0002.tif,A2に0005.tif という具合です) もちろん実際のファイル数はかなりあるので手動でというのは無し。 以上のような処理を簡単に出来る方法をアドバイスください。 便利なフリーソフト、コマンドプロンプトの使用、何かエクセルの機能を使うなどアプローチはどんな方法でも構いません。 OSはWinXP proです。 よろしくおねがします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
他のファイルはそのままでよいのですね。 No.2の回答と同じやり方で以下のマクロをコピーして貼りつけ、実行してください。 なお、2行目の「必要なファイル」というところは作成するフォルダ名です。実際には違う名前の場合は書き換えてください。 3行目の"A"というのは、ファイル名が入力されている列名です。A列以外の場合はその列名に書き換えてください。 Sub ファイル移動() Const DirName As String = "必要なファイル" Const FileCol As String = "A" Dim F As String Dim R As Range F = ThisWorkbook.Path & "\" If Dir(F & DirName, vbDirectory) = "" Then MkDir F & DirName For Each R In Range(Cells(1, FileCol), Cells(Rows.Count, FileCol).End(xlUp)) If R.Value <> "" And Dir(F & R.Value) <> "" Then Name F & R.Value As F & DirName & "\" & R.Value End If Next End Sub
その他の回答 (7)
- Oh-Orange
- ベストアンサー率63% (854/1345)
★回答者 No.3 です。 ・過去の回答履歴より、似たような事が出来る VBScript を見つけたので参考にして下さい。 ・http://oshiete1.goo.ne.jp/qa2757928.html→『ファルダ内に散在してるファイルを検索し一箇所にコピーしたい』 ・上記で紹介しているスクリプトを改変などすれば Excel のデータファイル(csv)からフォルダ名を 取り出して自動化できます。 ・以上。おわり。→参考になればと思い再回答!
お礼
ありがとうございました。 参考にします。
- ham_kamo
- ベストアンサー率55% (659/1197)
うまく動いたようでよかったです。 > たとえばエクセルに入力されたファイルだけ、 > フォルダ内に「必要なファイル」とかいう名前の > フォルダを新規に作り、そのフォルダに移すと > いうことは出来ますか? フォルダを作ってファイルを移すのはできるのですが、 ・エクセルに入力されたファイルを移して、それ以外のファイルは削除する のか、それとも ・エクセルに入力されたファイルを移して、それ以外のファイルはそのままにするのか、 どちらなのか、補足していただけますでしょうか。
補足
返信ありがとうございます。 「その以外のファイルはそのままにする」でおねがいします。
- ham_kamo
- ベストアンサー率55% (659/1197)
No.2 & 4です。 「反応しなくなった」というのは、私は「Excelがフリーズした」と思ったのですが、そうではなくて、マクロを実行してもうんともすんとも言わず、ファイルの削除も行われなくなった、ということでしょうか。 もしそうであれば、マクロを以下と置きかえていただけますでしょうか。これでうまく動くといいのですが…。 Sub ファイル削除() Dim FileName As String FileName = Dir(ThisWorkbook.Path & "\*.*") Do While FileName <> "" If Columns("A:A").Find(FileName) Is Nothing And FileName <> ThisWorkbook.Name Then Kill ThisWorkbook.Path & "\" & FileName End If FileName = Dir() Loop End Sub
補足
ご回答ありがとうございます。 試した結果、問題なく動いてくれました。 わがままついでなんですが、たとえばエクセルに入力されたファイルだけ、フォルダ内に「必要なファイル」とかいう名前のフォルダを新規に作り、そのフォルダに移すということは出来ますか?
- ham_kamo
- ベストアンサー率55% (659/1197)
No.2です。 > 上の例のほかいろいろ試して成功していました。 > しかし突然反応しなくなりました。 > なにか考えられることはありますか? 「突然反応しなくなった」のは何でしょうか。エクセルですか? エクセルファイルを開いても反応しなくなったのか、マクロを実行したら反応しなくなったのか、どれでしょうか。 その前の「いろいろ試して」というのがひっかかりますが、何か変えたりしましたか?
補足
回答ありがとうございます。 どのタイミングで反応しなくなったかははっきりと不明ですが、いろいろ試してみたあとエクセルを上書き保存後、閉じました。再度開いてからは反応しません。 試しに違うエクセルを作ってマクロを貼り付けて、マクロを実行しましたが動きません。 会社のパソコンでも試しましたが、同様に最初は動きましたが、エクセルを閉じたあとは反応しませんでした。
- Oh-Orange
- ベストアンサー率63% (854/1345)
★『csvファイル』から移動バッチファイルを作成する方法はどうでしょうか。 ・回答者 No.1 さんが削除一覧を作成する方法ですが、私は必要なファイルを 別フォルダへ移動する方法を紹介します。→移動後に残ったファイルは フォルダごとごみ箱へ捨てて下さい。 作成方法: ・『csvファイル』をメモ帳などで開きます。 ・全ての行の先頭と末尾を次のように編集します。 行の先頭に『MOVE 』の5文字を挿入します。 行の末尾に『 ..\MoveFolder』の14文字を追加します。 ・編集テキストの先頭行に『MD ..\MoveFolder』の16文字を行挿入します。 ・ファイル名をつけて保存を選択します。 ファイル名は自由ですが拡張子は『.bat』にして下さい。 保存するフォルダは『csvファイル』と同じフォルダに必ず保存します。 実行: ・エクスプローラから『csvファイル』と同じフォルダに保存されたバッチファイルを ダブルクリックします。→親フォルダに『MoveFolder』というフォルダが自動作成 されて、ここに『csvファイル』の必要なファイルだけが移動します。 ・移動後は『csvファイル』があるフォルダを削除(ごみ箱へ移動)します。 ・自動作成された『MoveFolder』というフォルダ名を削除したフォルダ名にリネームして おきます。 ・上記の1連の操作をフォルダ数繰り返します。→フォルダ数が3~5個なら頑張りましょう。 多い場合は、VBスクリプトを作成して、一気に移動と削除を行えるスクリプトを作ることになります。 最後に: ・行の先頭、末尾に文字列を挿入する編集支援ソフトは、クリップボード関連のソフトを 探せば見つかります。→これらのフリーソフトと組み合わせて『csvファイル』から移動 バッチファイルを作成します。そして、このバッチファイルを実行させることで大量の ファイルを別フォルダへ移動します。その後、残ったフォルダを丸ごとごみ箱へ捨てます。 ・以上。おわり。→下の『参考URL』のソフトで行の先頭、末尾に文字列を挿入できます。
お礼
ありがとうございました。
- ham_kamo
- ベストアンサー率55% (659/1197)
エクセルは他のファイルと同じフォルダにあるのですよね? エクセルのマクロでやる方法です。 削除しないファイル名が書いてあるシートのシートタブを右クリックし、「コードの表示」を選択します。 マクロの画面が出るので、以下のマクロを右の白い画面にコピーして貼り付けます。 ※マクロ中の"A:A"という箇所は、もしファイル名が書かれている列がA列でない場合は、実際の列名に書き換えてください。 Sub ファイル削除() Dim FileName As String FileName = Dir("*.*") Do While FileName <> "" If Columns("A:A").Find(FileName) Is Nothing And FileName <> ThisWorkbook.Name Then Kill FileName End If FileName = Dir() Loop End Sub その画面からF5キーを押してマクロを実行すると、エクセルのシートに入力されていない同じフォルダのファイルが削除されます。 ★もし不具合があって必要なファイルまで削除してしまうと危険なので、事前にフォルダごとコピーしておいてバックアップをとっておく方がよいでしょう。
お礼
ありがとうございました。
補足
ご回答ありがとうございます。 上の例のほかいろいろ試して成功していました。 しかし突然反応しなくなりました。 なにか考えられることはありますか?
エクセルの表にファイル一覧を取込み、削除一覧を作成する 削除一覧をcsvに保存しテキストエディタで削除コマンドに置換し、BAT拡張子に変更した後実行する
お礼
ありがとうございました。
お礼
ありがとうございました。 期待通りの動きをしてくれました。