testing工作表的存在,而不使用错误恢复下一步

在我的VBA我使用On Error Resume Next太多了。 这是一个懒惰的习惯。

如果表格尚未从工作簿中删除,则以下操作将autofit某些列 – 如果已经删除,则会引发错误,编译器将移至下一行代码。

我可以用其他方法来达到同样的效果吗?

 On Error Resume Next bkExampleWorkbook.Sheets("Foo").Columns("E:G").AutoFit bkExampleWorkbook.Sheets("Bar").Columns("K:M").AutoFit On Error GoTo 0 

假设您正在使用相同的图纸名称,只想调整它们的大小(如果它们存在),则可以使用函数来轻松查看它们是否存在并调整它们的大小:

基础

 Function AutoFitSheetRange(objWorkBook As Workbook, _ strSheetName As String, _ strSheetRange As String) As Boolean Dim sheet As Worksheet, boolSheetFound As Boolean For Each sheet In objWorkBook.Worksheets If sheet.Name Like strSheetName Then boolSheetFound = True Exit For End If Next If boolSheetFound Then objWorkBook.Sheets(strSheetName).Range(strSheetRange).AutoFit AutoFitSheetRange= True Else AutoFitSheetRange= False End If End Function 

使用它

然后,您可以以任何适合您的方式循环显示您的图纸,以调整特定范围的大小(并将其缩小为列):

 AutoFitSheetRange bkExampleWorkbook, "Foo", "E:G" AutoFitSheetRange bkExampleWorkbook, "Bar", "K:M" 

不要忘记添加error handling

你不想摆脱error handling,但你想要的function,以确保您仍然处理错误,但比On Error Resume Next更优雅,可能会导致不良结果:

 'Error Handled version Function AutoFitSheetRange(objWorkBook As Workbook, _ strSheetName As String, _ strSheetRange As String) As Boolean On Error Goto AutoFitSheetRangeError Dim sheet As Worksheet, boolSheetFound As Boolean For Each sheet In objWorkBook.Worksheets If sheet.Name Like strSheetName Then boolSheetFound = True Exit For End If Next If boolSheetFound Then 'Resize the range! objWorkBook.Sheets(strSheetName).Range(strSheetRange).AutoFit AutoFitSheetRange = True Else AutoFitSheetRange = False End If Exit Function ' No error hit so exit AutoFitSheetRangeError: AutoFitSheetRange = False Debug.Print Err.Message 'Print out the debug error End Function 

灵活的错误响应!

这使您可以灵活地查看是否重新调整了列的大小,而不pipe发生什么错误,从而使未来的决策更容易:

 If AutoFitSheetRange(bkExampleWorkbook, "Foo", "E:G") Then MsgBox "I couldn't resize Foo! Doing nothing." End If If AutoFitSheetRange(bkExampleWorkbook, "Bar", "K:M") Then 'Do something here End If 

我没有机会自己testing,但让我知道如何去。

编辑:

根据@brettdj的评论,我认为最好将检查表存在的function分开,使其更加简洁。 如果你想要做的只是检查工作表是否存在,那么这个function就足够了:

 'Error Handled version Function SheetExists(objWorkBook As Workbook, strSheetName As String) As Boolean On Error Goto SheetExistsError Dim sheet As Worksheet For Each sheet In objWorkBook.Worksheets If sheet.Name Like strSheetName Then SheetExists = True Exit Function End If Next SheetExistsError: SheetExists = False Debug.Print "Couldn't find sheet " & Err.Description 'Print out the debug error End Function