vba - 调用子过程的错误处理表单 - MS Access VBA
问题描述
- 是的,Access 已使用且无法更改。
- 我有一个表单类对象,比方说:
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
解决方案
这是一个小样本。
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
推荐阅读
- python - 通过 self 值更改 tkinter 中按钮的状态
- selenium - Selenium 通过 css 而不是 id 搜索元素
- javascript - Pdf.js viewer.html 不调用所有范围请求
- openshift - 在 openshift 上扩展的 Activemq 不起作用
- java - corda 备份节点数据并在本地与新建立的网络同步
- webpack - nuxt js供应商文件太大
- vba - 使用用户表单复选框控制内容控制复选框
- c# - 结帐期间在数据库中重复的记录
- arrays - 在 Invoke-AzureRmVMRunCommand 参数哈希表中传递数组不起作用
- datatable - 按数据查找 DataTable 单元格