改造Excel里2个中看不中用的马后炮事件——自定义删除工作表(可取消删除)
- 2026-11-07 15:23:41

在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 NextApplication.CommandBars("Ply").Controls("安全删除工作表").DeleteOn Error GoTo 0Dim ctrl As CommandBarControlSet 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 NextApplication.CommandBars("Ply").Controls("安全删除工作表").DeleteOn Error GoTo 0End Sub' 自定义删除逻辑Sub CustomDeleteSheet()Dim sh As WorksheetSet sh = ActiveSheet' 第一层确认:基础提醒If MsgBox("确定要删除工作表【" & sh.Name & "】吗?", vbYesNo + vbCritical, "删除确认") = vbNo ThenMsgBox "已取消删除", vbInformationExit SubEnd If' 第二层校验:关键表禁止删除(可自定义)If sh.Name = "总表" Or sh.Name = "配置页" ThenMsgBox "该表为系统核心表,禁止删除!", vbExclamationExit SubEnd If' 第三层:执行删除Application.DisplayAlerts = FalseThisWorkbook.Unprotect Password:="123"sh.DeleteThisWorkbook.Protect Structure:=True, Password:="123"Application.DisplayAlerts = TrueMsgBox "工作表已删除", vbInformationEnd Sub
✅ 改造后效果
✅ 原生删除按钮完全禁用,用户只能点击自定义的「安全删除工作表」选项;
✅ 支持多层确认、关键表拦截、删除前自动备份等自定义逻辑;
✅ 再也不会出现"提示有了,表却没了"的尴尬情况。




补充说明:
"Ply" 是 Excel VBA 中的固定内置标识符,专门用来指代“工作表标签右键菜单栏”。这个命名是 Excel 的历史遗留设计,Ply 是早期版本中对“工作表标签页”的旧称,一直沿用至今。
Excel 常见的内置命令栏标识,除了 "Ply",还有几个常用的固定命令栏ID,如下表所示:
如果需要查看所有内置命令栏的列表,可以在VBE执行这段代码,然后在立即窗口查看结果:
Sub LstCmdBar()Dim cmdBar As ObjectFor Each cmdBar In Application.CommandBarsDebug.Print cmdBar.NameNextEnd Sub
好了,关于删除工作表的那些事儿,就聊到这里吧。有兴趣的可以留言,咱们一起继续讨论!

