Excel在VBA代码崩溃后取消保护工作表,尽管文件未保存



我有一本同事使用的 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 代码时后台发生了一些"事情",例如撤消堆栈被清除,我猜后台的某些东西正在记录工作表不受保护的事实即使我不保存文件?我想了解该机制,如果有人对如何记录保护状态有解释,将不胜感激。

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

Private Sub Workbook_Open()
' Ensure sheets are protected at open
ActiveSheet.Protect "password"
End Sub

最新更新