職場中經常需要将做好的Excel表格/模闆發給他人或者存放在公共路徑上共享使用,此時需要禁止别人更改已經設定好的工作表名稱。或者某些工作簿中有公式使用了對某些工作表的外部引用,如果工作表名稱發生變化,那麼這些外部引用會失效。又或是其它VBA程序或者其它程序使用表名稱定位工作表,那麼工作表名稱的改變會導緻程序無法執行!
那麼如何禁止用戶更改工作表名稱呢?
假設以下案例:
禁止用戶修改宏工作簿中名稱為“生産計劃表”,“銷售計劃表”和“财務計劃表”的表名稱。
本篇中《神奇的VBA》将提供四種思路和相應的VBA代碼範例。
思路1: 保護工作簿結構
如果不采用VBA編程,最常用且有效的方法就是保護工作簿結構。
PrivateSub Workbook_Open()
ActiveWorkbook.Unprotect
ActiveWorkbook.Protect Structure:=True,Windows:=False
End Sub
該方法簡單常用,保護工作簿結構,禁止修改修改“生産計劃表”,“銷售計劃表”和“财務計劃表”的表名時也禁止對其它工作表表名稱進行修改,同時表結構無法更改,表順序,删除,隐藏等功能也無法執行。
注意:對Excel不是太熟悉的用戶千萬不要将保護工作簿結構和工作表保護搞混。
思路2:在工作簿模塊中,鼠标右擊工作表标簽時,禁止彈出菜單,進而無法手動更改工作表名稱。
PrivateSub Workbook_Activate()
Application.CommandBars("Ply").Enabled = False'執行屏蔽右鍵菜單
End Sub
PrivateSub Workbook_Deactivate()
Application.CommandBars("Ply").Enabled = True '解除屏蔽右鍵菜單
End Sub
該方法簡單粗暴,區别主要在于右鍵點擊标簽時是否會彈出菜單。既然無法彈出菜單,那就無法手動修改工作名稱。既然無法彈出菜單,那麼也就是無法使用菜單中的所有自動功能,也阻止了用戶執行如修改工作表标簽顔色等操作的念想。
思路3:在工作表模塊中,采用工作表Worksheet_Deactivate和Worksheet_SelectionChange事件恢複用戶對工作表名稱的修改并彈出警示框。
采用兩種不同事件的依據是日常手動修改工作表名稱通常有兩種常見的模式:
模式1:鼠标右鍵單擊工作表标簽修改表名後,點擊任意單元格完成名稱修改。
模式2:鼠标右鍵單擊工作表标簽修改表名後,點擊其它工作表标簽完成修改。
鑒于這兩種模式,同時采用Worksheet_SelectionChange工作表選區改變事件和Worksheet_Deactivate工作表解除激活事件将分别根據兩種操作模式觸發相應的事件。
Private Sub Worksheet_Deactivate()
If Me.Name <> "生産計劃表" Then
MsgBox "禁止修改工作表"
Me.Name = "生産計劃表"
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Me.Name <> "生産計劃表" Then
MsgBox "禁止修改工作表"
Me.Name = "生産計劃表"
End If
End Sub
該方法運行效果很好, 不過有心的同學們會發現,如果一個工作簿中30個表要對其中20個工作表名稱采用思路3的代碼方法,很顯然有點麻煩。如果集中對指定名稱的工作表執行禁止修改表名的操作呢?《神奇的VBA》介紹第4種思路。
思路4:在工作簿模塊中,綜合運用隐藏的Application事件, 字典以及工作表的代碼名稱(CodeName)。
Public WithEvents app As Application
Dim dic
Private Sub app_SheetDeactivate(ByVal Sh As Object)
If dic.exists(Sh.CodeName) = False Then Exit Sub
If dic(Sh.CodeName) <> Sh.Name Then
MsgBox "你無權修改工作表名稱!"
Sh.Name = dic(Sh.CodeName)
End If
End Sub
Private Sub app_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If dic.exists(ActiveSheet.CodeName) = False Then Exit Sub
If dic(ActiveSheet.CodeName) <> ActiveSheet.Name Then
MsgBox "你無權修改工作表名稱!"
ActiveSheet.Name = dic(ActiveSheet.CodeName)
End If
End Sub
Private Sub Workbook_Open()
dic.Add "Sheet1", "Sheet1"
dic.Add "Sheet2", "Sheet2"
dic.Add "Sheet3", "Sheet3"
Set app = Application
End Sub
通過運行驗證該方法很好地滿足了本篇主旨的功能需求。此代碼通過在工作簿模塊編輯窗口頂層放置Public WithEvents app As Application語句中調出Application事件列表,使得我們可以像添加工作簿工作表事件一樣手動選擇添加内置的應用程序級事件。
通過應用程序級别的工作表選區改變事件和工作表解除激活事件,我們可以集中監控所有表。字典在工作簿打開時記載要禁止修改名稱的工作表名稱和代碼名稱(CodeName),工作表的代碼名稱為鍵,具有唯一性,工作表名稱為值,用戶可以随便修改。在上述事件中通過判斷和對比觸發事件時的表名稱最終實現本篇的功能!
今天的分享就到這裡,本篇中介紹的思路抛磚引玉,如果您有更多更好的思路歡迎分享!
歡迎轉發收藏更多Excel VBA編程知識,請查閱職場高效達人必備的參考和學習工具《神奇的VBA》編程參考學習插件,内置嵌入Excel Ribbon界面,打開任意Excel工作簿就能随時查閱和學習Excel VBA編程知識的賦能工具。
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!