VBA如何另存文件备份

我们在Excel的世界里,设计很复杂的函数公式,虽然能引用其他单元格、其他工作表、甚至是其他工作簿的内容,但最终操作结果,都是在当前单元格中显示特定内容,操作的对象总是单元格。然而在VBA的世界里,可以直接以工作表、工作簿、甚至是Excel档案作为操作对象,对他们下指令,如此跨越了单元格的界线,有很大的发挥空间。比如说,有很多的Excel操作:新建、打开、关闭、储存、另存等等,这些动作可能在某个例行性工作中一再重复,在Excel世界里,我们也只能一步一步来,每个月都必须来一次。可是擅用VBA,把这些步骤串成一段指令,每次一键让Excel自动去执行。长期以往,大大节省了时间、提升了效率,这是Excel自动化的另外一个层次。以下分享VBA如何以档案作为操作对象,设定另存文件备份:

一、输入如下VBA程序:

输入如下VBA程序

二、Excel执行VBA程序的画面如下:

Excel执行VBA程序的画面如下

三、观察原Excel档案所在的文件夹,会发现多了一个「VBA如何另存文件备份-copy」,修改时间每分钟更新一次,效果等同于定期另存新档备份,以下详细说明此VBA程序。

VBA如何另存文件备份-copy

四、建立新的宏:「Sub Time()」。

五、VBA的每次操作是一个事件,其中「OnTime」是时间到了即自动执行的程序,标准语法是「.」隔开,然后空格之后是对于该事件的具体描述(属性),「Application.OnTime Now + TimeValue(“00:01:00”), “Autosave”」意思是从现在开始,一分钟之后执行「Autosave」宏,最后结束此段程序:「End Sub」。

六、编写另一段程序:

Sub Autosave()」

Range(“A1”) = ThisWorkbook.Path

在单元格「A1」写入目前工作簿所在的文件夹路径。

n = ThisWorkbook.Name

定义「n」为目前工作簿的文件名。

Range(“A2”) = n

在单元格「A2」写入「n」。

n = Left(n, InStrRev(n, “.”) – 1)

更新定义「n」。这里使用了两个函数,「InStrRev」函数是从后面开始寻找,传回某字符串在另一个字符串中首次出现的位置,Left函数是传回文字字符串中的前几个字符 。以这篇文章的Excel档案为例,原来「n」的内容是「ThisWorkbook.Name」,也就是「VBA如何另存文件备份.xlsm」,然后又更新了「n = Left(n, InStrRev(n, “.”) – 1)「InStrRev(n, “.”)」,等于是去掉扩展名,结果便是「VBA如何另存文件备份」。

Range(“A3”) = n

在单元格「A3」写入「n」。

ThisWorkbook.SaveCopyAs Filename:=ThisWorkbook.Path & “\” & n & “-” & “copy” & “.xlsm”

此为VBA标准语法,对象和程序中间以「.」隔开,「ThisWorkbook.SaveCopyAs」意思是以目前工作簿为对象,执行另存盘案,空一格后面是具体描述(Excel的正式说法叫属性),这里配置文件名为:「Filename:=ThisWorkbook.Path & “\” & n & “-” & “copy” & “.xlsm”」,这句程序对于熟悉Excel公式的人,应该不难理解。

MsgBox “已自动储存”

提示讯息窗口:「已自动储存」。

Call Time

召唤执行「Time」宏。

End Sub

结束「Autosave」宏。

这篇文章的VBA不会太复杂,但是涉及到的程序概念相当完整。有一个具体的执行程序(事件属性的书写语法)、有根据需求所定义的变量(VBA习惯是一再更新定义)、有设计公式计算的函数(Excel原有函数及VBA特有函数)、最后将结果写入Excel单元格中,并且配合提示窗口和关联宏的操作。如果这些「关键零组件」都能够熟悉,触类旁通,将会大大强化VBA的实作能力。