
コピー元フォルダにある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でも動作するように作りたいです。
よろしくお願いいたします。
No.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
完璧です。言う事なしです。
ループ処理と分岐はこうやればできるんですね。勉強になりました。
無事に動作しました。
しかも拡張子の指定に注意すればバージョンにかかわらず行けそうです。
ありがとうございます。
No.2
- 回答日時:
提示されたコードでは、あえて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 に替わるので
ここで引っかからないように注意しないと。
FSO.FileExistsを少し見てみたのですが、
これは1つのファイルに対してフルパスで指定するように見えるのですがあっていますでしょうか。
となると、フォルダ内の全ファイルに対してはループ処理のようなことをしていくのでしょうか。
調べてみようと思います。
No.1
- 回答日時:
>このエラーを無視してコピーを続ける方法はありますでしょうか。
On error resume next
で、エラーを無視して次を実行する。
真面目にやるなら、
FSO.FileExists
で事前に調べて、既存ならコピーしない
http://officetanaka.net/excel/vba/filesystemobje …
>今後の為に同名のファイルがあれば上書き確認ダイアログを出し、
後の方の、事前に調べるコードに、既存の時、
MsgBox("上書きしますか?", vbYesNo)
による処理分岐を盛り込む。
http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/v …
以上、ご参考まで。
回答ありがとうございます。
On Error Resume Nextを使ってしまうと、
例えばコピー元のフォルダに
○○.xls
△△.xls
××.xls
と3つファイルがあり、
コピー先のフォルダに
○○.xls
と1つだけファイルがあった場合に、
△△.xls
××.xls
の2つがコピーされません。
上記の場合に
○○.xlsに対して何もせず、△△.xlsと××.xlsをコピーという処理を行いたいです。
FSO.FileExistsを使うとループ処理のようなことをする形になるのでしょうか。
提示して頂いたURLも含め調べてみようと思います。ありがとうございます。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで複数のコメントのサ...
-
[エクセル]コピーするとオブジ...
-
現在のブックを閉じないで、マ...
-
同じファイル名 上書きしないフ...
-
バッチファイル XCOPYで上書き...
-
エクセルのハイパーリンクがコ...
-
frxファイルの役目
-
Vba初心者です。下記のコード助...
-
バッチファイル 別ファイルにリ...
-
開いている別のファイルにExcel...
-
vbsでファイルやフォルダのコピ...
-
DOSコマンドのコピー完了判定
-
賃貸アパートの退去の時の返却...
-
SDカードにファイルをコピーで...
-
バッチファイルの変数について
-
HTMLからXMLに
-
VB6で、Form1をコピーする方法...
-
エクセル2010、図が大きすぎま...
-
ハイフネーションされている英...
-
FTPとファイルコピーの違いにつ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで複数のコメントのサ...
-
同じファイル名 上書きしないフ...
-
ファイルサーバ上のファイルが...
-
frxファイルの役目
-
バッチファイル XCOPYで上書き...
-
[エクセル]コピーするとオブジ...
-
Vba初心者です。下記のコード助...
-
エクセルのハイパーリンクがコ...
-
バッチファイル 別ファイルにリ...
-
エクセル2010、図が大きすぎま...
-
現在のブックを閉じないで、マ...
-
vbsでExcelのシートをコピーす...
-
xcopyでのバッチコピー方法でコ...
-
バッチファイルのコピーで
-
FTPとファイルコピーの違いにつ...
-
アクセス クエリを別のファイ...
-
パワポでスライドをコピーでき...
-
vbsでファイルやフォルダのコピ...
-
開いている別のファイルにExcel...
-
bat 同名ファイルコピー時にリ...
おすすめ情報