【问题标题】:Strange behavior when closing a workbook twice两次关闭工作簿时的奇怪行为
【发布时间】:2019-12-09 11:22:27
【问题描述】:

从 VBA (Workbook_BeforeClose) 关闭工作簿两次时的奇怪问题

嗨。这个问题出现在一个非常简单的工作簿中:Workbook_BeforeClose only。

Option Explicit
     Private Sub Workbook_BeforeClose(Cancel As Boolean)
     ThisWorkbook.Close SaveChanges:=False
End Sub

如果我打开和关闭工作簿两次,Excel 主屏幕是这样的,无法进行操作,我只能从状态栏关闭它:

【问题讨论】:

  • 所以,您关闭了工作簿,应用程序本身仍然存在。
  • 这段代码的目的是什么?
  • 最后一行尝试Application.Quit。我以前也注意到类似情况下的行为。我相信这与其他隐藏的“工作簿”打开有关,例如可以在 VBE 中看到的个人宏工作簿。我注意到通过循环应用程序对象中的所有工作簿并确保它们已关闭来消除此行为,因此您可以尝试另一种方法。
  • 蒂姆·威廉姆斯,显然是一个极端的简化
  • K.戴维斯,我不能关闭整个应用程序,用户会杀了我:)

标签: excel vba


【解决方案1】:

如果您想要做的只是不提示用户保存更改,只需使用适当的标志来“欺骗”Excel 已保存更改。

Private Sub Workbook_BeforeClose(Cancel As Boolean)

    Me.Saved = True

End Sub

这将允许关闭工作簿,而不提示保存任何更改,但这不会实际保存它们。

注意这两个词之间的细微差别:Me.SavedMe.Save

  • Saved 是一个属性,当 Excel 检测到在上次保存时进行了更改时,该属性会翻转为 False

  • Save 是一个方法 - 不是上面的属性 - 实际上会保存工作簿。

您的工作簿已关闭,这就是触发此事件的原因。无需在此事件中再次尝试关闭它。只需告诉 Excel 自上次保存后未进行任何更改,它应该自行关闭所有内容 - 无需提示。

【讨论】:

    【解决方案2】:

    您可能正在重新触发该事件。试试这样的:

    Private Sub Workbook_BeforeClose(Cancel As Boolean)
         Static InProgress As Boolean
    
         If InProgress Then Exit Sub
    
         InProgress = True
         ThisWorkbook.Close SaveChanges:=False
    End Sub
    

    【讨论】:

    • 您好,感谢您的回答。我已经尝试过使用静态不发生两次,结果是一样的。问题是我不能溢出应用程序,用户会杀了我:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-16
    • 2017-01-02
    相关资源
    最近更新 更多