|
本帖最后由 抬头苦干 于 2017-5-1 09:58 编辑
学习了,涨知识啊。顺便对各位的跟帖做个小结。
【问题】判定某工作表(如工作表“SheetX”)是否存在。
【尝试】用 Is Nothing 判定,报运行时错误,提示下标越界:
- Sub IsNothingFail()
- Rem 不可用 Is Nothing 直接判定,否则报下标越界错误
- If Worksheets("SheetX") Is Nothing Then
- MsgBox "工作表 'SheetX' 不存在", vbCritical
- Else
- MsgBox "工作表 'SheetX' 已存在", vbInformation
- End If
- End Sub
复制代码
【报错截图】
【四种解法】
根据讨论情况,目前该问题至少有四种解法:
【解法一】For-Each 遍历- Sub ForEach_Traverse()
- Rem 这是最基本的思路,遍历各表名称,逐一判定
- Dim ws As Worksheet, existed As Boolean
- existed = False
- For Each ws In Worksheets
- If ws.Name = "SheetX" Then existed = True: Exit For
- Next
- If existed Then
- MsgBox "工作表 'SheetX' 已存在", vbInformation
- Else
- MsgBox "工作表 'SheetX' 不存在", vbCritical
- End If
- End Sub
复制代码
【解法二】On Error 捕获错误
- Sub OnError()
- Rem 根据 livewire、livewire、静静心、indexlee 代码整理
- On Error Resume Next
- If Worksheets("SheetX") Is Nothing Then:
- If Err Then
- MsgBox "工作表 'SheetX' 不存在", vbCritical
- Err.Clear
- Else
- MsgBox "工作表 'SheetX' 已存在", vbInformation
- End If
- On Error GoTo 0
- End Sub
复制代码
【解法三】自定义函数辅助判定
- Sub DIY_Function()
- Rem 根据 白色GG 代码整理
- If ExistSheet("SheetX") Then
- MsgBox "工作表 'SheetX' 已存在", vbInformation
- Else
- MsgBox "工作表 'SheetX' 不存在", vbCritical
- End If
- End Sub
- Function ExistSheet(Optional ByVal sheetName As String = "SheetX") As Boolean
- Dim sh As Worksheet
- On Error GoTo Err_Handle
- Set sh = Worksheets(sheetName)
- ExistSheet = IIf(sh Is Nothing, False, True)
- Set sh = Nothing
- Exit Function
- Err_Handle:
- ExistSheet = False
- End Function
复制代码
【解法四】TypeName + Evaluate 判定(强烈推荐)
- Sub TypeName_Evaluate()
- Rem 根据 yaozong 代码整理(强烈推荐)
- If TypeName([SheetX]) = "Worksheet" Then
- MsgBox "工作表 'SheetX' 已存在", vbInformation
- Else
- MsgBox "工作表 'SheetX' 不存在", vbCritical
- End If
- End Sub
复制代码
|
评分
-
2
查看全部评分
-
|