打開文件自動備份
前言:
- 一直忙一直忙,今天終于有空看下VBA了,才發(fā)現(xiàn)之前學習過的全部忘了,筆記放哪也不知道了,想想這回做筆記應該在博文上寫,這樣才能隨時隨地都能查到。
- 天天與數(shù)字打交道,天天都編輯電子表格文件,如果操作有誤,撤銷回來就行,但有時候撤銷步驟有限,或者中間自己點了保存,根本無法還原到想要的內(nèi)容。因此想通過VBA代碼來實現(xiàn)打開工作簿時自動備份文件 ,如果無意中破壞了數(shù)據(jù),還可以通過備份文件來恢復一切數(shù)據(jù)。
解決思路
-
采用Workbook.SaveCopyAsy方法將文件在打開時另存一份,要求另存的備份文件的名稱后面加“(bak)”
image.png
操作方法1
- 在模塊中錄入以下代碼
Sub auto_open()
Dim hzm As String
hzm = Trim(Right(Replace(ThisWorkbook.Name, ".", Space(100)), 100))
ThisWorkbook.SaveCopyAs Replace(ThisWorkbook.FullName, hzm, hzm & "(bak)")
End Sub
-
模塊中的代碼效果圖
image.png
操作方法2
- 通過Workbook打開事件實現(xiàn)自動備份
Private Sub Workbook_Open()
Dim hzm As String
hzm = Trim(Right(Replace(ThisWorkbook.Name, ".", Space(100)), 100))
ThisWorkbook.SaveCopyAs Replace(ThisWorkbook.FullName, hzm, hzm & "(bak)")
End Sub
-
ThisWorkbook中的代碼效果圖
image.png
完成效果圖
-
保存關閉文件,把文件復制到別的文件夾,打開文件后,會發(fā)現(xiàn)同文件夾里多了一個備份文件。
image.png
原理分析
- VBA中規(guī)定名為“Auto_Open”且存放在模中的子程序可以隨著打開文件而自動執(zhí)行,所以操作方法1可行。
- 模塊中的“Auto_Open”子程序和工作簿事件“Workbook_Open”的功能是一樣的,不過工作簿事件的代碼只能放在ThisWorkbook代碼窗口中,不能存放在模塊中。
- 在備份數(shù)據(jù)時,應采用ThisWorkbook.SaveCopyAs 方法,不能使用 ThisWorkbook.SaveAs方法。因為備份文件后活動工作簿依然是當前工作簿,而另存的文件成了活動工作簿,搞不好錯誤編輯備份文件了。
我的小筆記
- Replace(ThisWorkbook.Name, ".", Space(100))為將文件名中的所有點替換成100個空格。
- Right(*,100)從右邊取100個字符,得到的結(jié)果應是“ xlsm”,其實后綴名只有幾位,100位前面肯定是空格,因為前面故意加了100個空格,也可以適當少加點。
- trim函數(shù)目的是去掉前面的空格,就得到完整的后綴名“xlsm”,然后把這個后綴名賦給變量“hzm”
- Workbook.SaveCopyAs 方法,將工作簿副本保存到文件中,但不修改內(nèi)存中打開的工作簿。表達式:SaveCopyAs (FileName)
升級優(yōu)化
- 上述達備份的目的,但都是只有一個備份文件,都是最新的備分份替換了舊的備份,想找回更加久遠的內(nèi)容就不可能了,應該設置成多個備份文件,而且每個備份文件帶有時間標志便于區(qū)分。
Sub auto_open()
Dim hzm As String
Dim tim As String
hzm = Trim(Right(Replace(ThisWorkbook.Name, ".", Space(100)), 100))
tim = Format(Now(), "yyyymmddhhmmss")
ThisWorkbook.SaveCopyAs Replace(ThisWorkbook.FullName, hzm, hzm & "(bak)" & tim)
End Sub

image.png
后記
- 可以實現(xiàn)備份了是真的,可備份文件多了也占空間哦,這個問題還是留給小朋友們自已想想辦法吧。



