- ベストアンサー
excel2003でのファイル検索VBA
当方excel2003利用者です。 今回、Aというフォルダにある拡張子png且つファイルサイズ2000KB以上且つ更新日が過去1週間以内のものを検索、抽出し、Bというフォルダにコピーさせるマクロを作りたいと考えています。 現在Dir関数、Filelen関数、FileDateTime関数を組み合わせて試行錯誤していますがうまくいきません。 参考例を教えていただけないでしょうか? 宜しくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
FileSystemObject のMoveFileのメソッドの方が確かですから、こちらを使いました。 また、余計かもしれませんが、この内容は特に、Excelを使わなくても良いのではないかと思います。つまり、WScript で、Filelen, FileDateTime は、それぞれ、Size, LastModifiedDate のプロパティに換えます。一旦、アンチウィルスで通してあげれば、使えるようになります。 '// Sub Test1() Dim objFS As Object Dim srcDir As String Dim dstDir As String Dim oDate As Date Dim fn As String Dim i As Long oDate = Date - 7 '一週間前(7日) Set objFS = CreateObject("Scripting.FileSystemObject") Const EXT As String = ".png" Const LIMITSIZE As Integer = 20 srcDir = "A\" '←必ず最後に'\'を入れる 'ソース dstDir = "B\" '←必ず最後に'\'を入れる 'コピー先 fn = Dir(srcDir & "*" & EXT, vbNormal) Do While fn <> "" If fn <> "." And fn <> ".." Then If FileLen(srcDir & fn) > LIMITSIZE And FileDateTime(srcDir & fn) >= oDate Then On Error Resume Next objFS.MoveFile srcDir & fn, dstDir On Error GoTo 0 i = i + 1 End If End If fn = Dir Loop MsgBox i & " 個のファイルを移動しました。", vbInformation Set objFS = Nothing End Sub
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
#3の訂正です。 質問を読み間違えました。移動だと思ったのですが、コピーでしたので、 On Error Resume Next objFS.MoveFile srcDir & fn, dstDir On Error GoTo 0 ↓ On Error Resume Next objFS.CopyFile srcDir & fn, dstDir On Error GoTo 0 と変えます。 それと、 Const LIMITSIZE As Integer = 20 ↓ Const LIMITSIZE As Integer = 2000 'ファイルサイズ に書き換えてください。
- hananoppo
- ベストアンサー率46% (109/235)
こんな感じでどうでしょう。 Sub PngCopy() Dim Path1 As String, Path2 As String Dim FileName As String Path1 = "C:\A\" Path2 = "C:\B\" FileName = Dir(Path1 & "*.png") Do Until FileName = "" If FileLen(Path1 & FileName) >= 2048000 And FileDateTime(Path1 & FileName) >= Date - 7 Then FileCopy Path1 & FileName, Path2 & FileName End If FileName = Dir() Loop End Sub
- hallo-2007
- ベストアンサー率41% (888/2115)
試行錯誤されていることなので、別の観点からアドバイスです。 以下のマクロを新しいシートの上で実行してみてください。 Sub ボタン1_Click() Target = InputBox("ディレクトリ名を入力", "ディレクトリの指定", ThisWorkbook.Path) Set FS = CreateObject("Scripting.FileSystemObject") Set Fol = FS.GetFolder(Target) Set Fil = Fol.Files Rows("3:65536").ClearContents i = 3 For Each Fx In Fil 'ファイル名の書き出し Cells(i, 2) = Fx.Name 'ファイルのサイズ Cells(i, 3) = Fx.Size '最終更新日 Cells(i, 4) = Fx.DateLastModified i = i + 1 Next End Sub 後は、IF分なりで抽出できると思いますし、必要なファイルをBフォルダーへコピーすればよいです。 私流かもしれませんが、ファイルの操作の場合は 1、Bフォルダーのファイルの削除(クリア)のボタン(必要ならば) 2、Aフォルダーの必要なファイルの一覧の作成 3、一覧で取得したファイルのコピー 4、確認のためのBフォルダーのファイルの一覧表示 とボタンを複数作成して操作した方が間違いやとんでもない失敗をしなくてすみます。
お礼
ありがとうございました!!