《神奇的VBA》编程:禁止修改Excel工作表名称 |
您所在的位置:网站首页 › Vba高级编程 › 《神奇的VBA》编程:禁止修改Excel工作表名称 |
《神奇的 VBA 》编程:禁⽌修改 Excel ⼯作表名称 职场中经常需要将做好的 Excel 表格 / 模板发给他⼈或者存放在公共路径上共享使⽤,此时需要禁⽌别⼈更改已经设定好的⼯作表名称。或者某些⼯作簿中有公式使⽤了对某些⼯作表的外部引⽤,如果⼯作表名称发⽣变 部引⽤会失效。⼜或是其它 VBA 程序或者其它程序使⽤表名称定位⼯作表,那么⼯作表名称的改变会导致程序⽆法执⾏! 那么如何禁⽌⽤户更改⼯作表名称呢? 假设以下案例: 禁⽌⽤户修改宏⼯作簿中名称为 “ ⽣产计划表 ” , “ 销售计划表 ” 和 “ 财务计划表 ” 的表名称。 本篇中《神奇的 VBA 》将提供四种思路和相应的 VBA 代码范例。 思路 1 :
保护⼯作簿结构 如果不采⽤ VBA 编程,最常⽤且有效的⽅法就是保护⼯作簿结构。 该⽅法简单常⽤,保护⼯作簿结构,禁⽌修改修改 “ ⽣产计划表 ” , “ 销售计划表 ” 和 “ 财务计划表 ” 的表名时也禁⽌对其它⼯作表表名称进⾏修改,同时表结构⽆法更改,表顺序,删除,隐藏等功能也⽆法执⾏。 注意:对 Excel 不是太熟悉的⽤户千万不要将保护⼯作簿结构和⼯作表保护搞混。 思路 2 :在⼯作簿模块中,⿏标右击⼯作表标签时,禁⽌弹出菜单,进⽽⽆法⼿动更改⼯作表名称。 该⽅法简单粗暴,区域主要在于右键点击标签时是否会弹出菜单。既然⽆法弹出菜单,那就⽆法⼿动修改⼯作名称。既然⽆法弹出菜单,那么也就是⽆法使⽤菜单中的所有⾃动功能,也阻⽌了⽤户执⾏如修改⼯作表标 念想。 思路 3 :在⼯作表模块中,采⽤⼯作表 Worksheet_Deactivate 和 Worksheet_SelectionChange 事件恢复⽤户对⼯作表名称的修改并弹出警⽰框。 采⽤两种不同事件的依据是⽇常⼿动修改⼯作表名称通常有两种常见的模式: 模式1:⿏标右键单击⼯作表标签修改表名后,点击任意单元格完成名称修改。 模式2:⿏标右键单击⼯作表标签修改表名后,点击其它⼯作表标签完成修改。 鉴于这两种模式,同时采⽤ Worksheet_SelectionChange ⼯作表选区改变事件和 Worksheet_Deactivate ⼯作表解除激活事件将分别根据两种操作模式触发相应的事件。 该⽅法运⾏效果很好 , 不过有⼼的同学们会发现,如果⼀个⼯作簿中 30 个表要对其中 20 个⼯作表名称采⽤思路 3 的代码⽅法,很显然有点⿇烦。如果集中对指定名称的⼯作表执⾏禁⽌修改表名的操作呢?《神奇的 V 路。 思路 4 :在⼯作簿模块中,综合运⽤隐藏的 Application 事件,
字典以及⼯作表的代码名称( CodeName )。 通过运⾏验证该⽅法很好的满⾜了本篇主旨的功能需求。此代码通过在⼯作簿模块编辑窗⼝顶层放置 Public WithEvents app As Application 语句中调出 Application 事件列表,使得我们可以像添加⼯作簿⼯作表事件⼀样 置的应⽤程序级事件。 通过应⽤程序级别的⼯作表选区改变事件和⼯作表解除激活事件,我们可以集中监控所有表。字典在⼯作簿打开时记载要禁⽌修改名称的⼯作表名称和代码名称( CodeName ),⼯作表的代码名称为键,具有唯⼀性, 值,⽤户可以随便修改。在上述事件中通过判断和对⽐触发事件时的表名称最终实现本篇的功能! 今天的分享就到这⾥,
对于今天的主题,如果您有更好的思路,欢迎关注并留⾔! 如果对您有⽤,请点赞关注并保留好这个模板代码,或者安装《神奇的 VBA 》插件,
该代码将收录进《神奇的 VBA 》插件⽰例代码库中供⽤户参考! PrivateSub Workbook_Open() ActiveWorkbook.Unprotect ActiveWorkbook.Protect Structure:=True,Windows:=False End Sub PrivateSub Workbook_Activate()Application.CommandBars("Ply").Enabled = False' 执⾏屏蔽右键菜单 End SubPrivateSub Workbook_Deactivate()Application.CommandBars("Ply").Enabled = True ' 解除屏蔽右键菜 Private Sub Worksheet_Deactivate() If Me.Name " ⽣产计划表 " Then MsgBox " 禁⽌修改⼯作表 " Me.Name = " ⽣产计划表 " End IfEnd Sub Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Me.Name " ⽣产计划表 " Then MsgBox " 禁⽌修改⼯作表 " Me.Name = " ⽣产计划表 " End IfEnd Sub Public WithEvents app As Application Dim dicPrivate 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 IfEnd SubPrivate Sub app_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) If dic.exists(ActiveSheet.CodeName) = False Then Exit Sub If dic(ActiveSheet.CodeName) ActiveSh MsgBox " 你⽆权修改⼯作表名称 !" ActiveSheet.Name = dic(ActiveSheet.CodeName) End IfEnd SubPrivate Sub Workbook_Open() dic.Add "Sheet1", " ⽣产计划表 " dic.Add "Sheet2", " 销售计划表 " dic.Add "Sheet3", " 财务计划表 " Set app = Application End Sub 记得点赞转发关注,学习职场中的⼲货技能! 记得点赞转发关注,学习职场中的⼲货技能! |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |