【发布时间】:2016-01-07 16:32:49
【问题描述】:
我想在打开工作簿时立即取消保护它,如果它在上次关闭时受到保护。我将以下代码放在 Open 事件的最开头:
If ThisWorkbook.ProtectStructure = True Then
Call ThisWorkbook.Unprotect("openpassword")
End If
同样,我想在工作簿关闭之前对其进行保护。所以我将以下代码放在 beforeClose 事件的最后:
If ThisWorkbook.ProtectStructure = False Then
Call ThisWorkbook.Protect("openpassword",True, False)
End If
ThisWorkbook.Save
这两个都不行!这意味着,如果工作簿在打开时已经受到保护,则不会执行 Open 事件中的任何代码。甚至没有 unprotect 调用!
类似地,在 beforeClose 事件中,所有代码之前保护部分被执行,除了保护部分和它后面的任何代码。我已经通过将它放置在 beforeClose 事件中的不同位置来确认这一点。
谁能帮我解决这个问题?
我为什么要这样做的其他解释:工作簿正在具有不同授权访问级别的用户之间共享。大多数用户在只允许在某些工作表上工作时面临受保护的工作簿。因此,根据谁最后使用它,工作簿可以在受保护状态或不受保护状态下关闭。如果在使用过程中没有受到保护,我需要在关闭时立即保护它,以便下一个未经授权的用户打开受保护的工作簿。
【问题讨论】:
-
在使用what
ProtectStructuremeans之前,您是否查阅过文档? -
感谢您无缘无故否决我的问题。是的,我有。如果工作簿受结构保护,则该属性为 True,否则为 False。
-
当用户是受信任的用户时,您尝试使工作簿不受保护,其他用户将看到受保护的工作簿,对吗?如果是,那么您如何告诉 VBA 当前用户是受信任的用户?。
-
感谢 Fadi 的参与。请参阅我对其他帮助者的回复。我的主要问题是“.protect”和“.unprotect”子程序没有在“workbook_Open”和“workbook_beforeClose”事件中执行。所有其他细节,包括授权处理,都是次要的,并在我的代码中实现。
-
@user5700405,我测试了你的代码,它运行正常,我在
.protect和.unprotect之后添加了 2 个 msgboxMsgBox ThisWorkbook.ProtectStructure并且都给了我正确的结果。