- ベストアンサー
VBAでファイルを移動する方法
- VBAを使って複数のファイルを一つのフォルダにまとめて移動する方法を教えてください。初心者です。
- 参照したサイトのコードを使用して、ファイル名を取得してExcelにリストを作成する方法を理解しました。しかし、具体的なファイルの移動方法がわかりません。
- 実際に行いたい処理は、図面がたくさん入っているフォルダから特定のファイルを取り出し、別のフォルダに移動したいです。具体的な手順がわかりません。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
では、 C:\Users\Desktop\移動元 という空っぽのフォルダがあったとして ここにZipファイルを解凍した。 サブフォルダが幾つかとそれぞれのフォルダに複数のファイルが出来た。 Zipファイルを除きすべてのファイルをC:\Users\Desktop\移動先フォルダのルートに 移動したい。 という解釈であっているとして・・。 Sub test02() Dim oFs As Object Dim oDir As Object Dim oFile As Object Dim FromDir As String Dim ToDir As String FromDir = "C:\Users\Desktop\移動元" ToDir = "C:\Users\Desktop\移動先\" '\を忘れずに Set oFs = CreateObject("Scripting.FileSystemObject") Set oDir = oFs.getfolder(FromDir) Set oFile = oDir.Files If oFs.FolderExists(FromDir) = False Then MsgBox "送り元が見つかりません" GoTo atoShimatu End If If oFs.FolderExists(ToDir) = False Then If MsgBox("送り先フォルダが見つかりません。作成しますか?", vbYesNo) = vbNo Then GoTo atoShimatu Else oFs.createFolder (ToDir) End If End If If oFs.getfolder(ToDir).Size <> 0 Then MsgBox ToDir & "にはファイルが残ってます。取りあえず中止。" GoTo atoShimatu End If Call moveFiles(oDir.Path, ToDir) Exit Sub atoShimatu: Set oFile = Nothing Set oDir = Nothing Set oFs = Nothing End Sub Private Sub moveFiles(oDirPath As String, toDirPath As String) Dim oFs As Object Dim oDir As Object Dim oFile As Object Dim FromDir As String Dim ToDir As String Set oFs = CreateObject("Scripting.FileSystemObject") Set oDir = oFs.getfolder(oDirPath) Set oFile = oDir.Files For Each oFile In oDir.Files If oFs.GetExtensionName(oFile) <> "zip" Then 'Debug.Print "FileName = ", oFile.Path, oFile.Name '確認用 'oFs.MoveFile oFile, ToDirPath '本番用(移動)?はこちら oFs.CopyFile oFile, toDirPath, False '確認用、 '最後のFalseは既存ファイルがあればエラーになります End If Next For Each oDir In oDir.SubFolders 'Debug.Print "folder = ", oDir.Name, oDir.Attributes ’確認用 Call moveFiles(oDir.Path, toDirPath) Next Set oFile = Nothing Set oDir = Nothing Set oFs = Nothing End Sub ※Zipファイルを解凍してできたサブフォルダ内に同名のファイルがあった場合を考えると oFs.CopyFile の方が安全かも?です。 絶対にありえない!確証があれば構いません。 (もし、存在した場合の処理は考えていません (^_^;) ) test02 を実行してみてください。 moveFiles が実際の処理を行っています。 検証が不十分かと思いますので念入りに!
その他の回答 (2)
- TAKA_R
- ベストアンサー率32% (26/79)
そういえばこの間似た様なことをしたな、と思ったので。 ファイルを解凍する→これは守備範囲でないのですみませんが。先にやっておいてください。 ファイル名を書き出す。→これは成功したようですね。特定の拡張子のもののみを書き出すこともできます。多分見たサイトに載ってます。 移動させないファイルは削除する。 任意の場所に移動させる。 →→仮にA列に移動元ファイル名を並べます。B列に移動後のファイル名を書きます。 name range("a" & k) as range("b" & k) これを for文(変数k)で行数分回せば、時間はかかりますが、できると思います。
お礼
ご回答ありがとうございました。 もう一人の方の方法で動かすことができました。 勉強のために教えていただいた方法でもやってみます。
- nicotinism
- ベストアンサー率70% (1019/1452)
Scripting オブジェクトのMoveFolderを使えばフォルダごとごっそりと移動できます。 sub test01 dim oFs as object set oFs = CreateObject("scripting.filesystemObject") oFs.moveFolder "C:\Users\Desktop\移動元" , "C:\Users\Desktop\移動先" set oFs = nothing end sub ※移動先フォルダが存在しない場合に自動的に作成移動されます。 既に移動先フォルダが存在し、フォルダ内にファイル・サブフォルダがある場合はエラーになります。 Zipファイルだけを除外するようなオプションはありません。 VBA標準のステートメントだけでは不自由なのでマスターしてください。 http://www.happy2-island.com/vbs/cafe02/capter00216.shtml
お礼
ありがとうございました。 補足に書いた通りなのですが、今回、フォルダは除きたいのです。 ちなみに、Windows7では、 フォルダの検索窓で、.xls OR .docと検索して、 全選択→切り取り→任意のフォルダに貼り付け をすれば一発ですが、WindowsXPではこれができませんでした。
補足
説明が足らず申し訳ありません。 フォルダは除いて、ファイルのみ移動したいのです。 buf=dir()を使ってうまくできそうな気がしましたが、まだできていません。 ご回答お願いいたします。
お礼
ありがとうございます! すごいです。天才ですね。 一瞬でできました。 このままだと勉強にならないので、 まだ少し時間が残っているので、コードを解読できるようになってから上司に報告します。 本当にありがとうございました!