2013-11-04 68 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作用於工作表中的任意部分,而普通用戶只能用「解鎖」細胞相互作用。

相關問題