【问题标题】:Excel Unprotects Sheet after VBA Code Crash Despite File Not Being Saved尽管文件未保存,但 Excel 在 VBA 代码崩溃后取消保护工作表
【发布时间】:2018-04-10 16:21:59
【问题描述】:

我有一本同事使用的 Excel 书,当他们打开它时受到保护,在测试我正在开发的新功能时,我遇到了一个奇怪的 Excel 怪癖,我不明白:

单击链接到宏的按钮时,VBA 代码首先取消对工作簿的保护,如下所示:

Sub ButtonClick()
Dim userrange As Variant
Dim rrow As Range
Dim teeth As Range

' unprotect sheet
ActiveSheet.Unprotect ("password")
Application.EnableEvents = False

然后宏崩溃(我知道为什么,这不是这里的问题)。然后我在弹出的错误消息上按结束,并在不保存文件的情况下关闭 excel。当文件重新打开时,这本书是不受保护的。

基本上,代码在到达这里之前就崩溃了:

' protect sheet
ActiveSheet.Protect ("password")
Application.EnableEvents = True

我能否确保 excel 文件在重新打开时仍然受到保护,即使 VBA 代码在取消保护后崩溃?

这是一个问题的原因是我在工作簿中有一些现有功能,只有在工作簿受到保护时才能正常工作。因此,如果有人使程序崩溃然后试图重新打开它,如果没有我的输入,他们将无法再次正常使用它。

我觉得奇怪的是 Excel 会“保存”工作簿不受保护的事实,即使我关闭文件而不保存任何内容也是如此。我知道在运行 VBA 代码时会在后台发生一些“事情”,例如撤消堆栈被清除,我猜后台的某些东西正在记录工作表不受保护的事实,即使我不保存文件?我想了解该机制,如果有人对如何记录保护状态有解释,将不胜感激。

【问题讨论】:

  • 使用错误处理并作为重新保护工作表的一部分
  • @Tom 你能解释一下即使文件没有保存,工作簿是如何保持不受保护的吗?这基本上是我想了解的。我猜这是一个后台进程,就像运行 VBA 代码时清除撤消堆栈一样。

标签: vba excel


【解决方案1】:

作为一种解决方法,您可以使用 Workbook_Open 事件(添加到 ThisWorkbook 模块)确保文件在打开时受到保护。这并不能解释工作簿当前如何不受保护,但您应该能够绕过它。

Private Sub Workbook_Open()

' Ensure sheets are protected at open
ActiveSheet.Protect "password"

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-30
    相关资源
    最近更新 更多