如何防止Excel工作表名稱被修改

在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”的工作表的CodeNameshtDEMO,如下圖所示。
在這裏插入圖片描述
第3行代碼恢復工作表名稱。
第4行代碼保存文件。


本文所講解的方法只是“基本上”實現了防止Excel工作表名稱被修改,並不能確保時候所有場景。如果希望完美的實現禁止工作表改名,應該使用“保護工作簿”的功能,工作表的重命名功能被禁用,但是需要注意的是工作表相關一些其他操作也同時被禁用,如下圖所示。
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章