【问题标题】:ThisWorkbook.Protect and Unprotect in Close and Open eventsThisWorkbook.Protect 和 Unprotect 在关闭和打开事件中
【发布时间】: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 ProtectStructure means之前,您是否查阅过文档?
  • 感谢您无缘无故否决我的问题。是的,我有。如果工作簿受结构保护,则该属性为 True,否则为 False。
  • 当用户是受信任的用户时,您尝试使工作簿不受保护,其他用户将看到受保护的工作簿,对吗?如果是,那么您如何告诉 VBA 当前用户是受信任的用户?。
  • 感谢 Fadi 的参与。请参阅我对其他帮助者的回复。我的主要问题是“.protect”和“.unprotect”子程序没有在“workbook_Open”和“workbook_beforeClose”事件中执行。所有其他细节,包括授权处理,都是次要的,并在我的代码中实现。
  • @user5700405,我测试了你的代码,它运行正常,我在 .protect.unprotect 之后添加了 2 个 msgbox MsgBox ThisWorkbook.ProtectStructure 并且都给了我正确的结果。

标签: excel vba


【解决方案1】:

你能检查事件是否真的在触发?尝试在每个事件处理程序的开头放置一个 Stop 以查看它们是否被调用。如果代码没有执行,如果将其保存为可信文档会怎样?

只有几件事: 为什么不为所有人关闭时强制保护,而仅在为某些人打开时才允许取消保护?

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

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

【讨论】:

  • 感谢 PaulG 的回答。这两个事件肯定会触发,因为这些事件中的代码行确实被执行了。只有我在问题中提到的那些代码根本不会被执行。事实上,这些后面的任何代码都不会被执行。我想在关闭时强制保护每个人,这就是我将保护调用放在 beforeClose 事件中的原因。我通过输入框用户名和密码确定要授权的用户,并根据我的登录数据库检查它们。建立授权级别后,我会相应地保护/取消保护工作簿。
  • 工作簿在 Excel 中未“共享”。由于“共享”功能已关闭。
【解决方案2】:

请尝试以下方法:

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 中 - 据我所知 - 不可能直接保护整个工作簿,而是您必须保护每张工作表。

你至少可以尝试一下,如果它有效我也很高兴:)

库凯丝

【讨论】:

  • 感谢您的帮助。我想我已经找到了原因。我认为子“.protect”(用于工作簿和工作表)及其相关属性仅在独立子中使用时才有效。在诸如 Open 或 beforeClose 之类的事件中使用时,它们不起作用。
  • 我已经在 Document_open()-sub 中看到了 .protect 并且效果很好。这实际上应该不是问题。但如果它现在对你有用,那没关系:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 2011-02-03
  • 2013-05-06
  • 2010-09-19
  • 1970-01-01
相关资源
最近更新 更多