VBAマクロで、処理の実行前に元となるデータファイルのバックアップを作成したり、テンプレートファイルを複製して新しいレポートを作成したりと、ファイルをコピーしたい場面は頻繁にあります。
FileSystemObject (FSO)の**.Copyメソッド**を使えば、ファイルのコピーを簡単かつ確実に行うことができます。この記事では、FSOを使ってファイルをコピーする基本的な方法と、上書きを制御するオプションについて解説します。
【準備】参照設定
FSOを快適に利用するため、VBAエディタでツール > 参照設定を開き、**「Microsoft Scripting Runtime」**にチェックを入れておくことを推奨します。
完成したVBAコード
以下は、「DataSource.xlsx」というファイルを、「Backup」というサブフォルダにコピーするVBAコードです。
'参照設定: Microsoft Scripting Runtime
Sub CopyFileWithFSO()
' 変数を宣言します
Dim fso As New FileSystemObject
Dim sourceFile As File
Dim sourceFilePath As String
Dim destinationFolderPath As String
'--- 設定 ---
sourceFilePath = ThisWorkbook.Path & "\DataSource.xlsx"
destinationFolderPath = ThisWorkbook.Path & "\Backup\"
'--- 設定ここまで ---
'--- 1. コピー元ファイルと、コピー先フォルダの存在を確認 ---
If Not fso.FileExists(sourceFilePath) Then
MsgBox "コピー元のファイルが見つかりません。" & vbCrLf & sourceFilePath, vbCritical
Exit Sub
End If
If Not fso.FolderExists(destinationFolderPath) Then
' フォルダがなければ作成する
fso.CreateFolder destinationFolderPath
End If
'--- 2. コピーしたいファイルのオブジェクトを取得 ---
Set sourceFile = fso.GetFile(sourceFilePath)
'--- 3. .Copyメソッドでファイルをコピー ---
' 第2引数(Overwrite)をTrueにすると、同名ファイルがあっても上書きする
sourceFile.Copy Destination:=destinationFolderPath, Overwrite:=True
MsgBox "ファイル「" & sourceFile.Name & "」を" & vbCrLf & _
"「" & destinationFolderPath & "」にコピーしました。"
' オブジェクトを解放
Set sourceFile = Nothing
Set fso = Nothing
End Sub
コードのポイント解説
Fileオブジェクトの .Copy メソッド
コピーしたいファイルオブジェクト.Copy Destination, [Overwrite]
.Copyメソッドは、fso.GetFileで取得したFileオブジェクトに対して実行します。
Destination引数: コピー先のパスを文字列で指定します。この指定方法によって、2つの動作があります。- フォルダを指定した場合:
"C:\Backup\"のようにフォルダのパスを指定すると、ファイルは元の名前のままそのフォルダ内にコピーされます。 - フルパスを指定した場合:
"C:\Backup\NewData.xlsx"のようにフォルダと新しいファイル名を指定すると、コピーと同時に名前の変更が行われます。
- フォルダを指定した場合:
[Overwrite]引数 (任意): コピー先に同名のファイルが存在した場合の動作をTrueかFalseで指定します。True: 確認メッセージなしで、ファイルを上書きします。False(既定値): エラーが発生してマクロが停止します。
自動化処理で、常に最新のバックアップで上書きしたい場合などはTrueを指定するのが便利です。
【応用】タイムスタンプ付きでバックアップを作成する
このテクニックを応用すれば、実行した日時の情報をファイル名に含めた、世代管理ができるバックアップを作成するマクロも簡単に作れます。
Sub CreateTimestampedBackup()
Dim fso As New FileSystemObject
Dim bookToBackup As File
Dim backupFilePath As String
' このマクロブック自身をバックアップ対象とする
Set bookToBackup = fso.GetFile(ThisWorkbook.FullName)
' 元のファイル名に日付と時刻を追加したバックアップファイル名を作成
backupFilePath = ThisWorkbook.Path & "\" & fso.GetBaseName(bookToBackup) & _
"_" & Format(Now, "yyyymmdd_hhnnss") & "." & _
fso.GetExtensionName(bookToBackup)
' 作成した新しいパスにファイルをコピー
bookToBackup.Copy backupFilePath
MsgBox "バックアップを作成しました。" & vbCrLf & backupFilePath
End Sub
まとめ
FSOでファイルをコピーするには、Fileオブジェクトの.Copyメソッドを使います。
- **
fso.GetFile("コピー元のパス")**で、Fileオブジェクトを取得する。 - そのオブジェクトに対し、
.Copy "コピー先のパス", [Overwrite]を実行する。 - (推奨)実行前に、**
FileExistsやFolderExists**でエラー条件をチェックする。
.Copyメソッドは、バックアップの作成やテンプレートファイルの複製など、ファイル操作の自動化において基本となる重要な機能です。
