Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在VBA中检测COM类方法是否失败_Vba_Ms Access_Dll_Error Handling_Com - Fatal编程技术网

如何在VBA中检测COM类方法是否失败

如何在VBA中检测COM类方法是否失败,vba,ms-access,dll,error-handling,com,Vba,Ms Access,Dll,Error Handling,Com,所以我在VBA中有一段代码,它使用第三方COM类将记录添加到数据库中 Function AddPatientToDolphin(ID As String, LastName As String, FirstName As String) On Error GoTo CatchError Dim Plst As DOLDBSVRLib.DolphinPatients Dim Patient As DOLDBSVRLib.DolphinPatient Set Plst = New DOLDBSVRL

所以我在VBA中有一段代码,它使用第三方COM类将记录添加到数据库中

Function AddPatientToDolphin(ID As String, LastName As String, FirstName As String)
On Error GoTo CatchError
Dim Plst As DOLDBSVRLib.DolphinPatients
Dim Patient As DOLDBSVRLib.DolphinPatient
Set Plst = New DOLDBSVRLib.DolphinPatients
Set Patient = New DOLDBSVRLib.DolphinPatient
Patient.patientID = ID
Patient.LastName = LastName
Patient.FirstName = FirstName
Plst.AddPatient Patient
Set Plst = Nothing
Set Patient = Nothing
NormalExit:
   Exit Function
CatchError:
   MsgBox (Err.Description )
   GoTo NormalExit
End Function
代码很好,工作正常,除非数据库中已经存在ID,否则不会添加记录,但不会引发错误

在第三方dll的文档中,有关于此方法的说明

HRESULT AddPatient(新患者) 添加由提交的患者对象表示的患者

经过一些研究,我了解到COM类中的每个方法都返回一个名为Hresult的值。当一切正常运行时,该值应为0,否则不应为0。我的问题是如何在VBA中提取并测试该值

HRESULT AddPatient(LPDISPATCH newPatient) 
此函数被声明为在VBA中没有返回代码。如果返回代码是HRESULT错误代码,VBA会将其转换为异常并将代码设置为Err对象

如果函数反应正常并返回,并且没有显示任何故障,那么唯一的方法就是检查ID是否存在。但这是一个比赛条件。另一个用户可以执行相同的代码

如果这种接口以这种方式运行,那么就没有真正的答案

或者联系负责此COM接口的人员

此函数被声明为在VBA中没有返回代码。如果返回代码是HRESULT错误代码,VBA会将其转换为异常并将代码设置为Err对象

如果函数反应正常并返回,并且没有显示任何故障,那么唯一的方法就是检查ID是否存在。但这是一个比赛条件。另一个用户可以执行相同的代码

如果这种接口以这种方式运行,那么就没有真正的答案


或者联系负责此COM接口的人员。

您必须检查外部函数的返回值。要在变量中捕获它,请执行以下操作:

Dim RetVal As Long
RetVal = Plst.AddPatient(Patient)
然后,比较
0
,最终显示一条错误消息:

If RetVal <> 0 Then
    MsgBox "Something went wrong"
End If
如果返回0,则
MsgBox“出了点问题”
如果结束
添加:

好的,在这种情况下不允许作为函数调用,因此请尝试以下操作:

Plst.AddPatient Patient

If Err.LastDLLError <> 0 Then
    MsgBox "Something went wrong"
End If
Plst.AddPatient
如果Err.LastDLLError为0,则
MsgBox“出了点问题”
如果结束

您必须检查外部函数的返回值。要在变量中捕获它,请执行以下操作:

Dim RetVal As Long
RetVal = Plst.AddPatient(Patient)
然后,比较
0
,最终显示一条错误消息:

If RetVal <> 0 Then
    MsgBox "Something went wrong"
End If
如果返回0,则
MsgBox“出了点问题”
如果结束
添加:

好的,在这种情况下不允许作为函数调用,因此请尝试以下操作:

Plst.AddPatient Patient

If Err.LastDLLError <> 0 Then
    MsgBox "Something went wrong"
End If
Plst.AddPatient
如果Err.LastDLLError为0,则
MsgBox“出了点问题”
如果结束

ReturnCode=Plst.AddPatient(Patient)ReturnCode=Plst.AddPatient(Patient)ReturnCode=Plst.AddPatient(Patient)。当我使用带括号的方法Plst.AddPatient(Patient)时,我在运行函数“运行时错误438,对象不支持此属性或方法”时出错当我使用不带括号的方法Plst.AddPatient Patient时,它可以工作,但VBA编辑器不允许我将其分配给变量,并抛出CompileWe错误语法错误!检查Plst.Hresult怎么样?(添加后请检查值)。此操作无效。当我使用带括号的方法Plst.AddPatient(Patient)时,我在运行函数“运行时错误438,对象不支持此属性或方法”时出错当我使用不带括号的方法Plst.AddPatient Patient时,它可以工作,但VBA编辑器不允许我将其分配给变量,并抛出CompileWe错误语法错误!检查Plst.Hresult怎么样?(添加后检查值)。我认为您是对的,事实上,在进一步研究后,我发现DolphinPatients对象有一个名为status long status的属性,其中包含上次操作的执行状态。如果为零(0),则未检测到错误。我可以使用该属性测试是否成功添加患者。但是你能告诉我这是VBA中的一个限制吗?或者如果其他语言也不可能,为什么我不能使用带括号的方法Plst.AddPatient(Patient),这对我来说很奇怪,非常感谢你的帮助。不。这不受COM或VBA的限制。可以构造也返回Add函数结果的接口。在我看来,这是界面设计中的一个错误。所以我的建议是联系程序员。在这种情况下,当函数未能“添加”“我将始终返回HRESULT错误。或者我的Add函数会返回一个关于操作结果的附加返回值。我想你是对的,事实上,在进一步研究之后,我发现DolphinPatients对象有一个名为status long status的属性,其中包含最后一次操作的执行状态。如果为零(0),则未检测到错误。我可以使用该属性测试是否成功添加患者。但是你能告诉我这是VBA中的一个限制吗?或者如果其他语言也不可能,为什么我不能使用带括号的方法Plst.AddPatient(Patient),这对我来说很奇怪,非常感谢你的帮助。不。这不受COM或VBA的限制。可以构造也返回Add函数结果的接口。在我看来,这是界面设计中的一个错误。所以我的建议是联系程序员。在这种情况下,当函数未能“添加”时,我将始终返回HRESULT错误。或者,我的添加函数将返回有关操作结果的附加返回值。