首页 > 解决方案 > 调用子过程的错误处理表单 - MS Access VBA

问题描述

  1. 是的,Access 已使用且无法更改。
  2. 我有一个表单类对象,比方说:
Option Compare Database

Private Sub cmdCalculate_Click()

Dim Employee As String

    Employee = InputBox("Enter Name of Employee")
    
    If InStr(Employee, "Eka") > 0 Then
     Call Hello
    Else
     Call Hello2
    End If
    
End Sub

我有一个模块。如您所见,我从表单中调用每个过程。

Option Compare Database
Option Explicit

Public Sub Hello()
    
    MsgBox "Hello Eka"

End Sub

Public Sub Hello2()

    MsgBox "Hello stranger"

End Sub

我遇到的问题是错误处理实现,因为这里我们有我调用的后续过程。我尝试在On Error GoTo单个子过程中添加一个简单的 - 请参见下文,以显示一条好消息并中断整个脚本执行,但是是的,子过程将显示一条好消息,您单击“确定”将其关闭,然后主脚本继续跑步。请您指导我到一个来源,在那里我可以阅读有关潜在解决方案的更多信息或提供帮助吗?我发现了一些关于全局错误处理的东西,但不确定它是否相关。

Private Sub cmdCalculate_Click()
On Error GoTo errormessage

#TO-DO. VBA Code

Exit Sub

errormessage:
MsgBox "An error has occured. Please check your work."

End Sub

标签: vbams-access

解决方案


这是一个小样本。

  • MainProcedure电话SubProcedure1和这个电话SubProcedure2
  • 将有SubProcedure2除以零错误。
  • SubProcedure2处理此错误并将其重新引发到调用堆栈中的上层过程:SubProcedure1.
  • SubProcedure1也处理它并重新加注,现在到MainProcedure.
  • MainProcedure现在显示错误。如果您愿意,它现在可以停止执行。

备注1:不幸的是,VBA 没有您可以在运行时读取的调用堆栈信息。因此,在我的示例中,我总是将当前过程名称作为新行添加到source错误属性的顶部。所以最后你可以看到错误发生在哪里以及调用堆栈是如何的。但这只是一个例子。

备注 2:例如,如果您不会在错误中放置活动的错误处理程序,SubProcedure1则会自行冒泡到MainProcedure,但是您无法添加调用堆栈信息。

Public Sub MainProcedure()
    On Error GoTo Catch

    SubProcedure1

Finally:
    Exit Sub

Catch:
    MsgBox Err.Number & " : " & Err.Description & vbNewLine & vbNewLine & "- MainProcedure" & vbNewLine & Err.Source, vbCritical
    Resume Finally
End Sub

Public Sub SubProcedure1()
    On Error GoTo Catch

    SubProcedure2

Finally:
    Exit Sub

Catch:
    Err.Raise Err.Number, "- SubProcedure2" & vbNewLine & Err.Source, Err.Description
    Resume Finally
End Sub

Public Sub SubProcedure2()
    On Error GoTo Catch

    Dim value As Long
    value = 0

    Dim value2 As Long
    value2 = 1 / value

Finally:
    Exit Sub

Catch:
    Err.Raise Err.Number, "- SubProcedure2" & vbNewLine & Err.Source, Err.Description
    Resume Finally
End Sub

推荐阅读