在Excel工作表標籤上雙擊可以修改名稱,如果其他工作簿中公式使用了對於此工作表的外部引用,那麼工作表名稱變化後,這些外部引用經失效,在VBA代碼中通過工作表名稱引用對象也將出錯。利用VBA對象事件代碼可以一定程度上的實現防止Excel工作表名稱被修改。
假設實例文件中的工作表名稱爲“DEMO”,在該工作表模塊中增加如下事件代碼。
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Me.Name <> "DEMO" Then Me.Name = "DEMO"
End Sub
Private Sub Worksheet_Deactivate()
If Me.Name <> "DEMO" Then Me.Name = "DEMO"
End Sub
【代碼解析】
第1~3行代碼爲工作表的SelectionChange
事件代碼,用戶在工作表中選中單元格或者區域時,將激活此事件執行相關代碼。
第2行代碼判斷該工作表的名稱是否被修改,如果已經被修改,將自動恢復爲“DEMO”,其中的Me
用於指代代碼模塊所在對象,此處就是名稱爲“DEMO”的工作表。
如果用戶修改了工作表名稱之後,直接切換工作表,那麼並不會激活SelectionChange
事件,針對此場景需要在Deactivate
事件中添加同樣的代碼用於恢復工作表名稱。
使用了兩個工作表事件是否將完美解決這個問題呢?其實並不是,如果用戶修改了工作表名稱之後,直接保存並關閉工作簿文件,那麼該工作表的名稱應不再是“DEMO”。爲了應對此場景,需要使用工作簿的事件代碼。
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If shtDEMO.Name <> "DEMO" Then
shtDEMO.Name = "DEMO"
ThisWorkbook.Save
End If
End Sub
【代碼解析】
工作簿事件代碼保存在ThisWorkbook
模塊中, 就無法像上面兩個工作表事件代碼一樣直接使用Me.Name
獲取工作表名稱。此處可以使用工作表的CodeName
作爲工作表對象的標識,此例中名稱爲“DEMO”的工作表的CodeName
爲shtDEMO
,如下圖所示。
第3行代碼恢復工作表名稱。
第4行代碼保存文件。
本文所講解的方法只是“基本上”實現了防止Excel工作表名稱被修改,並不能確保時候所有場景。如果希望完美的實現禁止工作表改名,應該使用“保護工作簿”的功能,工作表的重命名功能被禁用,但是需要注意的是工作表相關一些其他操作也同時被禁用,如下圖所示。