〖ExcelVBA〗Excelを閉じる前に自動バックアップするマクロ|保存忘れ・上書き事故を防ぐ

ExcelVBA

Excel作業で意外と多いのが、次のようなミスです。

  • 上書き保存してから「やっぱり前の状態に戻したい…」
  • 壊れた・数式が消えた・データを消した
  • 保存せずに閉じてしまった
  • 同じファイルを複数人で触っていて、いつの版が正しいか分からない

こういう事故を防ぐには、自動バックアップがかなり効きます。

そこで今回は、Excelを閉じる前に自動でバックアップを作成するVBAをご紹介します。
「閉じる操作」をしたタイミングで、日時付きファイルとして別フォルダにコピー保存します。


スポンサーリンク
スポンサーリンク

この記事でできること

  • ブックを閉じる直前にバックアップを自動作成
  • バックアップは「日時付きファイル名」で保存(上書きされない)
  • 保存先フォルダが無ければ自動で作成
  • ユーザーは普通に閉じるだけでOK

注意:この仕組みは「ThisWorkbook」に書く

今回の仕組みは、ブックを閉じる直前(BeforeClose)に動かしたいので、
コードを書く場所は「標準モジュール」ではなくThisWorkbookです。

手順:

  1. Alt + F11 でVBE(VBAエディタ)を開く
  2. 左側の「Microsoft Excel Objects」から ThisWorkbook をダブルクリック
  3. そこに貼り付ける

Excelを閉じる前に自動バックアップするコード(コピペOK)

以下を ThisWorkbook に貼り付けてください。

Option Explicit

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Dim backupFolder As String
    Dim backupName As String
    Dim backupPath As String

    ' ===== 設定:バックアップ保存先 =====
    ' ① このブックと同じフォルダに「backup」フォルダを作って保存する例
    backupFolder = ThisWorkbook.Path & "\backup"

    ' ※ブック未保存(ThisWorkbook.Path が空)の場合はデスクトップへ
    If Len(ThisWorkbook.Path) = 0 Then
        backupFolder = CreateObject("WScript.Shell").SpecialFolders("Desktop") & "\backup"
    End If
    ' =====================================

    ' バックアップフォルダがなければ作成
    CreateFolderIfNotExists backupFolder

    ' バックアップ名(元ファイル名_日時.xlsx)
    backupName = GetBaseName(ThisWorkbook.Name) & "_" & Format(Now, "yyyymmdd_HHMMSS") & GetExtension(ThisWorkbook.Name)

    backupPath = backupFolder & "\" & backupName

    ' バックアップ作成(このブック自体をコピー保存)
    ' ※ブックの保存状態に関係なく「コピーとして保存」するため SaveCopyAs を使う
    ThisWorkbook.SaveCopyAs backupPath

End Sub

' フォルダが無ければ作成する
Private Sub CreateFolderIfNotExists(ByVal folderPath As String)
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
    If Not fso.FolderExists(folderPath) Then
        fso.CreateFolder folderPath
    End If
End Sub

' 拡張子を除いたファイル名を取得
Private Function GetBaseName(ByVal fileName As String) As String
    Dim p As Long
    p = InStrRev(fileName, ".")
    If p > 0 Then
        GetBaseName = Left(fileName, p - 1)
    Else
        GetBaseName = fileName
    End If
End Function

' 拡張子(.xlsx など)を取得
Private Function GetExtension(ByVal fileName As String) As String
    Dim p As Long
    p = InStrRev(fileName, ".")
    If p > 0 Then
        GetExtension = Mid(fileName, p)
    Else
        GetExtension = ""
    End If
End Function

このマクロのポイント(初心者向け)

① Workbook_BeforeClose は「閉じる直前」に動く

Private Sub Workbook_BeforeClose(Cancel As Boolean)

このイベント(イベント=特定のタイミングで自動的に動く処理)を使うと、
ユーザーが「×」で閉じる、Alt + F4 で閉じる、などのタイミングで自動実行されます。


② SaveCopyAs で「コピー保存」する

ThisWorkbook.SaveCopyAs backupPath

SaveCopyAs は、ブックをコピーとして別名保存します。
元ファイルには影響しないので、バックアップ用途に最適です。


③ 日時付きファイル名で「上書きされない」

Format(Now, "yyyymmdd_HHMMSS")

日時をファイル名に入れることで、毎回別ファイルとして保存されます。
過去の版に戻したいときも、日時で選べて便利です。


よくあるカスタマイズ

① バックアップ保存先を固定フォルダにしたい

例:Cドライブ直下に保存

backupFolder = "C:\ExcelBackup"

② バックアップを「最大30件まで」にして古いものを削除したい

バックアップが増えすぎるのを防ぐ場合は、
古いファイルを削除する処理を追加できます(応用編として別記事で紹介できます)。


③ 閉じる前に確認メッセージを出したい

If MsgBox("バックアップを作成して閉じます。よろしいですか?", vbYesNo) = vbNo Then
    Cancel = True
    Exit Sub
End If

Cancel = True にすると閉じるのを中止できます。


動作確認のしかた

  1. このExcelブックを保存する(または未保存でもOK)
  2. Excelを閉じる(×ボタンなど)
  3. 同じフォルダ内に backup フォルダが作られる
  4. 日時付きのバックアップファイルが保存されている

まとめ:自動バックアップは「事故防止」の最強保険

Excelは便利ですが、上書き事故やデータ破損は意外と起きます。
今回の仕組みを入れておくと、閉じるだけで自動でバックアップが残るので安心です。

  • 保存忘れや上書き事故の保険になる
  • 日時付きで過去版に戻しやすい
  • 作業者が多いファイルほど効果が高い

ぜひ、重要な業務ブックから導入してみてください。


スポンサーリンク
スポンサーリンク
ExcelVBA
いがぴをフォローする

コメント

タイトルとURLをコピーしました