是否有办法先在开始时解除工作簿的保护,运行所有的workbook_open()
宏,然后重新保护工作簿,以便普通用户不能在任何工作表上更改任何内容?我想阻止普通用户更改任何内容,但允许宏执行自动更新和计算。如何在打开Excel工作簿时运行宏,然后在完成运行后重新保护?
有什么建议吗?这是否可行?
是否有办法先在开始时解除工作簿的保护,运行所有的workbook_open()
宏,然后重新保护工作簿,以便普通用户不能在任何工作表上更改任何内容?我想阻止普通用户更改任何内容,但允许宏执行自动更新和计算。如何在打开Excel工作簿时运行宏,然后在完成运行后重新保护?
有什么建议吗?这是否可行?
我认为你正在寻找的是Worksheet.Protect
方法。
在你Workbook_Open
事件的开始,将此代码:
ThisWorkbook.Sheets("SheetYouWantToUnprotect").Unprotect _ Password:="TheSheetPassword"
然后在你的Workbook_Open
事件代码结束,你想再次保护工作表,所以把这个代码:
ThisWorkbook.Sheets("SheetYouWantToProtect").Protect _
Password:="SheetPassword"
当然,如果多张纸需要不受保护,您可以使用多张纸进行此操作。如果每个表具有相同的密码,将一个简单的循环在你Open
事件的开始:
Dim sht as Worksheet
For Each sht in Thisworkbook.Sheets
sht.Unprotect Password:="YourPassword"
Next sht
在你的代码的最后,你可以使用相同的循环,保护片,只是改变.Unprotect
到.Protect
。或者,如果有许多不同的密码(除了建议您将它们全部更改为一个密码),您可以放置我提到的第一行代码的实例,因为它可以取消保护必要的工作表。
注:有许多更多的可选参数.Protect
方法,我没有涵盖,但你可以找到一个详尽的清单here.
编辑:在Unprotect
方法Here's更多信息。
是的,这是可以做到
Private Sub Workbook_Open()
Dim WS As Worksheet
For Each WS In ThisWorkbook.Sheets
WS.Unprotect Password:="YourPassword"
WS.Protect Password:="YourPassword", UserInterfaceOnly:=True
Next WS
End Sub
的UserInterfaceOnly:=True
允许VBA作用于工作表中的任意部分,而普通用户只能用“解锁”细胞相互作用。
看看是否有帮助:http://stackoverflow.com/questions/16174469/unprotect-vbproject-from-vb-code – Raptor
Workbook_Open事件处理起来很棘手,尤其是对于多个实例。我已经看到他们搞砸了我的工作的一两次。我不是排队打开事件,而是使用第一个“Open”事件,并将所有其他事件放入“Worksheet_Activate”事件中。这可以为你工作吗? – Manhattan
确保你的'Private Sub Workbook_Open()'在'ThisWorkBook'对象中。所有的程序都可以存储在一个常规模块中(只要不是'Private Sub')。也可以使用'ThisWorkbook'而不是'ActiveWorkbook',避免在你的代码中使用'Active ...'/'.Activate' /'.Select'选项。我也会创建'Unprotect','ReProtect'。 – PatricK