和風スパゲティのレシピ

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

開いているファイルをコピーする - FSO.CopyFile

現在開いているブックをコピーする方法を解説します。

FileSystemObjectCopyFileメソッドを使用します。

FileSystemObject.CopyFileメソッド

基本構文

開いているブックをコピーする場合は、
FileSystemObjectを用いて以下のコードを実行します。

' 基本構文
FSO.CopyFile コピー元ファイルパス, コピー先ファイルパス
' 実行例
Sub 開いているファイルをコピーする()

    Dim FSO As New FileSystemObject

    FSO.CopyFile "C:\Users\○○\Desktop\テストフォルダ\Book1.xlsx" _
                      , "C:\Users\○○\Desktop\テストフォルダ\Book1のコピー.xlsx"

End Sub

これでBook1を開いていたとしてもコピーを実行することができます。
※ もちろん開いていなかったとしても実行できます。

Book1が「編集されているがまだ保存していないブック」の場合は、
編集前(保存時)のファイルがコピーされますので注意してください。


この処理はファイルの種類を問いませんので、
Excelファイルでないその他のファイルに実行して大丈夫です。


なお、FileSystemObjectを使用するためには、
「Scripting Runtime」の参照設定が必要です。

設定方法についてはこちらの記事をご覧ください。

参照設定せずにCopyFileメソッドを使用したいときは、

Dim FSO As New FileSystemObject

' ⇩ 書き換え

Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")

このように書き換えることで参照設定なしで使用できますが、
FileSystemObjectは参照設定が推奨される機能です。

慣れれば10秒かかりませんので、
よほどお急ぎでない限りは参照設定をしたうえでご利用ください。

※ 参照設定が推奨される理由も上記の記事で説明しています

細かい仕様

上記コードのようにCopyFileメソッドは「ファイル名の設定」も同時にできますが、
同名で別フォルダに保存するだけなら以下のコードでも実行可能です。

Sub 開いているファイルをコピーする()

    Dim FSO As New FileSystemObject

    FSO.CopyFile "C:\Users\○○\Desktop\テスト1フォルダ\Book1.xlsx" _
                      , "C:\Users\○○\Desktop\テスト2フォルダ\"

End Sub

この書き方も便利ですので覚えておきましょう。


また、コピー先に同名ファイルがあった場合は、
CopyFileメソッドはデフォルトでは「上書き保存」される仕様です。

既存ファイルがある場合はエラーになってほしいときは、
以下のように第3引数「OverWriteFiles」をFalseにしてください。
※ 省略時はTrueとなっています。

' 同名ファイルを上書きしない(エラーが出るようになる)
FSO.CopyFile 元ファイルパス, 行先ファイルパス, OverWriteFiles:= False

 

FileCopyステートメントでは不可

ファイルのコピーには有名な「FileCopyステートメント」がありますが、
こちらでは開いているファイルに実行するとエラーになります。

これに困って本記事にたどり着いた方もいるかもしれません。


残念ながらこのエラーを解消する方法はありませんので、
諦めてFileSystemObject.CopyFileメソッドを使用してください。


ついでですが、細かい仕様に書いた

  • フォルダ移動ならブック名省略可
  • 既存ファイルがあれば上書きせずにエラーを出す

これらの機能もFileCopyステートメントにはない機能ですので、
この機会にすべてのコピーをFSO.CopyFileメソッドにしてしまってもよいです。


その場合は、以下のように「FSO」の宣言をSubの外(一番上)に出すことで、

Public FSO As New FileSystemObject

Sub 開いているファイルをコピーする()

    FSO.CopyFile "C:\Users\○○\Desktop\テスト1フォルダ\Book1.xlsx" _
               , "C:\Users\○○\Desktop\テスト2フォルダ\"

End Sub

これですべてのプロシージャでFSOを共有(宣言を省略)できますのでご活用ください。

このあたりの詳しい解説はこちらの記事をどうぞ。