首页 > 解决方案 > 在 Excel VBA 中关闭表单时,QueryClose 是保护工作表的正确方法吗?

问题描述

我有一个包含许多工作表的工作簿。其中一些必须受到保护,而其中一些必须解锁。棘手的部分是userform使用 Excel VBA 创建的将用于将数据添加到受保护的工作表之一,并且当所述工作表受到保护时代码会失败,因为它应该向表中添加行以保存数据。

我尝试使用以下代码来解决此问题:

Sheets("Sales").Protect Password:="123", AllowInsertingRows:=True, UserInterFaceOnly:=True

虽然在运行它之后我可以通过用户界面手动添加行,但似乎我试图使用的属性只能以这种方式工作,VBA 代码仍然不能和新行到受保护的工作表。

因此,我想到的解决方法是在userform初始化时取消保护工作表,如下所示:

Private Sub UserForm_Initialize()
  Sheets("Sales").Unprotect "123"
End Sub

这样userform可以毫无问题地保存所有数据。但是,我的问题是如何再次正确保护它。关闭 有两种方法userform,一种是使用仅运行这段Unload Me代码的取消按钮,第二种是使用表单右上角的 X。我想保持这两个选项可用,但还要确保在用户尝试编辑工作表之前再次对其进行保护(不可能在userform打开的情况下选择任何内容)。

我认为最好的选择是以下代码:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  Sheets("Sales").Protect Password:="123"
End Sub

经过测试,我相信它可以工作,但我不确定这是否是正确的方法。也许有一种我没有考虑到的特定情况最终会导致用户能够编辑应该受到保护的工作表。请让我知道我的代码是否有任何缺陷?

标签: excelvba

解决方案


推荐阅读