在工作表事件中是没有工作表删除事件的,为了防止用户误删除重要的工作表,除了使用保护工作簿方法外,还可以使用下面的代码。

#001 Public Ctl As CommandBarControl

#002 Sub DelSht()

#003 Set Ctl = Application.CommandBars.FindControl(ID:=847)

#004 Ctl.OnAction = "MyDelSht"

#005 End Sub

#006 Sub ResSht()

#007 Set Ctl = Application.CommandBars.FindControl(ID:=847)

#008 Ctl.OnAction = ""

#009 End Sub

#010 Sub MyDelSht()

#011 If VBA.UCase$(ActiveSheet.CodeName) = "SHEET2" Then

#012 MsgBox "禁止删除" & ActiveSheet.Name & "工作表!"

#013 Else

#014 ActiveSheet.Delete

#015 End If

#016 End Sub

代码解析:

DelSht过程将工作表标签右键菜单中的“删除工作表”菜单的OnAction属性设置为“MyDelSht”。

第3行代码使用Set语句将工作表标签右键菜单中的“删除工作表”菜单赋给变量Ctl,并将其OnAction属性设置为MyDelSht过程,该菜单被单击时将运行“MyDelSht”过程而不是系统默认的设置。OnAction属性返回或设置一个VBA的过程名,该过程在用户单击或更改某命令栏控件的值时运行。

ResSht过程将工作表标签右键菜单中的“删除工作表”菜单的OnAction属性恢复为默认设置。

MyDelSht过程判断所要删除的工作表的代码名称是否是“SHEET2”,如果是则禁止删除该表而只显示一个提示消息框。

为了不影响其他工作簿的使用,在VBE中双击ThisWorkbook写入下面的代码。

#001 Private Sub Workbook_Activate()

#002 Call DelSht

#003 End Sub

#004 Private Sub Workbook_Deactivate()

#005 Call ResSht

#006 End Sub

代码解析:

工作簿的Activate事件和Deactivate事件代码,在工作簿激活时运行DelSht过程,在关闭或打开其他工作簿时运行ResSht过程,这样只禁止删除本工作簿中“SHEET2”工作表,并不影响其他工作簿。

当删除本工作簿中的“SHEET2”工作表时,并不会显示如图 26‑1所示的消息框,而只会显示如图 26‑2所示的禁止删除工作表的消息框。

excelvba怎么删除重复的区域(ExcelVBA常见技巧22-禁止删除指定工作表)(1)

图 26‑1 删除工作表提示

excelvba怎么删除重复的区域(ExcelVBA常见技巧22-禁止删除指定工作表)(2)

图 26‑2 禁止删除工作表

,