代码执行已被保存预防宏中断[重复]

Posted

技术标签:

【中文标题】代码执行已被保存预防宏中断[重复]【英文标题】:Code Execution Has Been Interrupted with Save Prevention Macro [duplicate] 【发布时间】: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 哦,好的;我道歉。不过,我希望能够在它打开时保存多次... 【参考方案1】:

这对我有用...

常规模块:

Option Explicit

Public MacroSave As Boolean

Sub RealSave_Click()

    If MsgBox("Are you sure you want to save?", vbExclamation + vbYesNo, _
             "Save File?") <> vbYes Then Exit Sub

    On Error GoTo haveError
    MacroSave = True
    ThisWorkbook.Save
    MsgBox "Saved!"

haveError:
    MacroSave = False

End Sub

ThisWorkbook 模块:

Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    If Not MacroSave Then
        Cancel = True
        MsgBox "Workbook not saved: please use the 'Save changes'" & _
               " button to save this workbook"
    End If
End Sub

【讨论】:

【参考方案2】:

其他建议很棒,但是...归结为this:

    在弹出窗口中按“调试”按钮。 按 Ctrl+Pause|Break 两次。 点击播放按钮继续。 完成后保存文件。

【讨论】:

以上是关于代码执行已被保存预防宏中断[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将工作表复制并保存到新工作簿

怎么样让Excel在打开时就自动执行编好的宏代码?

Linux下信号

event loop ,宏任务,微任务之我见

深入浅出处理器

内联函数的作用