ThisWorkbook.Protect and Unprotect in Close and Open events

时间:2016-01-07 07:26:48

标签: excel vba

我希望在打开工作簿时立即取消保护,如果它在上次关闭时受到保护。我在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事件中的任何代码。甚至不是无保护的电话!

同样,在beforeClose事件中,除保护部分及其后面的任何代码外,执行保护部分之前的所有代码 。我已经确认将它放在beforeClose事件中的不同位置。

有人可以帮我这个吗?

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

2 个答案:

答案 0 :(得分:0)

你能检查一下这些事件是否正在发射?尝试在每个事件处理程序的开头放置一个Stop来查看它们是否被调用。如果代码没有执行,如果将其保存为可信文档会发生什么?

只需几件事: 为什么不为每个人关闭时强制保护,只允许在为某些人打开时不进行保护?

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

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

答案 1 :(得分:0)

请尝试以下方法:

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