VBA100本ノック 20本目:ブックのバックアップ
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を閉じなくてもよい。いいことづくめです。
ではでは、この辺で(^^)/~~~