一、前言
本文写的是两个Excel常用的辅助VBA工具函数类,一是通过遍历Excel已有所有表名,判断是否存在指定名字的表格;二是如果不存在指定名字的表格,则新建该名字的表格,通常是后续写入数据。后面有些文章可能会直接使用这些函数,就不再重复写出来了。
注意:1.技术上没有什么难点。注意事项、写代码时思考的痕迹和说明都已经写在代码注释部分了,正文不再赘述。2.在Word等VBA环境下可能需要稍作调整才不会报错,比如有些Excel专有对象需要声明。参数里es本质是ExcelSheets对象,sh是ExcelSheet对象。表名为字符串类型,需要使用ByVal,否则函数内部如果有修改(比如转换大小写)会对传入的数据后续使用有影响。
二、判断Excel是否已存在指定名字的表格
'遍历Excel表格判断是否存在指定名称的表格。
Private Function IsExistSheetName(es As Variant, ByVal strSheetName As String) As Boolean
If (Len(strSheetName) = 0) Then
'注意:如不判断处理,可能导致后续代码死循环。
'处理方式是直接抛出错误,因为是程序级错误,需要程序员优化代码。
IsExistSheetName = False
'Excel自带错误异常提示说明:
'在重命名工作表时输入的名称无效?请尝试以下操作:
'· 确认输入的名称不多于31个字符?
'· 确认名称中不包含以下字符: : \ / ? * [ 或 ]。
'· 确认名称的第一个或者最后一个字符不能是单引号?
'· 确认工作表名称不为空?
Err.Raise Number:=(vbObjectError + 1000), Description:="用户错误Function IsExistSheetName:Sheet名为空字符串。请检查。"
Exit Function
End If
Dim isExist As Boolean
isExist = False
Dim sh As Variant
For Each sh In es
'注意:字符串比较前要全部转为相同大小写,否则表名有英文字符可能因为大小学不同不相等。
'或者换用不分大小写判断字符串是否相等的专用函数。
If (UCase(sh.Name) = UCase(strSheetName)) Then
isExist = True
Exit For
End If
Next
IsExistSheetName = isExist
End Function
三、新建指定名字的表格
'如果没有指定名字的表格,新建之。
Private Sub NewSheetIfNotExist(es As Variant, ByVal strSheetName As String)
If (IsExistSheetName(es, strSheetName) = False) Then
'es.Add after:=Excel.ActiveSheet '新增在当前表格后
es.Add After:=es(es.Count) '新增表格在最后
es(es.Count).Name = strSheetName
End If
'es(strSheetName).Select '切换到新建表格
'注意:如果不存在指定名字的表格,Worksheets("表名") Is Nothing直接引用会提示索引错误。
es(strSheetName).Cells.ClearContents '清空数据,和新表一样。注意,格式仍存在。
'无需返回值,后续获取表对象即可。
End Sub