VBA Excel 运行-时间错误 自动化错误

VBA Excel Run-time error Automation error

我有一个 运行 时间错误

'-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

"close"表格的代码如下

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 事件处理程序。 有没有人遇到同样的问题,你是怎么处理的?

我能够重现错误。问题是您在表单内卸载表单。仅采用一个空的用户表单和模块中的以下代码。 运行 代码并单击 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

行为的原因是 class 销毁了自身,而 mForm 是一个模块范围的变量,它不知道它在第二次调用代码时被销毁了。

解决方案是避免 self-destroing class/userform 或作为解决方法使 mForm 成为局部变量。

这里有更好的解释 https://excelmacromastery.com/vba-user-forms-1/#Cancelling_the_UserForm