我遇到了运行时错误
'-2147418105(800100007)':自动化错误调用的对象已与其客户端断开连接。
这是偶尔提出的。我无法将其与此错误的特定上下文联系起来。我唯一的线索是,在使用ADO代码之前我从未遇到过这个错误。已实施的模式多次使用。
我在Windows 7上使用Excel 2016 32位和vba代码。
Private mForm As frmCfgPrjctTm
Public Sub U_CfgPrjctTm_OnOpen()
If (mForm Is Nothing) Then
Call U_UnlockTeam
Set mForm = New frmCfgPrjctTm
End If
'>>>>>> the error occurs after this comment
mForm.Show vbModeless
End Sub
“关闭”表单的代码如下
Public Sub U_CfgPrjctTm_OnClose()
If (Not mForm Is Nothing) Then
mForm.Hide
Dim tmp As frmCfgPrjctTm
Set tmp = mForm
Set mForm = Nothing
Unload tmp
End If
End Sub
并在表单代码中(childCfgPrjctTmSettings和childCfgPrjctTmSettings在枚举中定义,以在关闭表单之前对用户操作进行操作)
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Call U_UnlockTeam
Select Case CloseMode
Case vbAppWindows, vbAppTaskManager
Call U_CfgPrjctTm_OnClose
Case vbFormControlMenu, vbFormCode
Call Save
Select Case mbOpenForm
Case childCfgPrjctTmSettings
' this opens another form
Call U_Sttngs_OnOpen(delUsr)
Case childCfgPrjctTmUsrId
' this opens another form
Call U_UsrLggd_OnOpen(dpyUsrLggdCfgPrjctTeam)
End Select
End Select
Cancel = False
End Sub
并在表单代码中
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
Call U_UnlockTeam
Select Case CloseMode
Case vbAppWindows, vbAppTaskManager
Call U_CfgPrjctTm_OnClose
Case vbFormControlMenu, vbFormCode
Call Save
Select Case mbOpenForm
Case childCfgPrjctTmSettings
Call U_Sttngs_OnOpen(delUsr)
Case childCfgPrjctTmUsrId
Call U_UsrLggd_OnOpen(dpyUsrLggdCfgPrjctTeam)
End Select
End Select
Cancel = False
结束子
创建表单后会出现此错误,并在此刻显示。调用U_UnlockTeam涉及一些内部调用的ADO代码,用于从数据库中检索数据。表单没有Activate事件处理程序。是否有人有同样的问题,你是如何应对的?
我能够重现错误。问题是您在表单内卸载表单。在模块中只使用一个空的userform和以下代码。运行代码并通过单击X关闭表单。表单后面应该没有代码!如果您第二次运行代码,您将收到提到的错误。
Option Explicit
Private mForm As UserForm1
Public Sub U_CfgPrjctTm_OnOpen()
If mForm Is Nothing Then
'Call U_UnlockTeam
Set mForm = New UserForm1
End If
'>>>>>> the error occurs after this comment
mForm.Show vbModeless
End Sub
行为的原因是类破坏了自身,mForm是一个模块范围的变量,它不知道第二次调用代码时它被破坏了。
解决方案是避免自毁类/用户形式或作为变通方法使Form成为局部变量。
这是一个更好的解释https://excelmacromastery.com/vba-user-forms-1/#Cancelling_the_UserForm