【发布时间】:2015-11-06 18:21:13
【问题描述】:
我使用了与this answer 类似的方法来强制用户使用某个按钮进行保存。 我有以下内容:
公共变量
Dim MacroSave As Boolean
按钮事件
Sub RealSave_Click()
MacroSave = True
ThisWorkbook.Save
MacroSave = False
End Sub
保存捕手
Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Not MacroSave Then
Cancel = True 'Cancels any request to save the file
MsgBox "Workbook not saved."
Else
Ret = MsgBox("Are you sure you want to save?", vbCritical Or vbYesNo, "Save File?")
If Ret = vbNo Then Cancel = True
End If
End Sub
悲伤
上面的代码在一段时间内完美运行,但现在它告诉我Code execution has been interruptedMacroSave = False。如果我在错误弹出窗口中点击Continue,则文件保存得很好。我看不到任何不正常工作的东西;就是这个讨厌的弹出窗口。
我试过了
在
MacroSave = False之前添加DoEvents(以及之后ThisWorkbook.Save),但代码在DoEvents上被中断。将该行移至“save catcher”,但同样的错误 为按钮事件提出了
End Sub。On Error Resume Next,这并不能消除这个问题。
我做错了什么,如何消除这种情况?
【问题讨论】:
-
我想知道您是否有某种竞争条件,因为工作簿需要时间来保存,因此您在
Workbook_BeforeSave完成之前移动到RealSave_Click的最后一行。如果您声明MacroSave = false并在RealSave_Click中消除MacroSave = false会怎样? -
@MattCremeens 我同意;情况确实如此。您的建议有几个问题:(1)我已经移动了
MacroSave = False,但代码在RealSave_Click()的End Sub上被中断。 (2) 我必须在某个时候将MacroSave重置为 False。 (3) 我相信在子函数或函数之外为MacroSave赋值是无效的。 -
既然你公开了,你可以在工作簿打开事件中声明它。
-
我假设你有类似
Option Explicit Dim MacroSave as Boolean的东西。 -
@MattCremeens 哦,好的;我道歉。不过,我希望能够在它打开时保存多次...