前言
删除工作表是VBA代码开发过程中经常用到的操作,一行代码就可以完成,这有啥可讲的呢!?代码一执行,是否就看到下面这个令人烦的窗口跳出来了。
此时,你就不得不点击【删除】按钮确认才可以删除工作表,如果要批量删除多个工作表,那么就需要不停的点击按钮,VBA代码实现自动化操作的目的就无法实现。
解决方案
Excel为了避免用户的误操作,每次删除工作表都会给出提示信息,用户确认后才会执行删除操作,这个机制是Excel的安全机制,无法取消。但是可以利用系统设置屏蔽这个提示信息,以实现无人干预的自动化操作。为了方便调用,将代码封装成独立的过程。
Sub DelSheets(vShtName, Optional sWkName As String)
Dim sName
With Application
.DisplayAlerts = False
On Error Resume Next
If Len(sWkName) > 0 Then
Set objWk = ActiveWorkbook
Else
Set objWk = Workbooks(sWkName)
End If
If VBA.IsArray(vShtName) Then
For Each sName In vShtName
objWk.Sheets(sName).Delete
Next
Else
objWk.Sheets(sShtName).Delete
End If
On Error GoTo 0
.DisplayAlerts = True
End With
End Sub
DelSheets过程有两个参数:
- vShtName是必选参数,用于指定需要删除的工作表名称, 可以单个工作表,也可以是多个工作表名称组成的数组。
- sWkName是可选参数,用于指定工作表所隶属的工作簿。
调用代码如下:
'删除单个工作表
Call DelSheets("Sheet1")
'删除多个工作表
Call DelSheets(Array("Sheet1","Sheet3","Sheet3"))
代码解析
此过程的核心代码如下:
Application.DisplayAlerts = False
On Error Resume Next
第一行代码禁止显示系统告警信息,删除工作表时就不会出现提示对话框,在过程结束前,需要回复系统设置Application.DisplayAlerts = True
。
第二行代码忽略系统错误,也就是忽略删除工作表可能产生的异常错误,在过程结束前,需要回复系统设置On Error GoTo 0
。
VBA.IsArray(vShtName)
用于判定参数vShtName是否是数组。
- 如果vShtName是数组,则返回值为True,属于批量删除工作表。
For Each sName In vShtName
遍历数组中的元素(工作表名称),然后逐个删除。 - 如果vShtName不是数组,那么就是单个工作表名称,可以直接进行删除操作。