在Excel中,有许多事件,通过VBA编程可以帮我们实现很多实用的功能。有些事件是工作表级别的,只对写代码的工作表有效;有些事件是工作簿级别的,在该文件中起全局的作用,对所有工作表有效。
而这些事件,往往是带参数的,通过合理的控制这些参数,可以开发出很多实用的功能。比如工作簿里的关闭事件:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
End Sub
当试图退出文件时,会触发该事件,而通过控制其中的“Cancel”参数,可以取消关闭文件的动作执行,即让“关闭”这个动作失效,文件不会被关闭。示例代码如下:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If MsgBox("真的要关闭文件了吗?", vbYesNo, "提醒") = vbNo Then
Cancel = True
End If
End Sub
运行效果如图所示:
点击“是”则退出文件,点击“否”则返回文件。
在VBE界面中,可以看到有许多工作表事件:
也有许多工作簿事件:
其中工作表里的删除事件:
Private Sub Worksheet_BeforeDelete()
End Sub
和工作簿里的删除事件:
Private Sub Workbook_SheetBeforeDelete(ByVal Sh As Object)
End Sub
都是在删除工作表时触发,工作表事件不带参数;工作簿事件带一个参数Sh,可返回即将删除的工作表名称。
它的作用是“通知”你“有事情要发生了”,而不是“征询”你“要不要让事情发生“!
这事件,说有用也有用,说没用也没用,活生生就是编程界的"马后炮"——等通知到你的时候,啥都晚了。相当于有人在你家门口喊一句"我要拆家了啊",然后根本不等你回应,直接就把房子推平了!哈哈,就问你一句“服不服”?
今天我们就来改造一下,让工作表的删除逻辑真正可控。实现逻辑:
1、给工作簿加结构保护,禁用原生的删除按钮(变成灰色不可点击);
2、在右键菜单中自定义一个的删除选项,接管删除动作;
3、在自定义的删除逻辑里,可以增加多层确认机制,甚至可以加数据校验、自动备份等等功能,防止误操作。
第一步:工作簿事件代码(ThisWorkbook模块)
Private Sub Workbook_Open() ' 启动时自动保护工作簿结构,禁用原生删除功能 ThisWorkbook.Protect Structure:=True, Password:="123" ' 添加自定义删除菜单 AddCustomDeleteMenuEnd SubPrivate Sub Workbook_BeforeClose(Cancel As Boolean) ' 关闭时清理自定义菜单,避免污染其他工作簿 RemoveCustomDeleteMenuEnd Sub
其中的Password:="123"设置工作簿保护密码,可以改成自己的。工作簿锁定以后,就不能新建和删除工作表了,从而起到保护的作用。
第二步:自定义删除菜单(标准模块)
' 添加自定义删除菜单Sub AddCustomDeleteMenu() On Error Resume Next Application.CommandBars("Ply").Controls("安全删除工作表").Delete On Error GoTo 0 Dim ctrl As CommandBarControl Set ctrl = Application.CommandBars("Ply").Controls.Add(Type:=msoControlButton, Before:=1) With ctrl .Caption = "安全删除工作表" .FaceId = 178 ' 删除图标 .OnAction = "CustomDeleteSheet" End WithEnd Sub' 清理自定义菜单Sub RemoveCustomDeleteMenu() On Error Resume Next Application.CommandBars("Ply").Controls("安全删除工作表").Delete On Error GoTo 0End Sub' 自定义删除逻辑Sub CustomDeleteSheet() Dim sh As Worksheet Set sh = ActiveSheet ' 第一层确认:基础提醒 If MsgBox("确定要删除工作表【" & sh.Name & "】吗?", vbYesNo + vbCritical, "删除确认") = vbNo Then MsgBox "已取消删除", vbInformation Exit Sub End If ' 第二层校验:关键表禁止删除(可自定义) If sh.Name = "总表" Or sh.Name = "配置页" Then MsgBox "该表为系统核心表,禁止删除!", vbExclamation Exit Sub End If ' 第三层:执行删除 Application.DisplayAlerts = False ThisWorkbook.Unprotect Password:="123" sh.Delete ThisWorkbook.Protect Structure:=True, Password:="123" Application.DisplayAlerts = True MsgBox "工作表已删除", vbInformationEnd Sub
✅ 改造后效果
✅ 原生删除按钮完全禁用,用户只能点击自定义的「安全删除工作表」选项;
✅ 支持多层确认、关键表拦截、删除前自动备份等自定义逻辑;
✅ 再也不会出现"提示有了,表却没了"的尴尬情况。
补充说明:
"Ply" 是 Excel VBA 中的固定内置标识符,专门用来指代“工作表标签右键菜单栏”。这个命名是 Excel 的历史遗留设计,Ply 是早期版本中对“工作表标签页”的旧称,一直沿用至今。
Excel 常见的内置命令栏标识,除了 "Ply",还有几个常用的固定命令栏ID,如下表所示:
如果需要查看所有内置命令栏的列表,可以在VBE执行这段代码,然后在立即窗口查看结果:
Sub LstCmdBar()Dim cmdBar As Object For Each cmdBar In Application.CommandBars Debug.Print cmdBar.Name NextEnd Sub
好了,关于删除工作表的那些事儿,就聊到这里吧。有兴趣的可以留言,咱们一起继续讨论!
1、分享:Excel/VBA 知识与实用技巧,赋能办公,高效从容。 2、提供:定制服务,表格设计、数据处理、可视化图表、VBA自动化编程等。 3、解决:重复劳动、数据杂乱、效率低下等办公痛点。有需要的,欢迎后台留言。