FSO.CopyFileでのエラー無視方法

このQ&Aのポイント
  • コピー元フォルダにあるxlsファイルを全てコピー先のフォルダにコピーするVBAを作成しています。
  • コピー先フォルダに同名のファイルがある場合は上書きせずスキップし、コピー先フォルダに無いファイルだけコピーしたいです。
  • FSO.CopyFileをFalseにするとコピー先に同名のファイルがある場合にエラーで止まってしまいます。このエラーを無視してコピーを続ける方法はありますでしょうか。
回答を見る
  • ベストアンサー

FSO.CopyFileでのエラー無視方法

コピー元フォルダにある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でも動作するように作りたいです。 よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • mitarashi
  • ベストアンサー率59% (574/965)
回答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

aloe_bear
質問者

お礼

完璧です。言う事なしです。 ループ処理と分岐はこうやればできるんですね。勉強になりました。 無事に動作しました。 しかも拡張子の指定に注意すればバージョンにかかわらず行けそうです。 ありがとうございます。

その他の回答 (2)

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答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?displaylang=ja&FamilyID=E74494D3-C4E1-4E18-9C6C-0EA28C9A5D9D >作成はExcel2010ですが、Excel2002でも動作するように作りたいです。 2010では規定のファイルの拡張子(種類)が、xlsx や xlsm に替わるので ここで引っかからないように注意しないと。

aloe_bear
質問者

お礼

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

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

>このエラーを無視してコピーを続ける方法はありますでしょうか。 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 以上、ご参考まで。

aloe_bear
質問者

お礼

回答ありがとうございます。 On Error Resume Nextを使ってしまうと、 例えばコピー元のフォルダに ○○.xls △△.xls ××.xls と3つファイルがあり、 コピー先のフォルダに ○○.xls と1つだけファイルがあった場合に、 △△.xls ××.xls の2つがコピーされません。 上記の場合に ○○.xlsに対して何もせず、△△.xlsと××.xlsをコピーという処理を行いたいです。 FSO.FileExistsを使うとループ処理のようなことをする形になるのでしょうか。 提示して頂いたURLも含め調べてみようと思います。ありがとうございます。

