如何修复代码以避免打开自动创建的备份文件时出现AutoExec报错?
问题描述
- 打开通过VBA代码创建的Access前端备份文件时,弹出错误提示:
If ‘AutoExec’ is a new macro or macro group, make sure you have saved it and that you have typed its name correctly.
- 备份代码在数据库启动时自动加载的导航窗体
OnLoad事件中执行,当前数据库导航窗格为空 - 仅部分备份出现此问题,服务器生成的备份无法访问,无法随时依赖远程IT协助恢复
- 仅针对前端备份,数据库处于构建阶段,每日进行维护
备份代码如下:
Public Function CreateBackup() As Boolean Dim Source As String Dim Target As String Dim objFso As Object Dim Path As String Source = CurrentDb.Name 'Path = CurrentProject.Path Path = "P:\Angel\AngelNet Backups\" Target = Path & "\BackupDB_" & Format(Now(), "mm-dd-yyyy") & ".accdb" Set objFso = CreateObject("Scripting.FileSystemObject") Call objFso.CopyFile(Source, Target, True) End Function
问题原因
- 用
FileSystemObject.CopyFile复制正在运行的Access数据库时,文件处于打开锁定状态,容易导致备份文件不完整,尤其是AutoExec这类启动相关对象可能未被正确写入备份 - 导航窗体
OnLoad事件触发时,数据库还处于加载过程中,此时复制文件出现不完整的概率更高
解决办法
1. 延迟备份执行时机
不要在导航窗体OnLoad事件里执行备份,改成等数据库完全启动后再操作:
- 创建一个隐藏窗体,在它的
Timer事件里延迟几秒执行备份,执行完自动关闭窗体 - 示例代码(隐藏窗体的
Timer事件):Private Sub Form_Timer() Me.TimerInterval = 0 ' 关闭定时器,避免重复执行 CreateBackup() DoCmd.Close acForm, Me.Name ' 备份完成后关闭隐藏窗体 End Sub - 在AutoExec宏里添加打开这个隐藏窗体的操作,把窗体的
TimerInterval设为2000(即2秒),确保数据库加载完成再备份
2. 改用Access内置备份方法
替换FileSystemObject,用Access自带的CompactRepair方法,既能备份还能压缩修复数据库,保证文件完整性:
Public Function CreateBackup() As Boolean Dim Source As String Dim Target As String Dim Path As String Source = CurrentDb.Name Path = "P:\Angel\AngelNet Backups\" Target = Path & "BackupDB_" & Format(Now(), "mm-dd-yyyy") & ".accdb" ' 用CompactRepair创建备份,返回True表示成功 CreateBackup = Application.CompactRepair(Source, Target, False) End Function
3. 备份前确保数据库稳定
执行备份前,关闭所有打开的窗体、报表,释放不必要的对象引用,减少文件锁定的影响,避免复制不完整
4. 添加备份完整性验证
备份完成后,后台尝试打开备份文件验证是否能正常启动,如果报错就重新执行备份
内容的提问来源于stack exchange,提问作者Angel Stanhope
相关产品推荐
相关产品推荐

