- ベストアンサー
FSO.CopyFileでのエラー無視方法
- コピー元フォルダにあるxlsファイルを全てコピー先のフォルダにコピーするVBAを作成しています。
- コピー先フォルダに同名のファイルがある場合は上書きせずスキップし、コピー先フォルダに無いファイルだけコピーしたいです。
- FSO.CopyFileをFalseにするとコピー先に同名のファイルがある場合にエラーで止まってしまいます。このエラーを無視してコピーを続ける方法はありますでしょうか。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#1です。ループを回していないのですね、失礼しました。 On error resume nextで通用するのは、ファイル毎にループ処理してコピーしているケースです。 ファイル毎にループを回し、既存かどうかの問い合わせをして処理する一例です。 ご参考まで。 Sub test() Dim FSO As Object, targetFolder As Object, targetFile As Object Dim folderName As String, destFilePath As String, answer As String folderName = "C:\コピー元\" Set FSO = CreateObject("Scripting.FileSystemObject") Set targetFolder = FSO.getfolder(folderName) For Each targetFile In targetFolder.Files '拡張子判別のところは必要によりアレンジして下さい If UCase(FSO.GetExtensionName(targetFile)) = "XLS" Then destFilePath = "C:\コピー先\" & Format(Date, "MMDD") & "\" & targetFile.Name If FSO.FileExists(destFilePath) Then '既存なら問い合わせせずにパスする場合は、Thenの時の処理をコメントアウトして下さい。 answer = MsgBox(targetFile.Name & " がCopy先に存在します。上書きしますか?", vbYesNo) If answer = vbYes Then FSO.CopyFile targetFile, destFilePath, True Else FSO.CopyFile targetFile, destFilePath, False End If End If Next targetFile Set FSO = Nothing End Sub
その他の回答 (2)
- nicotinism
- ベストアンサー率70% (1019/1452)
提示されたコードでは、あえてWSH を使わなくとも良さそうですが、 ファイルの存在確認は FSO.FileExists("ファイルのフルパス") で得られます。 あとは上書きするなり、 削除 Set MyFile = fso.GetFile("c:\testfile.txt") MyFile.Delete WSH を使わないのであれば FileCopy や Dir("ファイルのフルパス") や Kill あたりを ヘルプで調べてください。 なお、WSH もつかえると便利なので下記から scd56jp.exe をダウンロードして 中の script56.chm (ヘルプファイル)をご覧ください。 http://www.microsoft.com/downloads/details.aspx?displaylang=ja&FamilyID=E74494D3-C4E1-4E18-9C6C-0EA28C9A5D9D >作成はExcel2010ですが、Excel2002でも動作するように作りたいです。 2010では規定のファイルの拡張子(種類)が、xlsx や xlsm に替わるので ここで引っかからないように注意しないと。
お礼
FSO.FileExistsを少し見てみたのですが、 これは1つのファイルに対してフルパスで指定するように見えるのですがあっていますでしょうか。 となると、フォルダ内の全ファイルに対してはループ処理のようなことをしていくのでしょうか。 調べてみようと思います。
- mitarashi
- ベストアンサー率59% (574/965)
>このエラーを無視してコピーを続ける方法はありますでしょうか。 On error resume next で、エラーを無視して次を実行する。 真面目にやるなら、 FSO.FileExists で事前に調べて、既存ならコピーしない http://officetanaka.net/excel/vba/filesystemobject/filesystemobject10.htm >今後の為に同名のファイルがあれば上書き確認ダイアログを出し、 後の方の、事前に調べるコードに、既存の時、 MsgBox("上書きしますか?", vbYesNo) による処理分岐を盛り込む。 http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_msgbox.html 以上、ご参考まで。
お礼
回答ありがとうございます。 On Error Resume Nextを使ってしまうと、 例えばコピー元のフォルダに ○○.xls △△.xls ××.xls と3つファイルがあり、 コピー先のフォルダに ○○.xls と1つだけファイルがあった場合に、 △△.xls ××.xls の2つがコピーされません。 上記の場合に ○○.xlsに対して何もせず、△△.xlsと××.xlsをコピーという処理を行いたいです。 FSO.FileExistsを使うとループ処理のようなことをする形になるのでしょうか。 提示して頂いたURLも含め調べてみようと思います。ありがとうございます。
お礼
完璧です。言う事なしです。 ループ処理と分岐はこうやればできるんですね。勉強になりました。 無事に動作しました。 しかも拡張子の指定に注意すればバージョンにかかわらず行けそうです。 ありがとうございます。