アプリ版:「スタンプのみでお礼する」機能のリリースについて

コピー元フォルダにあるxlsファイルを全てコピー先のフォルダにコピーするVBAを作っています。
既にコピー先フォルダに同名のファイルがある場合は上書きせずスキップし、
コピー先フォルダに無いファイルだけコピーしたいのですが、

Sub test()
Dim FSO As Object
Dim md As String

Set FSO = CreateObject("Scripting.FileSystemObject")
Set md = Format (Date, "MMDD")

FSO.CopyFile "C:\コピー元\*.xls", "C:\コピー先\"& md ,False

Set FSO = Nothing
End Sub

FSO.CopyFileをFalseにするとコピー先に同名のファイルがある場合に
エラーで止まってしまいます。
このエラーを無視してコピーを続ける方法はありますでしょうか。

今回は確認ダイアログなど一切出さずに処理する方法が知りたいのですが、
今後の為に同名のファイルがあれば上書き確認ダイアログを出し、
処理を分岐させる方法もありましたらヒントだけでも教えて頂けると嬉しいです。

作成はExcel2010ですが、Excel2002でも動作するように作りたいです。
よろしくお願いいたします。

A 回答 (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
    • good
    • 0
この回答へのお礼

完璧です。言う事なしです。
ループ処理と分岐はこうやればできるんですね。勉強になりました。

無事に動作しました。
しかも拡張子の指定に注意すればバージョンにかかわらず行けそうです。
ありがとうございます。

お礼日時:2011/05/01 21:01

提示されたコードでは、あえて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? …

>作成はExcel2010ですが、Excel2002でも動作するように作りたいです。
2010では規定のファイルの拡張子(種類)が、xlsx や xlsm に替わるので
ここで引っかからないように注意しないと。
    • good
    • 0
この回答へのお礼

FSO.FileExistsを少し見てみたのですが、
これは1つのファイルに対してフルパスで指定するように見えるのですがあっていますでしょうか。
となると、フォルダ内の全ファイルに対してはループ処理のようなことをしていくのでしょうか。
調べてみようと思います。

お礼日時:2011/05/01 16:21

>このエラーを無視してコピーを続ける方法はありますでしょうか。


On error resume next
で、エラーを無視して次を実行する。

真面目にやるなら、
FSO.FileExists
で事前に調べて、既存ならコピーしない
http://officetanaka.net/excel/vba/filesystemobje …

>今後の為に同名のファイルがあれば上書き確認ダイアログを出し、
後の方の、事前に調べるコードに、既存の時、
MsgBox("上書きしますか?", vbYesNo)
による処理分岐を盛り込む。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/v …

以上、ご参考まで。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

On Error Resume Nextを使ってしまうと、
例えばコピー元のフォルダに
○○.xls
△△.xls
××.xls
と3つファイルがあり、

コピー先のフォルダに
○○.xls

と1つだけファイルがあった場合に、
△△.xls
××.xls
の2つがコピーされません。


上記の場合に
○○.xlsに対して何もせず、△△.xlsと××.xlsをコピーという処理を行いたいです。

FSO.FileExistsを使うとループ処理のようなことをする形になるのでしょうか。
提示して頂いたURLも含め調べてみようと思います。ありがとうございます。

お礼日時:2011/05/01 16:18

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A