VBA在提及工作表时如果不存在则忽略

时间:2017-06-27 14:14:00

标签: excel vba excel-vba ignore not-exists

我一直在尝试为excel找到这个VBA代码进行一些非常广泛的研究,但我确信这里的人比我的答案更聪明!

我有一个非常长的代码,可以自动为我公司的某个人开具发票流程,并且它引用了6个不同的详细信息标签。 有时,其中3个选项卡不存在,因为这些客户端本周没有发票。

我想知道是否有一个代码会忽略那些工作表(如果它们不存在),我可以放在代码的开头并让它适用于每次提到名称,而不是必须添加在我的4页代码中每次提到工作表名称之前的代码。

2 个答案:

答案 0 :(得分:3)

您可以通过尝试引用它来检查工作表是否存在:

Sub Test()

    If WorkSheetExists("Sheet1") Then
        'do stuff
    End If

End Sub

Public Function WorkSheetExists(SheetName As String, Optional WrkBk As Workbook) As Boolean
    Dim wrkSht As Worksheet

    If WrkBk Is Nothing Then
        Set WrkBk = ThisWorkbook
    End If

    On Error Resume Next
        Set wrkSht = WrkBk.Worksheets(SheetName)
        WorkSheetExists = (Err.Number = 0)
        Set wrkSht = Nothing
    On Error GoTo 0
End Function  

另一种编写代码的方法,考虑到@Brandon发布的内容:

Sub Test()

    Dim wrkSht As Worksheet

    If WorkSheetExists("Sheet2") Then
        Set wrkSht = ThisWorkbook.Worksheets("Sheet2")
    End If

    If Not wrkSht Is Nothing Then
        'Do Stuff
    End If

End Sub

答案 1 :(得分:0)

最好的方法是以这样一种方式构建代码,使其能够正确,轻松地检查对象是否存在,然后根据需要处理逻辑。请考虑以下事项:

Sub Foo()
    If Not Bar Is Nothing Then
        Baz(Bar)
    End If
End Sub

这是我最常用的方法(当然简化),我检查以确保对象的反转是什么,如果是,那么它使用该对象。

如果你不能采用这种方法,那么更繁琐的方法当然是将每个引用包装在If块中。虽然单调乏味,但优于使用On Error Resume NextOn Error GoTo 0。请记住引用“慢是快”的引用,这在编写代码时很重要。随着项目变得更加复杂,现在可能快速修复的内容将不可避免地花费数小时的调试时间。最好不要过早养成坏习惯。