职场中经常需要将做好的Excel表格/模板发给他人或者存放在公共路径上共享使用,此时需要禁止别人更改已经设定好的工作表名称。或者某些工作簿中有公式使用了对某些工作表的外部引用,如果工作表名称发生变化,那么这些外部引用会失效。又或是其它VBA程序或者其它程序使用表名称定位工作表,那么工作表名称的改变会导致程序无法执行!
那么如何禁止用户更改工作表名称呢?
假设以下案例:
禁止用户修改宏工作簿中名称为“生产计划表”,“销售计划表”和“财务计划表”的表名称。
本篇中《神奇的VBA》将提供四种思路和相应的VBA代码范例。
思路1: 保护工作簿结构
如果不采用VBA编程,最常用且有效的方法就是保护工作簿结构。
PrivateSub Workbook_Open() ActiveWorkbook.Unprotect ActiveWorkbook.Protect Structure:=True,Windows:=FalseEnd Sub该方法简单常用,保护工作簿结构,禁止修改修改“生产计划表”,“销售计划表”和“财务计划表”的表名时也禁止对其它工作表表名称进行修改,同时表结构无法更改,表顺序,删除,隐藏等功能也无法执行。
注意:对Excel不是太熟悉的用户千万不要将保护工作簿结构和工作表保护搞混。
思路2:在工作簿模块中,鼠标右击工作表标签时,禁止弹出菜单,进而无法手动更改工作表名称。
PrivateSub Workbook_Activate()Application.CommandBars("Ply").Enabled = False'执行屏蔽右键菜单End SubPrivateSub 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 IfEnd SubPrivate Sub Worksheet_SelectionChange(ByVal Target As Range)If Me.Name "生产计划表" Then MsgBox "禁止修改工作表" Me.Name = "生产计划表"End IfEnd Sub
该方法运行效果很好, 不过有心的同学们会发现,如果一个工作簿中30个表要对其中20个工作表名称采用思路3的代码方法,很显然有点麻烦。如果集中对指定名称的工作表执行禁止修改表名的操作呢?《神奇的VBA》介绍第4种思路。
思路4:在工作簿模块中,综合运用隐藏的Application事件, 字典以及工作表的代码名称(CodeName)。
Public WithEvents app As ApplicationDim dicPrivate Sub app_SheetDeactivate(ByVal Sh As Object)If dic.exists(Sh.CodeName) = False Then Exit SubIf 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 SubIf dic(ActiveSheet.CodeName) ActiveSheet.Name Then MsgBox "你无权修改工作表名称!" ActiveSheet.Name = dic(ActiveSheet.CodeName) End IfEnd SubPrivate Sub Workbook_Open() dic.Add "Sheet1", "Sheet1" dic.Add "Sheet2", "Sheet2" dic.Add "Sheet3", "Sheet3" Set app = ApplicationEnd Sub通过运行验证该方法很好地满足了本篇主旨的功能需求。此代码通过在工作簿模块编辑窗口顶层放置Public WithEvents app As Application语句中调出Application事件列表,使得我们可以像添加工作簿工作表事件一样手动选择添加内置的应用程序级事件。
通过应用程序级别的工作表选区改变事件和工作表解除激活事件,我们可以集中监控所有表。字典在工作簿打开时记载要禁止修改名称的工作表名称和代码名称(CodeName),工作表的代码名称为键,具有唯一性,工作表名称为值,用户可以随便修改。在上述事件中通过判断和对比触发事件时的表名称最终实现本篇的功能!
今天的分享就到这里,本篇中介绍的思路抛砖引玉,如果您有更多更好的思路欢迎分享!
欢迎转发收藏更多Excel VBA编程知识,请查阅职场高效达人必备的参考和学习工具《神奇的VBA》编程参考学习插件,内置嵌入Excel Ribbon界面,打开任意Excel工作簿就能随时查阅和学习Excel VBA编程知识的赋能工具。
vba 限制用户不能修改excel的内容
把不让修改的表“工具--保护--保护工作表”或“格式--工作表--隐藏”处理一下,估计可行。有段禁止修改excel表格内容的VBA源码,谁能帮忙改下
试试这样行不行空神竖。Public a, b, c, d
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
i = 0
ReDim a(Selection.Count)
For Each rngCell In Selection
a(i) = rngCell.Value
i = i 1
Next
b = ActiveCell.Row
c = ActiveCell.Column
d = 1
End Sub
Private Sub Worksheet_change(ByVal Target As Range)
If d = 1 Then
d = d 1
p = 0
If a(0) <> "" And a(0) <> Cells(b, c) Then
If InputBox("请输入修改密码:", "密码") = "a" Then
End
Else
MsgBox "密码错误"
If Selection.Count = 1 Then
Cells(b, c) = a(0)
Else
For Each rngCell In Selection
rngCell.Value = a(p)
p = p 1
Next
End If
End If
End If
End If
End Sub
你斗大瞎喊确定没有吗?为什么我测试了可以呢?