我一直在尝试寻找Excel的VBA代码的广泛研究,但是我敢肯定,这里的某人比我有答案更聪明!
我有一个非常长的代码,该代码正在为我公司中的某人自动化一个发票过程,并引用了6个不同的详细信息选项卡。有时,这些标签中的3个不存在,因为这些客户本周没有发动发票。
我想知道是否有一个代码会忽略这些工作表,如果它们不存在,我可以将其放置在代码的开头并将其应用于每次提及该名称时,而不是必须添加在我的4页代码中每次提及SheepName之前的代码。
您可以通过尝试引用该工作表是否首先存在:
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
最好的方法是以这样的方式构建代码,使您可以正确且轻松地检查对象的存在,然后根据适当的方式处理逻辑。考虑以下内容:
Sub Foo()
If Not Bar Is Nothing Then
Baz(Bar)
End If
End Sub
这是我最常见的方法(当然是简化的(,我在其中检查以确保对象的反面是什么,如果这样,它使用该对象。
如果您无法采用这种方法,那么更加乏味的方法当然是将每个参考都包含在If
块中。虽然乏味,但比使用On Error Resume Next
或On Error GoTo 0
更好。记住报价"慢速",这在编写代码时要记住很重要。现在,随着您的项目变得更加复杂,现在可以快速修复将不可避免地花费数小时的调试。最好不要过早养成坏习惯。