【问题标题】:Excel own dialog box on Workbook_BeforeClose event, option for CancelWorkbook_BeforeClose 事件上的 Excel 自己的对话框,取消选项
【发布时间】:2019-07-25 16:24:27
【问题描述】:

我的代码现在看起来像这样,唯一需要解决的问题是如何在不显示内置对话框的情况下获取取消。如果我单击是或否,一切正常。但是,当我单击“取消”时,会弹出内置对话框,我必须再次单击“取消”。如何使取消像取消一样工作,这样就不会弹出内置对话框?

Private Sub Workbook_BeforeClose(Cancel As Boolean)
Application.DisplayAlerts = False
    If Not closing Then
        answer = MsgBox("Save data?", vbYesNoCancel + vbQuestion, "Save data?")

        If answer = vbYes Or answer = vbNo Then
            closing = True
            On Error Resume Next

        Application.Visible = False

        Application.DisplayFormulaBar = True
        ActiveWindow.DisplayHeadings = True
        ActiveWindow.DisplayGridlines = True

        ThisWorkbook.Unprotect Password:="123456"

        ActiveWorkbook.Sheets("Start").Visible = True

        ThisWorkbook.Worksheets("Start").Activate

        ThisWorkbook.Protect Password:="123456", Structure:=True, Windows:=False
            ActiveWorkbook.Close savechanges:=answer = vbYes
        Else
            Cancel = True
        End If
    End If
    Application.DisplayAlerts = True
End Sub

这是它的样子(我使用 Office 2016):

【问题讨论】:

  • Excel 2013 中没有重现,如果选择取消,则 MsgBox 是唯一的对话框。
  • However when I click Cancel built-in dialog box pops up and I have to click Cancel again. 我没有遇到同样的行为。当我按下 cnacel 时,没有按预期发生
  • 如果只将显示的代码复制到空工作簿,是否会得到相同的结果?如果是 - 添加 Excel 版本。如果没有 - 文件中涉及其他内容,您必须检查它是什么并包含问题。
  • 如果我创建一个新工作簿并在其中插入此代码,则取消工作为否。工作簿只是关闭而不保存。
  • 这看起来很奇怪,所以要么是 2016 出现问题,要么是你的安装有问题(也许是一些插件?)。剩下的唯一建议是在代码的第一行放置断点,然后查看按取消时会发生什么(使用 F8 逐步运行并检查变量值)。

标签: excel vba


【解决方案1】:

这是问题所在:ActiveWorkbook.Close savechanges:=answer = vbYes

它再次触发 BeforeClose 事件。因此,您应该事先禁用这些事件,然后再重新启用它们。

Application.EnableEvents=False
ActiveWorkbook.Close savechanges:=answer = vbYes
Application.EnableEvents=True

【讨论】:

  • 答案为取消时,未到达此行。
  • 当我测试代码时,单击“是”或“否”时,MsgBox 只打开了两次。取消按预期工作。我写的代码解决了这个问题。也许@user7202022 在这里发布之前对代码进行了更改,所以我从他那里得到了相反的问题。即使不是这样,他也可以在 Sub 开始时禁用事件并在最后重新启用它们。
  • 我怀疑closing 变量是全局变量并设计为可重入保护,但问题仍然是关于取消行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多