【Excel VBA】FSOでファイルをコピー(複製)する方法 (.Copy)

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つの動作があります。
    1. フォルダを指定した場合: "C:\Backup\"のようにフォルダのパスを指定すると、ファイルは元の名前のままそのフォルダ内にコピーされます。
    2. フルパスを指定した場合: "C:\Backup\NewData.xlsx"のようにフォルダと新しいファイル名を指定すると、コピーと同時に名前の変更が行われます。
  • [Overwrite]引数 (任意): コピー先に同名のファイルが存在した場合の動作をTrueFalseで指定します。
    • 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メソッドを使います。

  1. **fso.GetFile("コピー元のパス")**で、Fileオブジェクトを取得する。
  2. そのオブジェクトに対し、.Copy "コピー先のパス", [Overwrite] を実行する。
  3. (推奨)実行前に、**FileExistsFolderExists**でエラー条件をチェックする。

.Copyメソッドは、バックアップの作成やテンプレートファイルの複製など、ファイル操作の自動化において基本となる重要な機能です。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次