VBA100本ノック 20本目:ブックのバックアップ

この記事から得るもの

BOOKの保存(SaveASとSaveCopyAs)の違い。
特定の名前のフォルダが存在するか判断する方法。

1 今回のお題

マクロブック(ThisWorkbook)と同じフォルダに"BACKUP"フォルダを作成し、
"BACKUP"に自身(ThisWorkbook)のバックアップを以下の名称で保存してください。
ブック名_yyyymmddhhmm.xlsm
マクロ終了時には元のブックが開いている状態にしてください。
※繰り返し実行を考慮

2 今回のお題の意図

何度も差分BackUpを取る。

3 回答

私の最初の回答

Sub ノック20本目_1()
'BackUPの元となるBookのPath、Nameを取得
CriteriaBookName = ThisWorkbook.Name
CriteriaBookNameLeft = Left(CriteriaBookName, 4)
CriteriaBookPath = ThisWorkbook.Path
CriteriaBookFullPath = CriteriaBookPath & "\" & CriteriaBookName

'BackUP用のBookのPath、Nameを設定
SaveBookName = CriteriaBookNameLeft & "backup_" & Format(Date, "yyyymmdd") & Format(Now, "hhmm") & ".xlsm"
SaveBookPath = (CriteriaBookPath & "\" & CriteriaBookNameLeft & "backup_" & Format(Date, "yyyymmdd") & Format(Now, "hhmm") & ".xlsm")

'ファイルを保存(強制上書き)
Application.DisplayAlerts = False
ThisWorkbook.SaveAs SaveBookPath
Application.DisplayAlerts = True

'元Bookを開く
Workbooks.Open CriteriaBookFullPath

'BackUPしたBookを閉じる。
Workbooks(SaveBookName).Close
End Sub

処理手順
1 基準となるファイルのフォルダPATHを取得する。今回はマクロBOOKの保存なので、拡張子は「.xlsm」なので、Left関数を使って拡張子を除いたファイル名を取得しました。
2 保存用のPATHを設定。BOOK名に「backup_」、日付、時間を追記して、保存先PATHを設定。
3 名前を付けて保存(強制上書き)
4 元のBOOKを開く。
5 BackUPしたBookを閉じる。

サイト管理者からのツッコミ

1 「"BACKUP"フォルダを作成」が漏れています。
2 「ブック名_…」これはバックアップなので自分自身の名前という事になります。
3 Now()には日付も入っています。

つまり、「マクロブック(ThisWorkbook)と同じフォルダに"BACKUP"フォルダを作成し」ここの部分を勘違いしていました。フォルダを作って、「"BACKUP"に自身(ThisWorkbook)のバックアップをブック名_yyyymmddhhmm.xlsmの名称で保存してください。」というお題からそれていました。

また、日付、時間の取得に「Format(Date, "yyyymmdd") & Format(Now, "hhmm")」と書いていたのですが、
これは「Format(Now, "yyyymmddhhmm")」で日付も取れるようです。勉強になりました。


ということで、フォルダを作成してそこに「ブック名_yyyymmddhhmm.xlsm」を保存するようにコードの書き直し。
上のコードを準用して作っていたのですが、SaveASで保存したBOOKのClose処理がPATHを変更してもうまくいきません(;^ω^)。
なので、SaveCopyAsでBOOKを保存することにしました。

最終回答

Sub ノック20本目_2()
'BackUPの元となるBookのPath、Nameを取得
CriteriaBookName = ThisWorkbook.Name
CriteriaBookNameLeft = Left(CriteriaBookName, 4)
CriteriaBookPath = ThisWorkbook.Path
CriteriaBookFullPath = CriteriaBookPath & "\" & CriteriaBookName

'BackUP用のフォルダを作る
SearchFolder = CriteriaBookPath & "\BackUp"

If Dir(SearchFolder, vbDirectory) = "" Then
    MkDir SearchFolder
End If

'BackUP用のBookのPath、Nameを設定
SaveBookPath = (SearchFolder & "\" & CriteriaBookNameLeft & "backup_" & Format(Now, "yyyymmddhhmm") & ".xlsm")

'ファイルを保存
ThisWorkbook.SaveCopyAs SaveBookPath
End Sub

処理手順
1 基準となるファイルのフォルダPATHを取得する。
2 /BackUpフォルダが存在しなければ作成する。
3 保存用のPATHを設定
4 BOOKを保存

この方がコードがスマートですね!

4 一言

FSOを使えばLeft関数を使わなくても拡張子を除いたフォルダが名が取得できるようです。なので、FSOを使用して書くのもありですね。
SaveASとSaveCopyAsの違い勉強になりました。SaveCopyAsなら、元BOOKを開きなおさなくてもよい、保存したBOOKを閉じなくてもよい。いいことづくめです。


ではでは、この辺で(^^)/~~~