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

问题描述 投票:0回答:1

我遇到了运行时错误

'-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事件处理程序。是否有人有同样的问题,你是如何应对的?

sql-server excel-vba ado vba excel
1个回答
1
投票

我能够重现错误。问题是您在表单内卸载表单。在模块中只使用一个空的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

© www.soinside.com 2019 - 2024. All rights reserved.