在不使用错误处理程序的情况下处理 Application.Workbooks 的错误

Posted

技术标签:

【中文标题】在不使用错误处理程序的情况下处理 Application.Workbooks 的错误【英文标题】:Handling erros for Application.Workbooks without using Error handlers 【发布时间】:2018-07-11 11:55:53 【问题描述】:

我正在尝试将打开的工作簿分配给工作簿对象。如果该工作簿尚未打开,则会引发错误。我正在使用错误处理程序处理错误。

这对我有用:

On Error GoTo OpenWorkbookError

Set Uwk = Application.Workbooks(WbkName)

OpenWorkbookError:
If Err <> 0 Then
  Err.Clear
  MsgBox ("Please Open the Required Workbook")
  Exit Sub
End If

但是有没有办法避免在这种情况下使用错误处理程序。

【问题讨论】:

谷歌怎么了? ***.com/questions/9373082/… @SJR 看到了那些确切的答案。但声明的函数使用错误处理程序。 那么我认为可以肯定地说,出于所有意图和目的,这是无法避免的情况之一。 我不会说这是不可能的 - 切换所有打开的工作簿并将名称与所需的名称匹配,应该在没有错误处理程序的情况下为我完成。但它会消耗时间,这就是为什么我还没有选择它。 那么您已经回答了自己的问题!严格来说,这不是一个 SO 问题,因为您的代码正在运行。 【参考方案1】:

一种方法是检查每个工作簿名称,但是@SJR 给出的链接中的函数有什么问题?

在您提供的代码中,您已将错误处理程序保留在代码主体中 - 它应该出现在过程末尾的 Exit SubEnd Sub 之间。

这样的事情可以在没有错误处理程序的情况下工作,但它需要检查每个工作簿,因此速度较慢:

Sub Test()

    Dim Uwk As Workbook
    Dim WbkName As String

    WbkName = "PERSONAL.XLSB"

    For Each Uwk In Workbooks
        If Uwk.Name = WbkName Then
            Exit For
        End If
    Next Uwk

    If Not Uwk Is Nothing Then
        MsgBox Uwk.Name & " found!"
    Else
        MsgBox "Not found."
    End If

End Sub

您的代码版本应该在主体之外有错误处理程序:

Sub Test1()

    Dim WbkName As String
    Dim UWk As Workbook

    WbkName = "PERSONAL1.XLSB"

    On Error GoTo OpenWorkbookError

    Set UWk = Workbooks(WbkName)

TidyExit:
    'Close anything that needs closing and Exit.

Exit Sub  '<< End of main body of procedure.

OpenWorkbookError:
    Select Case Err.Number
        Case 9 'Subscript out of range.
            MsgBox "Please open the required workbook."
            Resume TidyExit
        Case Else
            MsgBox "Error " & Err.Number & vbCr & _
                Err.Description, vbOKOnly + vbCritical
            Resume TidyExit
    End Select

End Sub  '<< End of procedure.

【讨论】:

以上是关于在不使用错误处理程序的情况下处理 Application.Workbooks 的错误的主要内容,如果未能解决你的问题,请参考以下文章

如何在不向用户显示堆栈跟踪的情况下处理 servlet 过滤器中的错误状态?

Perl:在不死的情况下捕获错误

在WCF中,自定义Authentication,Validate方法,抛出错误异常时如何在不停止服务的情况下处理异常?

如何在不使用处理程序的情况下使用 ajax 从客户端将文件发送到服务器端?

编写 Azure Devops / TFS API 脚本时 - 有没有办法在不退出的情况下处理“Get Repo 不存在”错误响应?

如何在不关闭应用程序的情况下处理异常? [关闭]