和風スパゲティのレシピ

日本語でコーディングするExcelVBA

FileSystemObject.CopyFileメソッド

FileSystemObject(以下FSO)にてファイルをコピーする、
CopyFileメソッドについて解説します。

基本形

FSO.CopyFile コピー元ファイルパス, コピー先ファイル/フォルダパス, 上書きするか(True/False)

実行例

Dim FSO As New FileSystemObject

' 別のフォルダへ同名でコピー
FSO.CopyFile "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2\"
    
' 同じフォルダに別名ファイルとしてコピー
FSO.CopyFile "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
                  , "C:\Users\○○\Desktop\テスト1\Book1のコピー.xlsx"

' 別のフォルダに別名でコピー
FSO.CopyFile "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2\Book2.xlsx"

' 自分自身をバックアップ
FSO.CopyFile ThisWorkbook.FullName _
                  , ThisWorkbook.Path & "バックアップ\"

' もし同名ファイルが既に存在したらエラーになるように
FSO.CopyFile "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2\", False

' すべてのxlsxファイルをコピー
FSO.CopyFile "C:\Users\○○\Desktop\テスト1\*.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2"

※ 変数FSOの宣言部についてはこちらをご覧ください。
FileSystemObjectの参照設定と変数宣言について

解説

FileSystemObjectのCopyFileメソッドは、
コピー元・行先の2つのパスを受け取ってコピーを実行します。


コピー先のパスはファイルパス・フォルダパスのどちらも利用可能で、

  • ファイルパスの場合はファイル名の変更も同時に行う
  • フォルダパスの場合は同名のままコピーされる

という動きになります。どちらも便利な仕様ですね。


フォルダパスを渡す場合は最後の\を忘れないようにしてください。

' 正しい記述
FSO.CopyFile "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2\"

' 誤った記述
FSO.CopyFile "C:\Users\○○\Desktop\テスト1\Book1.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2" ' ⇐ \なしはダメ

下の書き方をすると「テスト2というファイル名にする」という解釈になり、
そこにはフォルダがあるわけですから「書き込みできません」エラーになります。


また、コピー元のパスには以下のワイルドカードが使用可能です。

* 任意の文字列(0文字も含む)
? 任意の1文字

これで該当するすべてのファイルを一括でコピーすることができます。


なお、このワイルドカード使用時は、
行先パスはすべてフォルダパスとして扱われます。

これにより\のあるなしでエラーがでることがなくなり、
以下のどちらのコードも「同名で別フォルダに一括コピー」として動きます。

' どちらでも動くようになる
FSO.CopyFile "C:\Users\○○\Desktop\テスト1\*.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2\"

FSO.CopyFile "C:\Users\○○\Desktop\テスト1\*.xlsx" _
                  , "C:\Users\○○\Desktop\テスト2"

ただ、下の書き方をしたコードは流用がしにくい(*を消せない)ため、
なるべく上の書き方で書くことをおすすめします。

発生するエラー

行先のフォルダがない

コピー先のフォルダが存在しない場合は、

実行時エラー70「書き込みできません。」

エラーとなります。

フォルダが必要な場合は先に作成してから実行してください。

コピー先に既にファイルが存在する場合

第3引数のOverWriteFilesに「False」を指定した場合は、
コピー先にファイルがあった場合にエラーとなります。

といってもこれは想定通りの動きであり、
そもそもOverWriteFilesはこのエラーを出すための引数です。


新フォルダへの保存時など同名ブックが存在しないことを想定したマクロでも、
とりあえずFalseを渡しておくと万一の際にファイルを消さず止まってくれます。


エラーは出るより出ない方が怖いですからね。

そのための引数ですので活用してください。


なお、複数ファイルを一括コピーするワイルドカード使用時は、
同名のファイルが見つかるまでのファイルをコピーし終わった後で止まります。

一括とは言いますが、内部では1ファイルずつ処理されているということですね。