1. 程式人生 > >疑難雜症 | Excel VBA鎖定指定單元格區域

疑難雜症 | Excel VBA鎖定指定單元格區域

背景:鎖定EXCEL表頭(不允許編輯部分單元格)

 

一、手動操作流程

其基本邏輯並不複雜,手動操作流程是:

1、取消所有單元格的“鎖定”格式

CTRL+A,選中全部的單元格→單擊右鍵→設定單元格格式→保護→取消勾選鎖定

2、選中指定單元格(需要鎖定的單元格)→單擊右鍵→設定單元格格式→保護→勾選鎖定

3、點選“審閱”→保護工作表→下面的複選框全部選擇→確定→輸入密碼→再次輸入密碼即可

 

二、VBA的方法

 1 Function ProtectRange(rng As Variant)
 2 Application.ScreenUpdating = False
 3     Dim sh, rg, cell
 4     Set sh = ActiveSheet
 5      
 6     '解鎖表
 7     sh.Unprotect "123456"
 8     
 9     '選擇所有的單元格並設定不鎖定
10     sh.Cells.Locked = False
11    
12     '選擇目標單元格,並設定鎖定
13     sh.Range(rng).Locked = True
14 
15     '鎖定表(除了表頭不允許修改,其他可以操作)   
16     sh.Protect Password:="123456", _
17     UserInterFaceOnly:=True, _
18     DrawingObjects:=False, _
19     Contents:=True, _
20     Scenarios:=False, _
21     AllowFormattingCells:=True, _
22     AllowFormattingColumns:=True, _
23     AllowFormattingRows:=True, _
24     AllowInsertingColumns:= True, _
25     AllowInsertingRows:=True, _
26     AllowInsertingHyperlinks:=True, _
27     AllowDeletingColumns:=True, _
28     AllowDeletingRows:=True, _
29     AllowSorting:=True, _
30     AllowFiltering:=True, _
31     AllowUsingPivotTables:=True
32 Application.ScreenUpdating = 1
33 End Function
34 
35 '呼叫方法:
36 '比如鎖定 A1:F1的內容
37 Sub test()
38     ProtectRange(“A1:F1”)
39 End Sub

 

三、疑難雜症

以上程式碼本身沒有問題,但是我在做某一行(非鎖定行)的刪除操作的時候,系統提示:“您正試圖刪除包含有鎖定單元格的一行。鎖定單元格在工作表受保護時無法刪除”。

先要說明白3個邏輯:

(1)如果一行中任意一個單元格設定了“鎖定”,在工作表保護時,即使設定了允許刪除行,實際上也是刪除不了的。假如能刪除的話,就破壞了工作表保護這種機制,工作表保護、單元格保護就失去了它原有的作用。

(2)如果一行中所有單元格都取消勾選“鎖定”,那麼在工作表保護狀態下勾選允許“刪除行”時,就可以刪除這一行。

(3)如果在工作表保護時,沒有勾選允許“刪除行”,即使所有單元格都取消勾選“鎖定",也是不能刪除這一行的。

但是我可以明確的是,我刪除的行中所有單元格沒有被鎖定,且已經設定了允許刪除行。比如我設定的是第一行鎖定,其他單元格統統未被鎖定,理論上除了第一行之外是可以刪除的。但是系統始終提示:“您正試圖刪除包含有鎖定單元格的一行。鎖定單元格在工作表受保護時無法刪除”。

 

經過吃飯的瞬間,我想問題想通了:原因在於,我在編寫vba程式的時候呼叫了change事件,換句話說,整個change事件影響了系統做出判斷,系統以為我正在對鎖定的第一行進行操作,但是實際上是我在非第一行操作。因此係統進行了報錯。

為了驗證我的看法,我又測試了另外一個沒有change事件的vba程式,的確可以正常刪除。由此驗證,change事件可能不能與鎖定特定單元格的程式碼同步執行,內部可能存在矛盾機制。希望對有緣人有用!

 

四、解決方案

在worksheet_change 事件中,編寫一段先解密再加密的程式即可(這樣既保證了change事件的正常使用,也保證了保護工作表,而且能夠同時進行非鎖定單元的刪除編輯等操作)。

 

五、參考資料

[1] http://www.360doc.com/content/17/0510/21/30583536_652812755.shtml

[2] https://docs.microsoft.com/en-us/office/vba/api/excel.worksheet.protect

[3] https://docs.microsoft.com/zh-cn/office/vba/api/excel.range.locked

[4] https://blog.csdn.net/rooklyn21/article/details/22298657

[5] https://zhidao.baidu.com/question/598163828.html

[6] http://club.excelhome.net/thread-1543118-1-1.