Excel 此工作簿。在关闭和打开事件中保护和取消保护

Excel 此工作簿。在关闭和打开事件中保护和取消保护,excel,vba,Excel,Vba,如果工作簿在上次关闭时受到保护,我希望在打开工作簿时立即解除其保护。我将以下代码放在公开活动的最开始处: If ThisWorkbook.ProtectStructure = True Then Call ThisWorkbook.Unprotect("openpassword") End If 同样,我想在工作簿关闭之前保护它。因此,我将以下代码放在beforeClose事件的末尾: If ThisWorkbook.ProtectStructure = False Then

如果工作簿在上次关闭时受到保护,我希望在打开工作簿时立即解除其保护。我将以下代码放在公开活动的最开始处:

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事件中的任何代码。甚至连取消保护的电话都没有

类似地,在beforeClose事件中,执行保护部分之前的所有代码,但保护部分及其之后的任何代码除外。我已经确认了这一点,将其放置在“关闭前”事件中的不同位置

有人能帮我吗


我想这样做的其他解释:工作簿正在具有不同授权访问级别的用户之间共享。当只允许在某些工作表上工作时,大多数用户将面临受保护的工作簿。因此,取决于最后使用工作簿的用户,工作簿可以在受保护状态或未受保护状态下关闭。如果它在使用过程中未受到保护,我需要在关闭后立即对其进行保护,以便下一个未经授权的用户将打开一个受保护的工作簿。

您能检查事件是否确实触发了吗?尝试在每个事件处理程序的开始处放置一个停止符,以查看它们是否被调用。如果代码未执行,如果将其保存为受信任的文档,会发生什么情况

只有几件事: 为什么不在为每个人关闭时强制提供保护,而在为某些人打开时只允许取消保护

您如何确定哪些用户可以取消对工作簿的保护


您没有将工作簿保存为共享工作簿,对吗?这是一个普通的工作簿,但由不同的用户访问。共享工作簿在保护方面有点可笑。

请尝试以下方法:

Dim sht As Worksheet
For Each sht in ActiveWorkbook.worksheets
    If sht.Protection = True Then
        sht.Unprotect("openpassword")
    End If
Next sht
最后也是一样:

Dim sht as Worksheet
For Each sht in ActiveWorkbook.Worksheets
    If sht.Protection = False Then
        sht.Protect ("openpassword", True, False)
    End If
Next sht
就我所知,在excel中,不可能直接保护整个工作簿,而是必须保护每个工作表

你至少可以试试看,如果行得通的话我也很高兴:)


CU Kath

在使用之前,您是否查阅了相关文档?感谢您无缘无故地否决了我的问题。是的,我有。如果工作簿受结构保护,则该属性为True,否则为False。当用户是受信任的用户时,您尝试使工作簿不受保护,其他用户将看到受保护的工作簿,对吗?。如果是,那么您如何告诉VBA当前用户是受信任的用户?谢谢Fadi的参与。请参阅我对其他帮助者的回复。我的主要问题是“.protect”和“.unprotect”子命令在事件“工作簿\u Open”和“工作簿\u beforeClose”中无法执行。所有其他细节,包括授权处理,都是次要的,并在我的代码中实现。@User570045,我测试了你的代码,它运行正常,我在这个工作簿中添加了2个msgbox
msgbox。protect structure
之后。protect
。unprotect
都给了我正确的结果。谢谢你,PaulG的回答。当这些事件中的代码行被真正执行时,这两个事件都会被触发。只有我在问题中提到的那些代码根本不会被执行。事实上,这些代码后面的任何代码都不会执行。我想在关闭时强制保护每个人,这就是为什么我在beforeClose事件中调用protect。我通过输入框用户名和密码来确定授权哪个用户,并根据我的登录数据库进行检查。一旦建立了授权级别,我将相应地保护/取消保护工作簿。工作簿在excel中不“共享”。如中所示,“共享”功能已关闭。感谢您的帮助。我想我已经找到了原因。我认为sub“.protect”(适用于工作簿和工作表)及其相关属性仅在独立sub中使用时有效。在事件(如Open或beforeClose)中使用时,它们不起作用。我已经在文档中看到了.protect\u Open()-sub,它工作得很好。这实际上不应该是个问题。但如果它现在对你有效,那没关系:)