【VBA】保存忘れをもうしない!閉じるだけで自動保存&バックアップ!

今回はVBAで自動保存とバックアップを行うコードを作ってみました。
今回のコードでやりたかったことは次の通りです。
ブックを閉じたときに
- 自動に上書き保存
- 同じフォルダ内にBUCKUPフォルダがなければ作成
- BUCKUPフォルダ内に「ブック名+日時」のファイルをバックアップ

このVBAがあれば、保存し忘れなし、かつ、保存するたびに日時が入った自動バックアップが取れるということだにゃ。

重要な内容が入っているシートであれば、これくらいのバックアップシステムを入れておきたいところです。
それでは詳しくみていきましょう。
完成コードの確認

まずは、完成したコードを確認しておきましょう。
Sub Auto_Close()
Dim wb As Workbook
Set wb = ThisWorkbook
Dim fso As Object
Dim path
path = wb.path & "\BUCKUP\"
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(path) Then
fso.CreateFolder path
End If
saveFolder = path & fso.GetBaseName(wb.Name) & "_" _
& Format(Now, "yyyymmddhhmmss") & ".xlsx"
Application.DisplayAlerts = False
wb.Save
wb.SaveAs saveFolder, FileFormat:=xlOpenXMLWorkbook
Application.DisplayAlerts = True
End Sub

全体感として、そんなに長くないコードかにゃ。意外と簡単にできるもんだにゃ。
コードの詳細
自動に上書き保存

自動実行は簡単にできます。プロシージャの名前を「Auto_Close」にするだけです。
Sub Auto_Close()
//ブックを閉じたときに自動実行するコードを記載
End Sub
VBAでの自動実行は簡単で、上のように「Auto_Close」にするだけで、自動実行できます。
ですので、その中で、上書き保存のコードを書いておけば、ブックを閉じたときに、自動で保存ができます。
ちなみに、上書き保存は、次のように書きます。
ブック名.save

次のように書いておけば、自動上書き保存ができるんだにゃ。これだけでも使い道ありそうだにゃ。
Sub Auto_Close()
Dim wb As Workbook
Set wb = ThisWorkbook
wb.Save
End Sub
BUCKUPフォルダの作成

BUCKUPフォルダの作成です。今回は、FileSystemObject(通称:fso)でフォルダ操作を行なっていますが、MkDir()やDir()を使っても実現できます。
まずは、BUCKUPフォルダを作り手順を整理しておきましょう。
- 同じ階層にBUCKUPフォルダがあるかの確認
- なければ、フォルダの作成

上のように、あれば実行せず、なければ実行など2択を取る場合、ifを使うんだにゃ。
また、fsoを使うことで、フォルダがあるかを簡単に確認できるんだにゃ。
if //フォルダがなければ then
//フォルダの作成
end if
fso.FolderExists(確認したいフォルダのパス)
返値:True or False

フォルダの確認ができ、なければ作成します。
fso.CreateFolder 作りたいフォルダのパス
実際にフォルダがなければ作成のコードは次のとおりとなります。
Dim wb As Workbook
Set wb = ThisWorkbook
Dim fso As Object
Dim path
path = wb.path & "\BUCKUP\"
Set fso = CreateObject("Scripting.FileSystemObject")
If Not fso.FolderExists(path) Then
fso.CreateFolder path
End If
「ブック名+日時」のファイルをバックアップ

ブック名と日時でファイルを作ります。手順は次の感じになりますね。
- 実行中のブック名(拡張子より前)を取得
- 日時を取得し「20230202123456」の形式で取得
- ファイルを保存(マクロ実行なし)

まずは、ブック名を取得するんだけど、拡張子を除いた名前の取得にはfsoを使えるんだにゃ。
fso.GetBaseName(取得したいファイル名)

日時は「Now」で取得できますね。「Format」と組み合わせると、自由な形式で時間を取得可能です
Format(Now, “yyyymmddhhmmss”)
「yyyymmddhhmmss」は左から順に年、月、日、時、分、秒を表します。間にハイフンやスラッシュを入れることもできるので、好きな形式を指定できます。

最後にファイルを保存します。保存の時は、マクロがない状態で保存したいので、拡張子を「.xlsm」で保存します。
ファイル名 = 付けたいファイル名 + “.xlsx”
ブック.SaveAs ファイル名, FileFormat:=xlOpenXMLWorkbook

.xlsxに拡張子を変えて、SaveAsの引数に「FileFormat:=xlOpenXMLWorkbook」を付けることで、マクロなし保存ができるんだにゃ。
Sub Auto_Close()
Dim wb As Workbook
Set wb = ThisWorkbook
Dim fso As Object
Dim path
path = wb.path & "\BUCKUP\"
saveFolder = path & fso.GetBaseName(wb.Name) & "_" _
& Format(Now, "yyyymmddhhmmss") & ".xlsx"
Application.DisplayAlerts = False
wb.Save
wb.SaveAs saveFolder, FileFormat:=xlOpenXMLWorkbook
Application.DisplayAlerts = True
End Sub

拡張子を変更して保存しると、アラートが出てしまします。
ですので、「Application.DisplayAlerts = False」にして、アラートが出ないようにしてから変更しています。
プログラミングを学ぶならTechAcademy(テックアカデミー)がおすすめ!

独学で苦戦している人は、一度しっかりと基礎を学ぶと次のステップへ進めますよ。今のおすすめは、TechAcademy(テックアカデミー)ですね。
- オンラインで選抜された現役エンジニアから学ぶことができる
- 自宅からWeb制作・プログラミング・アプリ開発など幅広い分野を学べる
- 学ぶだけではなく、転職の支援、副業に活かせるスキルの習得、副業の仕事紹介まで行っている

無料体験や相談もあるから、一度試してみてもいいんだにゃ!
\無料体験、無料相談はこちらから/