使用VBA代码操作工作表时,如果工作表并不存在,那么将产生运行时错误。为了避免这种异常的发生,使用代码操作任何表(不止局限于工作表,也适用于宏表和图表)之前应检测该工作表是否存在。在代码中这样用到此功能,那么将可以将此功能封装为一个自定义函数,在代码中可以很方便的调用函数。
方法1:遍历表对象
Function blnSheetExist1(ByVal strSheetName As String) As Boolean
Dim objSht
For Each objSht In ThisWorkbook.Sheets
If UCase$(objSht.Name) = UCase$(strSheetName) Then
blnSheetExist1 = True
Exit For
End If
Next
End Function
【代码解析】
第2行代码声明对象变量,由于该变量可能是工作表,也可以是宏表和图表,因此声明为变体变量。
第3~8行代码使用For ...Next
循环结构变量工作簿中的表对象,其中Sheets
是表对象的集合,包括工作表、宏表和图表。
第4行代码判断名称是否匹配。Excel工作表名称不区分大小写字符,也就是说在一个工作簿中不可能同时存在名称为“demo”和“DEMO”的工作表,所以此代码中使用UCase$
函数将名称转换为大写字符,然后进行比较。
如果名称一致,那么第5行代码将函数返回值设置为True
,第6行代码终止For ...Next
循环。
如果循环结束,仍未找到指定的工作表,那么函数返回值为False
。
方法2:利用错误捕获
如果工作簿中工作表较多,那么每次调用函数将循环多次,影响代码的整体效率。利用错误捕获方法,可以更简洁的实现相同的功能。
Function blnSheetExist2(ByVal strSheetName As String) As Boolean
On Error Resume Next
Debug.Print Sheets(strSheetName).Name
If Err.Number = 0 Then blnSheetExist2 = True
On Error GoTo 0
End Function
【代码解析】
第2行代码设置忽略运行时错误继续执行代码。
第3行代码在立即窗口中输出表名称,此代码并无实际意义,只是为了调用指定对象,进而使用错误捕获。
第4行代码用于判断是否已经发生了运行时错误。如果Err.Number = 0
,说明并未产生运行时错误,此时将函数返回值设置为True
,否则返回值为False
。
第5行代码恢复系统的错误处理机制。
无论工作簿中有多少个工作表,此方法的运行时间都是相同的,起运行效率更高。