現在作業中のブックを保存する際、
上書き保存ではなく別名で保存しておきたい場面があります。
この後の作業が後戻りできないような作業である場合に、
一旦セーブポイントを作っておくようなイメージでしょうか。
今回はこのバックアップをワンタッチで行うマクロを紹介します。
マクロの仕様としては、例えば「作業ブック.xlsm」でこのマクロを実行すると、
- 作業ブックの保存フォルダ直下に「_バックアップ」というフォルダを作る
- バックアップ名をInputBoxに入力(例えばA作業後 など)
- 作業ブック(202509151430)_A作業後.xlsmという名称でコピーを作成
(バックアップ名を省略した場合はyyyymmddhhmmだけで複製)
という仕様でバックアップが残ります。
こんなイメージでバックアップを残せます。

「Ctrlキーを押しながらドラッグドロップしてリネーム」
をワンタッチでできるようになるのでなかなか便利なマクロと思います。
実行型の便利マクロですので、
Excel起動時に裏で開かれる「個人用マクロブック」などに搭載して使ってください。
ショートカットキーに登録したり、ツールバーやリボンにボタン配置すると便利です。
ソースコード
' ブックのバックアップ Sub ブックのバックアップを取る() Dim wb対象ブック As Workbook Set wb対象ブック = ActiveWorkbook Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") ' 名前を変えていないブックは除外 If wb対象ブック.Path = "" Then MsgBox "未保存のブックはバックアップできません。": Exit Sub ' 対象ファイルの保存フォルダ直下にバックアップフォルダを生成 Dim Pathバックアップフォルダ As String: Pathバックアップフォルダ = wb対象ブック.Path & "\_バックアップ" If FSO.FolderExists(Pathバックアップフォルダ) = False Then FSO.CreateFolder Pathバックアップフォルダ ' ファイル名に付与するテキストをユーザーから取得 Dim ブック名に付与するテキスト As String ブック名に付与するテキスト = InputBox("バックアップファイルのファイル名にメモするテキストを入力して下さい。(空でもOK)") ' 複製ファイル名を生成 Dim 拡張子 As String: 拡張子 = FSO.GetExtensionName(wb対象ブック.Name) Dim ファイル名ベース As String: ファイル名ベース = FSO.GetBaseName(wb対象ブック.Name) Dim 複製ブック名ベース As String 複製ブック名ベース = ファイル名ベース & "_" & Format(Now, "yyyymmddhhmm") & "_" & ブック名に付与するテキスト ' ◇ ファイル名が重複した場合は連番を付与 If FSO.FileExists(Pathバックアップフォルダ & "\" & 複製ブック名ベース & "." & 拡張子) Then Dim 連番付与ブック名 As String: 連番付与ブック名 = 複製ブック名ベース Dim 連番 As Long: 連番 = 2 Do While FSO.FileExists(Pathバックアップフォルダ & "\" & 連番付与ブック名 & "." & 拡張子) 連番付与ブック名 = 複製ブック名ベース & "-" & 連番 & "-." & 拡張子 連番 = 連番 + 1 Loop End If If 連番付与ブック名 <> "" Then 複製ブック名ベース = 連番付与ブック名 ' ◇ ファイルをコピー FSO.CopyFile wb対象ブック.FullName, Pathバックアップフォルダ & "\" & 複製ブック名ベース & "." & 拡張子 MsgBox "ファイルのバックアップを取りました。" End Sub
解説
コードはちょっと長いですが処理自体は単純です。
アクティブブックの直下にフォルダを作り、
そこにyyyymmddhhmmとファイルメモを付与してコピーしているだけです。
開いているファイルをコピーする場合はFileCopyステートメントが使えませんので、
FileSystemObjectのCopyFileメソッドを使用します。
FileSystemObjectについて詳しく知りたい方はこちらの記事をご参照ください。
たったこれだけの処理なのにソースコードが無駄に長くなるのは、
ファイル名の生成コードがどうしても冗長になりがちだからです。
とくにファイル名を「拡張子なし」「拡張子あり」で分けて処理したり、
同名ファイル検知時に連番を付与するコードが長くなりますね。
このあたりのコードは汎用関数にしておくとメインコードの行数を減らせます。
「ファイル名に連番を付与」する関数については、
こちらの記事をご参照ください。
www.limecode.jp