現在開いているブックをコピーする方法を解説します。
FileSystemObjectのCopyFileメソッドを使用します。
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を共有(宣言を省略)できますのでご活用ください。
このあたりの詳しい解説はこちらの記事をどうぞ。