我一直在尝试为excel找到这个VBA代码进行一些非常广泛的研究,但我确信这里的人比我的答案更聪明!
我有一个非常长的代码,可以自动为我公司的某个人开具发票流程,并且它引用了6个不同的详细信息标签。 有时,其中3个选项卡不存在,因为这些客户端本周没有发票。
我想知道是否有一个代码会忽略那些工作表(如果它们不存在),我可以放在代码的开头并让它适用于每次提到名称,而不是必须添加在我的4页代码中每次提到工作表名称之前的代码。
答案 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 Next
或On Error GoTo 0
。请记住引用“慢是快”的引用,这在编写代码时很重要。随着项目变得更加复杂,现在可能快速修复的内容将不可避免地花费数小时的调试时间。最好不要过早养成坏习惯。