2013-11-04 69 views
0

是否有办法先在开始时解除工作簿的保护,运行所有的workbook_open()宏,然后重新保护工作簿,以便普通用户不能在任何工作表上更改任何内容?我想阻止普通用户更改任何内容,但允许宏执行自动更新和计算。如何在打开Excel工作簿时运行宏,然后在完成运行后重新保护?

有什么建议吗?这是否可行?

+0

看看是否有帮助:http://stackoverflow.com/questions/16174469/unprotect-vbproject-from-vb-code – Raptor

+0

Workbook_Open事件处理起来很棘手,尤其是对于多个实例。我已经看到他们搞砸了我的工作的一两次。我不是排队打开事件,而是使用第一个“Open”事件,并将所有其他事件放入“Worksheet_Activate”事件中。这可以为你工作吗? – Manhattan

+0

确保你的'Private Sub Workbook_Open()'在'ThisWorkBook'对象中。所有的程序都可以存储在一个常规模块中(只要不是'Private Sub')。也可以使用'ThisWorkbook'而不是'ActiveWorkbook',避免在你的代码中使用'Active ...'/'.Activate' /'.Select'选项。我也会创建'Unprotect','ReProtect'。 – PatricK

回答

2

我认为你正在寻找的是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更多信息。

+0

谢谢,这工作完美! – crazian

+0

当我坚持在ThisWorkbook中的时候会怎么样。在不受保护的循环和“保护”循环之间进行RefreshAll获取“无法在受保护的工作表中编辑数据透视表?” – crazian

+0

您确定工作表未被保护吗? – ARich

1

是的,这是可以做到

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作用于工作表中的任意部分,而普通用户只能用“解锁”细胞相互作用。

相关问题