【问题标题】:Test for existence of Worksheet without using On Error Resume Next在不使用 On Error Resume Next 的情况下测试 Worksheet 是否存在
【发布时间】:2013-03-18 21:49:46
【问题描述】:

我在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

【问题讨论】:

  • 我喜欢你的想法,我会坚持下去。如果有任何原因您必须更改它,我可能会使用for 循环来检查每个现有的工作表名称。如果工作表的名称匹配,则将删除相应的列。我不提供代码,因为我认为它不是很有效。
  • 我同意 Kee Jaw 的观点。这个错误处理代码接近于运行它的标准方式。设置Set ws = sheets("Foo") 对象然后测试If Not Ws is Nothing Then ws.Columns("E:G").AutoFit 等更整洁。
  • @brettdj ..._standards_ 在 Excel-VBA 中!!我将使用您的更整洁的方法进行探索。
  • Excel VBA If WorkSheet("wsName") Exists 的副本。请参阅 Tim William 的回答。
  • @brettdj ...我最终使用了一个循环以避免测试错误:因此不需要对现有答案的引用

标签: excel vba


【解决方案1】:

假设您正在使用相同的工作表名称并且只想在它们存在时调整它们的大小,您可以从一个函数开始,以便轻松查看它们是否存在并在它们存在时调整它们的大小:

基础知识

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"

别忘了添加错误处理

您不想摆脱错误处理,但希望该函数确保您仍然处理错误,但比 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

灵活的错误响应!

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

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

我还没有机会亲自测试,但请告诉我它是怎么回事。

编辑:

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

'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

【讨论】:

  • 这是一个很长的测试存在的方法。
  • @brettdj,唯一实际测试存在性的部分是If sheet.Name Like strSheetName Then boolSheetFound = True Exit For End If 我只是喜欢正确封装事物并注意留下不完整的代码/逻辑。
  • @blue 如果没有找到匹配项,您将遍历每个工作表 - 不必要的循环是一条很长的路要走。
  • @brettdj 我理解不要不必要地循环的理想,但是如果您需要确保某些东西存在或不存在并且不希望忽略可能发生的每个错误,那么它就不是不必要的循环。这可能是一个漫长的路由方式,但它是一种允许正确错误处理的安全方式。使用On Error Resume Next 将不允许您这样做。我将用一个可以忽略不计的效率差异换取任何一天捕获错误的能力。
  • @whytheq 我刚刚在一个包含 150 张工作表和 1000x1000 个字符串数据单元格的工作簿上对其进行了测试。一次使用“Sheet75”,另一次使用“WhiteTolietSheetPaper”。两者都在 1 毫秒内返回。在 50 个工作表上使用它绝对没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 2011-01-13
相关资源
最近更新 更多