excel - 如果以编程方式触发 Close,为什么 VBA Workbook.Close 语句在 Workbook_BeforeClose 内失败?

标签 excel vba events event-driven

我想用我自己的进程拦截BeforeClose,并取消默认进程。没有按预期工作。要复制,请创建一个新工作簿,输入以下内容并保存:

本工作簿模块:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
          Cancel = True
          Application.EnableEvents = False  ' to prevent recursively calling this procedure
          ThisWorkbook.Close
End Sub

在 Excel 前端,通过单击 close-X 手动关闭工作簿。正如预期的那样,它将通过 ThisWorkbook.Close 语句关闭。在 Excel 2016 和 365 中,如果其他工作簿打开,它们将保持打开状态。

请注意,EnableEvents 现在将为 false。关闭并重新打开 Excel 以将其恢复,或在立即 Pane 中输入:

Application.EnableEvents = True

现在重新打开同一工作簿。在 Workbook_BeforeClose 上放置断点。转到前端并再次手动关闭工作簿。单步执行代码,确认它在做什么。仍然工作正常。

如上所述恢复 EnableEvents。

再次打开文件。转到立即 Pane ,然后输入: ThisWorkbook.关闭

文件将不会关闭。单步执行代码看看发生了什么。还是没有关闭。为什么不呢?

最佳答案

考虑这段代码:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
          MsgBox "Start"
          ThisWorkbook.Close
          ThisWorkbook.Close
          MsgBox "End"
End Sub

这似乎证实了我的评论。
如果 ThisWorkbook.Close 可以调用 ThisWorkbook.Close,这将无限期地向“Start”消息框发送垃圾邮件。

合上书本通常会给你两个“开始”和一个“结束”

  • 因此它第一次返回到 ThisWorkbook.CloseBeforeClose 的开头,然后忽略它。

使用 ThisWorkbook.Close 关闭它会给出 one“开始”和 one“结束”

  • 因为它忽略了 ThisWorkbook.Close

但是

在这种情况下,从 ThisWorkbook.Close 开始应该让它们始终表现相同。但事实并非

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    ThisWorkbook.Close

    ThisWorkbook.Close

    Cancel = True
    Application.EnableEvents = False  ' to prevent recursively calling this procedure

    ThisWorkbook.Close
End Sub

看看这段代码在使用 ThisWorkbook.Close 关闭时如何执行:
enter image description here 没有关闭

然后从菜单中:
enter image description here 关闭了

如果我们不禁用这些事件,则从 ThisWorkbook.Close 运行它的行为完全相同。单步执行,不关闭。
然而,从菜单来看,却有很大不同:
enter image description here 并且不关闭。

因此,使用 ThisWorkbook.Close 调用 Workbook_BeforeClose 似乎会忽略所有其他 ThisWorkbook.Close,但使用菜单关闭文档将尝试运行每个 ThisWorkbook.Close 一次

关于excel - 如果以编程方式触发 Close,为什么 VBA Workbook.Close 语句在 Workbook_BeforeClose 内失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68291597/

相关文章:

javascript - AngularJS 获取 ng-click 源元素

Excel 2007 - 比较两张工作表并将差异粘贴到新工作表中

Php Yii,如何注册 Controller 引发的事件

excel - 使用 VBA Excel 从 CMD 运行 Exe 文件

excel - 使用 Excel VBA 写入 HTML 输入字段

excel - 如何从excel中的单元格中获取单词

excel - 将一维数组(变体类型)转换为一维数组(字节类型)

javascript - onfocusout/onfocusin 不工作

vba从word文档中读取页脚的内容

excel - 使用 EXCEL 将十六进制字符转换为 ASCII 字符