作業中のブックのコピーを作成して保存する方法を解説します。
WorkbookオブジェクトのSaveCopyAsメソッドを使用します。
基本構文
対象ブック.SaveCopyAs 保存ファイルパス
サンプルコード
' マクロ実行ブックのコピーを作成 ThisWorkbook.SaveCopyAs "C:\Users\wfsp\Desktop\テストフォルダ\Book1.xlsm" ' アクティブブックのコピーを作成 ThisWorkbook.SaveCopyAs "C:\Users\wfsp\Desktop\テストフォルダ\Book1.xlsx"
' マクロブックのバックアップを「ブック名_バックアップ日.xlsm」で作成 Sub 本ブックのバックアップを作成する() ' バックアップ作成フォルダを取得(なければ作る) Dim 保存フォルダパス As String 保存フォルダパス = ThisWorkbook.Path & "\BackUp" On Error Resume Next MkDir 保存フォルダパス On Error GoTo 0 ' ブック名を作成 Dim 保存ブック名 As String 保存ブック名 = Replace(ThisWorkbook.Name _ , ".xlsm", Format(Date, "_yyyymmdd") & ".xlsm") ' ブックのコピーを作成 ThisWorkbook.SaveCopyAs 保存フォルダパス & "\" & 保存ブック名 End Sub
解説
WorkbookオブジェクトのSaveCopyAsメソッドを実行することで、
現在開いているブックのコピーを作成することが出来ます。
名前を付けて保存(SaveAs)と同じような動きのメソッドですが、
実行しても処理中のブックがコピーブックに変わるではありません。
' SaveCopyAs Debug.Print ThisworkBook.Path ' ① ThisWorkbook.SaveCopyAs "~~" Debug.Print ThisworkBook.Path ' ② ' ↑①と②で同じパスが返る
' SaveAs Debug.Print ThisworkBook.Path ' ① ThisWorkbook.SaveAs "~~" Debug.Print ThisworkBook.Path ' ② ' ↑①と②で異なるパスが返る(新しく名前を付けて保存した方に変わる)
このメソッドの引数はファイルパスひとつだけで、
処理の挙動にバリエーションはありません。
特に「このメソッドは常に上書き保存」である点にはご注意ください。
ファイルがあったとしても無警告で上書き保存が実行され、
この設定を変える引数も存在しません。
上書きしたくない場合はDir関数でファイルの存在確認を行うか、
上書き設定の引数を持つFileSystemObjectのCopyFileを使用してください。
' ファイルの存在確認をしてから実行 If Dir(保存ファイルパス) = "" Then ThisWorkbook.SaveCopyAs 保存ファイルパス End If
' FileSystemObjectのCopyFileメソッドを使用 FSO.CopyFile ThisWorkbook.FullName _ , ThisWorkbook.Path & "バックアップ\" ,OverWriteFiles:=False
FileSystemObject.CopyFileメソッドの詳しい解説は、
こちらの記事をご覧ください。
続いて細かい挙動になりますが、
「変更 → SaveCopyAs → 保存せず閉じる」
という手順でファイルを実行した場合、
ブックへの変更はコピーファイルにだけ反映されることになります。
例えば以下のコードを実行した場合、
ThisWorkbook.Worksheets(1).Range("A1") = 1 ThisWorkbook.SaveCopyAs "~~" ThisWorkbook.Close False ' 保存せず閉じる
A1セルに「1」が入るのはコピーファイルだけで、
本体ファイルにこの変更は反映されません。
本体に反映させたい場合は、
ThisWorkbook.Save
を別にしっかり実行する必要があります。
狙ってこの仕様を使うことは滅多にないと思いますが、
ThisWorkbook.Save の書き忘れでこうなってしまうことがたまにあります。
十分注意して運用してください。
またこちらも細かい仕様ですが、引数ファイルパスで別の拡張子を渡した場合、
「ファイルが破損して~~」となってしまい正しく保存できません。
SaveCopyAsメソッドにファイルの種類を変える機能はありませんので、
種類(拡張子)を変えたい場合は素直にSaveAsを実行してください。