関連するQ&A

  • 同名でもエラーにならない理由

    Sub バックアップ作成() Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") FSO.CopyFile CurrentProject.FullName, "C:\test.mdb" Set FSO = Nothing End Sub このコードを実行すると、同じファイルがあってもエラーになりません。 Sub DiskOprate4() MkDir "C:\バックアップ" End Sub なら同名のフォルダがあればエラーになります。 ファイルはエラーにならないがフォルダならエラーになるのでしょうか? それともFSOというのを使うとエラーにならないのですか? よろしくお願いします。

  • エクセルマクロ(vba)のFSO.OpenTextFileを利用したファイルへの追記について

    FSOを利用して、特定のファイルがなければ、FSO.CreateTextFileを使ってファイルを作成して、ログを記入します。 特定のファイルがあれば、FSO.OpenTextFileを使って追記します。 ファイルが存在しないので新規でファイル作成を行ってからログを記入するのははうまくいくのですが、ファイルが存在するので、ファイルを開いて追記する場合ががうまくできません。 何が原因なのでしょうか? 以下がそのプログラムです。 アドバイスをよろしくお願いします。 Dim excel_folder excel_folder = ThisWorkbook.Path excel_folder = excel_folder & "\log.txt" Set objShell = CreateObject("Wscript.Shell") Dim FSO Set FSO = CreateObject("Scripting.FileSystemObject") Dim stream, data_text If FSO.fileexists(excel_folder) Then Set stream = FSO.OpenTextFile(Filename:=excel_folder, IOMode:=ForAppending, Create:=True) Else: Set stream = FSO.CreateTextFile(Filename:=excel_folder, Overwrite:=True) End If data_text = "test" stream.writeLine (data_text) stream.writeLine (vbCrLf) stream.Close

  • 実行時エラー'13'型が一致しませんエラー発生

    office2010 サーバのあるフォルダ(1)にexcelファイルが登録されています。 バックアップを取るために、フォルダ末尾に-と日付情報を付加して新規フォルダ(2)を作成 (1)のフォルダ配下のファイルを全て(2)のフォルダ配下にコピー という動作をさせようとしています サーバはIPアドレスで指定(**.**.**.**で表現しています) マクロ Sub Sample_FSO_CopyFolder() '参照設定追加 Microsoft Scripting Runtime 'フォルダをコピー(TOOLシートのU1セルに =TEXT(NOW(),"yyyymmddhhmmss") ' Dim datename As String Worksheets("TOOL").Range("U1").Calculate  datename = Worksheets("TOOL").Range("U1") ' '新規フォルダ作成 Dim myFO As Object 'オブジェクト型の変数を定義’ Dim FolderName As String '作成したいフォルダパスを格納’ Set myFO = CreateObject("Scripting.FileSystemObject") 'オブジェクト型の変数にFileSystemObjectを設定’ FolderName = "\\**.**.**.**\data\SYSTEM\JIG" & "-" & datename & "" myFO.CreateFolder FolderName 'フォルダ作成’ Set myFO = Nothing 'オブジェクトの解放’ '複数のファイルをコピー Dim fso As FileSystemObject Set fso = New FileSystemObject Call fso.CopyFile("\\**.**.**.**\data\SYSTEM\JIG\*", "FolderName & " \ "", True) ' ' 全てのファイルをまとめてコピー ' 後始末 Set fso = Nothing End Sub 上記実行で型が一致しませんのポップアップエラーが発生します。 Call fso.CopyFile("\\**.**.**.**\data\SYSTEM\JIG\*", "FolderName & " \ "", True) の部分をFolderNameの変数ではなく、下記の様に直接フォルダ名で指定すると、コピー動作します。 'Call fso.CopyFile("\\**.**.**.**\data\SYSTEM\JIG\*", "\\**.**.**.**\data\SYSTEM\JIG-20190228174216\", True) ' 全てのファイルをまとめてコピー ※ デバッグモードのローカルウィンドウで値を見たとき、 FolderNameは\\**.**.**.**\data\SYSTEM\JIG-20190228174216 となっており正しいと思うのですが、なぜ変数指定でエラーになるのでしょう?

  • FileSystemObject CopyFile の指定したファイル名にアスタリスクが付いていないと書き込みエラーが発生する

    プログラム初心者です。宜しくお願いします。 職場で新PCを数十台導入したのでデータのお引越しをすることになりました。 主要なものはFASTWIZ.EXEを使用しますがNOTESデータの一部もデータ移管したいのです。 そこで以下のスクリプトを書いてみました。 ------------------------------------ 1 Dim objWshShell, objSF, FSO 2 Set objWshShell = CreateObject("WScript.Shell") 3 Set objSF = objWshShell.SpecialFolders 4 Set FSO = CreateObject("Scripting.FileSystemObject") 5 FSO.CopyFile "c:\notes\data\*.id", objSF.Item("MyDocuments") 6 FSO.CopyFile "c:\notes\data\desktop.dsk", objSF.Item("MyDocuments") 7 FSO.CopyFile "c:\winnt\notes.ini", objSF.Item("MyDocuments") ------------------------------------ ファイル名にアスタリスクを入れていないと書き込み出来ないとエラー(800A0046)が発生してしまいます。調べてみましたら権限が無いと発生するエラーだったのですが 例えば 7 FSO.CopyFile "c:\winnt\notes*.ini", objSF.Item("MyDocuments") のようにファイル名の一部にアスタリスクを追加するとエラーが発生せず正常に実行されます。 ? アスタリスクを付ければ正常に動作するので良いんですが、何故なのか分からないと気持ちが悪くていけません。 調べてみたのですが分からず皆様のお知恵を拝借出来ないかと書き込ませて頂きました。 宜しくお願い致します。

  • 同名のファイル 上書きにならないように

    宜しくお願い致します。 複数のフォルダのなかにある 複数のファイルを ひとつの新規のフォルダにすべてコピーするという作業をするときに 同名のファイルがあると 上書きするかという ダイアログが でてきますが これを 上書きでなく 別名のファイルにして 当該のフォルダに 保存したいのですが 元フォルダにおいて 別名に どちらかをしてから コピーするというのは 多数の場合は 手間が かかります 自動的に 同名ファイルであっても どちらかの名前を 変更して 上書きが 起こらないように 保存できる ソフト ご存知のかた 教えてください 同名ファイルは 3つ以上のこともありえます 宜しくお願い致します。

  • 同名ファイルの上書き確認ダイアログを表示させない方法(Excel97VBA)

    あるディレクトリに、既存のファイル名と同じ名前を付けて新しく保存しようとすると、上書きの確認ダイアログがでます。 このダイアログを出させずに、無条件で上書きするにはどのようにすればいいのでしょうか? 現在、“Application.AlertBeforeOverwrite = False”として、その次の行に“ActiveWorkbook.SaveAs FileName:="なまえ.xls"としています。 もちろん、保存先のディレクトリには「なまえ.xls」というファイルが存在します。

  • VBSでファイル名にシート内のセルの値を付け足す

    現在下記のコードが書いてあるvbsにエクセルファイルをドラック&ドロップをしてパスを外したり、つけたりしています。 その際に、投げ込んだエクセルファイルのファイル名の頭に 投げ込んだエクセルファイルのシート1のセルA1の値を付けたいと考えています。 例 パスのかかっている 間隔.xls というファイルをVBSに投げ込むと パスが外れ ファイル名が あいう間隔.xls という名前に代わって保存される。コピーではなく投げ込んだシートの名前が変わって問題ありません。 あいう はシートのA1セルに入っていた文字です。 ブック内にシートは必ず1つしかありません。 Option Explicit 'Excel 2013 Later Japenese Version Available 'REF: 'REF: '''///---定数の設定Set Enumuragion---///''' Const PWD="paspas" Const msoLanguageIDInstall = 1 '''///---変数の宣言---///''' Dim objArgs, I , strFile Dim objFile, objFolder,objPath,strScr Dim xlApp,Wb Dim objWShell : Set objWShell = Createobject("WScript.Shell") Dim FSO : Set FSO = Createobject("Scripting.FileSystemObject") '''///---ファイル処理開始 Start Document File Conversion---///''' Set objArgs = Wscript.Arguments For I = 0 to objArgs.Count-1 set objFile = FSO.GetFile(cstr(objArgs(I))) If Lcase(Left(FSO.GetExtensionName(objFile.Path) ,3) )="xls" Then Set xlApp =CreateObject("Excel.Application") If xlApp.Version < 14 Then xlApp.Quit: Set xlApp = Nothing:wscript.Quit xlApp.DisplayAlerts=False xlApp.Visible = False set wb=xlapp.WorkBooks.Open(objFile.Path,0,false,,PWd,,True,,false,false,,true,true) if wb.HasPassword=true then wb.Saveas objFile.Path,,"","",False else wb.Saveas objFile.Path,,Pwd,"",False End if wb.close set wb=nothing End If Next xlApp.DisplayAlerts=True xlApp.Quit set xlApp = Nothing このコードをどのように変更すればできますでしょうか?

  • Excel VBA連続コピー、貼付処理について

    特定のフォルダ内に格納されている複数のExcelファイルの「sheet1」シートのデータを 所定のExcelファイルにコピー&ペーストしたいのですが、うまくいきません。 (貼付先のファイルを閉じようとするとエラーが発生します。) どうすればできるようになるでしょうか? ご教授の程よろしくお願いいたします。 -------------------------------------------------------------------- Sub copy_test() Dim myPath As String Dim copyFile As String Dim pasteFile As String Dim n As Long myPath = "C:\copy\" copyFile = Dir(myPath & "*.xls*") pasteFile = "C:\paste\paste_data.xlsx" n = 2 Do Until copyFile = "" Workbooks.Open Filename:=myPath & copyFile Workbooks(copyFile).Worksheets("sheet1").Range("A2:L201").Copy Workbooks.Open Filename:=pasteFile 'Workbooks(pasteFile).Worksheets("paste_data").Active Range("B1").Select Selection.End(xlDown).Select Selection.End(xlToLeft).Select Selection.End(xlUp).Select ActiveCell.Offset(1, 0).Select ActiveSheet.Paste ActiveWorkbook.Save Workbooks(pasteFile).Close False Application.CutCopyMode = False Workbooks(copyFile).Close False n = n + 999 copyFile = Dir() Loop End Sub ---------------------------------------------------------------------------------

  • 特殊フォルダへのファイルコピー

    win10 ofice2016 ユーザレベル:Administrator パソコン利用者に、共通で使用するプログラムのコピー及び起動の設定をexcelマクロで対応しています。 Win10のRS5バージョンアップの影響か、従来動作していたマクロが動作しなくなりました。 c:\A\B.bat を スタートメニュー及び、共通ディスクトップにコピーするマクロ で下記の内容です。 Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") FSO.CopyFile Source:="C:\A\B.bat", Destination:="C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\InspecStart.bat" FSO.CopyFile Source:="C:\A\B.bat", Destination:="C:\Users\Public\Desktop\InspecStart.bat" Set FSO = Nothing 上記実行で 実行時エラー'70': 書き込みできません とのエラーが出てしまいます。 ちなみに ' FSO.CopyFile Source:="C:\A\B.bat", Destination:="C:\work\B.bat" はコピーできます。 また、エクスプローダ上でのコピーはできます。 このフォルダへのコピーは管理者権限が必要です。 と表示され、続行でコピー可です。 ファイルのコピーを手動でやれば済むのですが、パソコン等はリースです。 リース更新時に沢山の設定するのは手間なので、特殊フォルダへのコピーを簡単に対応可能な手段があればとのおもいです。 excelマクロにはこだわりませんが、サーバからのファイルコピー等はマクロで実行するので、一緒に起動用のファイルをコピーで対応できたらと思った次第です。 サーバからファイルをc:\A配下へコピー。 Aフォルダ配下の起動ファイルを特殊フォルダ2ケ所に設定したいのです。 よろしくお願いします

  • VBSで作成したフォルダにファイルをコピー出来ない

    いつもお世話になっております。 表題に関してなのですが、VBSでFileSystemObjectを利用してフォルダを作り、 そのフォルダにファイルをコピーするという内容のスクリプトを作成しています。 ですが、フォルダは無事に出来るのですが、ファイルをコピーしようとすると、 「書き込み出来ません」 と出て、コピーされません。 fso.CopyFileのところで、エラーが発生してるようです。 CopyFileメソッドの代わりにCopyコマンドで実行するように記述すると 問題なくコピーされます。 解決方法等ございましたら、ご教授ねがいます。

専門家に質問してみよう