以下の記述を
拡張子bat (filecopy.batとか) のテキストファイルとして保存し
実行すれば、目的のことはできると思います。
バッチファイルの最初の方にある
copy_from、copy_to、list_file、work_fileに指定しているパスは
そちらの環境に合わせて書き換えてください、
また、エクセルのA列は
バッチファイル内のset list_fileで指定するファイルにコピーしておきます。
==ここから====================================
@echo off
rem copy_fromにmainフォルダ、copy_toにmatomeフォルダを設定する
set copy_from=D:\Temp\main
set copy_to=D:\Temp\matome
rem エクセルのA列をテキストファイルにコピーして
rem そのテキストファイルのパスを指定する
set list_file=D:\Temp\filelist.txt
rem work_fileには作業用に生成されるファイル名を適当に指定
set work_file=D:\Temp\fullpathlist.txt
rem 作業ファイルが存在するなら削除
del "%work_file%"
rem dirでファイルを探すためコピー元フォルダに移動
pushd "%copy_from%"
rem コピーするためのファイルリスト(フルパス)をwork_fileに出力
for /f "delims= usebackq" %%F in ("%list_file%") do (
dir /b /s "%%~F" >> "%work_file%"
)
rem コピーを実行
for /f "delims= usebackq" %%G in ("%work_file%") do (
copy "%%~G" "%copy_to%\%%~nxG"
)
rem 元のフォルダに戻る
popd
==ここまで====================================
[D:\Temp\filelist.txt の内容]
aaa.txt
ccc.txt
ggg.txt
hhh.txt
kkk.txt
mmm.png
これって、今までは手動でやってたんでしょうか。
だとしたら私の感覚だと信じられない時間の無駄遣い・・・。
何でも良いからプログラミング勉強しようよ。
解釈が合っていればいいんですが。
まず、添付図の説明です。
Sheet1のA1からコピーしたいファイル名が入力されています。
処理手順は2つあって、ファイル名の抽出とコピーの実行です。
【ファイル名の抽出】
指定フォルダーの(サブフォルダーも含めて)ファイルで拡張子が「txt、png」のファイルの、ファイル名をE列、フルパスをF列に出力します。
同時に、出力したファイル名でA列を検索し、一致すればD列に「〇」を付けました。A列のファイル名についても、「〇」と何行目に一致したかを表示します。
最初の処理は終わりです。添付図ではCommandButton1に割り当てています。
【コピーの実行】
D列の「〇」が付いたファイルについてコピーします。添付図ではCommandButton2に割り当てています。(この「〇」が付いたファイルをフルパスを求めてコピーしたいと解釈したわけです。合ってます?)
標準モジュールの2つのフォルダー名はご自分の環境に合わせてください。数個のフォルダーとファイルでテストしてください。単純なことしかしていないので、内容は見てもらえば分かるでしょう。添付図のセル位置がモジュールの内容に関連しています。とりあえず、A列へのファイル名の入力と、シート名「Sheet1」は守ってください。
質問の前提で考えました。イレギュラーに対応するエラー対応は長くなるので書いていません。ご理解ください。当方、Excel2010です。
<<Sheet1のコードウィンドウに貼り付けます>>
↓
'************************
'ファイルを探す
'************************
Private Sub CommandButton1_Click()
Set ws1 = Worksheets("Sheet1") 'ワークシートを変数にする
rw = 0 '行カウンタクリア
Range("B:F").ClearContents '出力範囲クリア
Set TargetArea = Range("A1", Cells(Rows.Count, "A").End(xlUp))
FileSearch mainFolder 'ファイルの検索開始
End Sub
'************************
'ファイルをコピーする
'************************
Private Sub CommandButton2_Click()
Dim cnt As Integer 'コピーしたファイル数
rw = 1
While Cells(rw, "E") <> ""
If Cells(rw, "D") = "○" Then
'コピー実行
FileCopy Cells(rw, "F"), destiFolder & "\" & Cells(rw, "E")
cnt = cnt + 1
End If
rw = rw + 1
Wend
MsgBox cnt & "個のファイルをコピーしました。"
End Sub
<<標準モジュールに貼り付けます>>
↓
Public ws1 As Worksheet 'ワークシート
Public rw As Long '行カウンタ
Public TargetArea As Range '登録されたファイル名
Public FoundCell As Range '検索したセル
'■■ 次の2つのフォルダー名は設定する
Public Const destiFolder = "D:\matome" 'matomeにあたる
Public Const mainFolder = "D:\FileSearchTest" 'mainにあたる
'*******************************************
'指定フォルダー(サブフォルダーも)調べる
'*******************************************
Sub FileSearch(strFolder As String)
Dim fso As Object 'ファイルシステムオブジェクト
Dim folder As Object 'フォルダー
Dim subfolder As Object 'サブフォルダー
Dim file As Object 'ファイル
Set fso = CreateObject("Scripting.FileSystemObject")
Set folder = fso.GetFolder(strFolder)
'サブフォルダーを調べる(再帰)
For Each subfolder In folder.SubFolders
FileSearch subfolder.Path
Next
'見つけたファイルを書き出す
For Each file In folder.Files
If Right(file, 4) = ".txt" Or Right(file, 4) = ".png" Then
rw = rw + 1
ws1.Cells(rw, "E") = file.Name
ws1.Cells(rw, "F") = file.Path
Set FoundCell = TargetArea.Find( _
what:=file.Name, LookIn:=xlValues)
'見つけたらシートに印を付ける
If Not (FoundCell Is Nothing) Then
ws1.Cells(rw, "D") = "○"
ws1.Cells(FoundCell.Row, "B") = "○ " & Right(" " & rw, 4)
End If
End If
Next
End Sub
お礼
ありがとう御座います。 紹介頂いたサイトと、Gotthold さんのオススメから VBAの勉強でもしてみようと思います。 本当に助かりました。