作者:乔山办公网日期:
返回目录:excel表格制作
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim j%
For j = 1 To Sheets.Count
Sheets(j).Select
ActiveSheet.Protect Password:="1234"
Next
ThisWorkbook.Save
End Sub
这个问题很深刻,我以为可以实现,但高手有高手的苦衷啊~
excel是这样的,自动保存后有个副本,副本在通过自身的VBA运行保存为下一个副本,也就是说下一个副本是通过上一个副本的VBA建立的,而不是通过初始的那个文件,所以高手使用的是ThisWorkbook.SaveCopyAs这个函数,这个函数将指定工作簿的副本保存到文件,但不修改内存中的打开工作簿,就是说每次都是将初始工作簿另存文件后,ThisWorkbook仍然为初始工作簿,而不是另存后的工作薄。但这个函数有个缺陷就是只能选择保存的文件名,而不能选择保存的文件类型,我试了下,将文件名直接写为"D:\20140109.xls"这种形式是没有问题的,所以将代码稍微改了下,保存后的xls是可以打开,但在代码运行过程中不要打开,在运行过程中打开,则ThisWorkbook变为打开的工作薄,代码运行就会出现你说的问题:e799bee5baa6e997aee7ad94e58685e5aeb9364
Option Explicit
Sub Auto_Open()
Application.OnTime Time + TimeValue("00:00:05"), "OnTimeSave", , True '设置自动保存开始
End Sub
Sub Auto_Close()
On Error Resume Next
Application.OnTime Time, "AutoSave", , False
End Sub
Sub OnTimeSave()
'Private Const interval As Long = 5 / 60 '自动保存的间隔时间,以分钟为单位
Dim today As String
Dim path As String, fileName As String, fileExt As String '将这三个变量定义为模块级变量,不需要每次执行autosave过程时,都要取一次值。
Dim saveAs As String '保存为新的文件名
Dim b As Boolean
today = Application.WorksheetFunction.Text(Date, "YYYYMMDD") '日期格式为:4位年2位月份2位日期,
'修改"YYYYMMDD",可以得到不同的日期格式,但是要注意 / 在windows系统是不允许作为文件名的
path = ThisWorkbook.path & "\" '默认是工作簿所在的路径,可以指定一个文件夹作为备份的文件夹
fileExt = ".xls" '工作簿文件扩展名(比如:test.xls,此变量的值将是 .xls)
fileName = Left(ThisWorkbook.Name, Len(ThisWorkbook.Name) - Len(fileExt)) '工作簿文件名,不含扩展名 (比如:test.xls,此变量的值将是 test)
saveAs = path & fileName & "-" & today & fileExt '新的文件名
Debug.Print Time, saveAs & Excel.XlFileFormat.xlHtml
b = Application.DisplayAlerts '保存原来的Application.DisplayAlerts状态,以便恢复用。
Application.DisplayAlerts = False '不提示覆盖保存
On Error Resume Next
ThisWorkbook.SaveCopyAs saveAs
If Err Then Err.Clear '如过文件打开了则会发生错误,无视错误,继续。
Application.DisplayAlerts = b '恢复Application.DisplayAlerts之前的状态。
Application.OnTime Time + TimeValue("00:00:05"), "OnTimeSave", , True '设置下一个间隔时间自动保存
End Sub
对于一些重要文档,可百以利用Excel的宏实现文档一编辑就自度动保存,打开Excel后按Alt+F11打开VBAProject,在需要保护的表里写入如问下代码:
Private Sub Worksheet_ Change(ByVal Target As Range)
ThisWorkbook.Save
End Sub
保存答,关闭,回设置允许宏运行,这样保护的工作表只要一进行编辑就会自动保存。
如果只是保答存,在宏代码里,只写ThisWorkbook.Save就可以了
先添加模块,copy输入:
Sub AutoSave()
Dim Start, PauseTime
Do While True
PauseTime = 3600 '3600秒,1小时,根据需要换其他时间百
Start = Timer
Do While Timer < Start + PauseTime
DoEvents
Loop
ActiveWorkbook.Save
Loop
End Sub
在ThisWorkbook的度Open事件中的代码:问
Private Sub Workbook_Open()
Application.OnTime Now + TimeValue("00:00:10"), "AutoSave" '打开后稍等片刻,开始进入自动判断时间,时间达到要求后保存,答并一直循环直到关闭
End Sub