UserForm中的VBA运行时/自动化错误

时间:2014-07-17 15:45:58

标签: excel-vba runtime-error userform vba excel

我正在尝试编写动态/条件用户表单,该用户表单根据输入到用户表单的某些输入字段的内容更改用户表单上的控件。我的VBA Excel项目的整个想法是采用2个数据系列(比如x和y)并根据用户查询的功能对它们进行操作。导致问题的用户形式的特定部分是用户可以选择他/她想要为变量(x或y)选择哪个类型的系列的部分。

为了让您尽快了解我的问题,我将excel文件上传到以下链接: http://www26.zippyshare.com/v/51719800/file.html 为了简单起见,我隔离了导致代码的问题,删除了所有其他宏,并将userform限制为导致错误的控件。要运行它,请单击位于第一个选项卡左上角的“初始化”按钮。

初始化时,userform包含6个控件:2个标签,2个组合框和2个框架。上传的测试文件的功能有限:对于两个系列(独立系列(或x)和从属系列(y)),当您单击“替换”时,应将多个控件添加到与该系列对应的框架中。

奇怪的是,这对第一个(/独立)系列没有问题,但对于第二个(/依赖)系列我得到了

  

运行时错误'-2147417848(80010108):自动化错误。物体   已调用已与其客户端断开连接。

即使两个实例都调用相同的过程,但在两个实例中,传递给函数的参数都是有效的。我也试过同事的笔记本电脑上的代码,但是得到了同样的错误。

导致错误的过程代码如下。该过程仅根据传递给函数的参数将控件添加到某个目标帧。导致崩溃的确切行是:

Set daFrame = dest.Controls.Add("Forms.Frame.1", name)

奇怪的是,只有在我们创建框架的情况下才会出现错误。添加所有其他控件,例如ListBoxes,Labels等(即使是第二个系列)也不是问题。

Public Sub add_control(dest As MSForms.Frame, ht As Integer, wdt As Integer, tp As Integer, lft As Integer, typ As String, _
    name As String, Optional capt As String)

Dim daFrame As MSForms.Frame
Dim daButton As MSForms.OptionButton
Dim daList As MSForms.ListBox
Dim daLabel As MSForms.Label
Dim daBox As MSForms.ComboBox

Select Case typ
    Case "Frame"
        Set daFrame = dest.Controls.Add("Forms.Frame.1", name)
        With daFrame
            .Height = ht
            .Width = wdt
            .Top = tp
            .Left = lft
            .Caption = capt
        End With
    Case "ListBox"
        Set daList = dest.Controls.Add("Forms.Listbox.1", name)
        With daList
            .Height = ht
            .Width = wdt
            .Top = tp
            .Left = lft
        End With
    Case "OptionButton"
        Set daButton = dest.Controls.Add("Forms.OptionButton.1", name)
        With daButton
            .Height = ht
            .Width = wdt
            .Top = tp
            .Left = lft
            .Caption = capt
        End With
    Case "Label"
        Set daLabel = dest.Controls.Add("Forms.Label.1", name)
        With daLabel
            .Height = ht
            .Width = wdt
            .Top = tp
            .Left = lft
            .Caption = capt
        End With
    Case "ComboBox"
        Set daBox = dest.Controls.Add("Forms.ComboBox.1", name)
        With daBox
            .Height = ht
            .Width = wdt
            .Top = tp
            .Left = lft
        End With
End Select

End Sub

请帮助我们,我真的很感激任何意见。此外,如果有一种方式/编程风格来防范这种奇怪的行为/错误,请告诉我。当然,我搜索了这个论坛并谷歌搜索任何提示,但似乎这个问题是特定于代码的。无论如何,我在网上找不到任何有用的东西。

干杯

1 个答案:

答案 0 :(得分:0)

我还没弄清楚究竟是什么原因,但不是代码 - 真正的问题必须在DepFrame中。如果你只是删除它并复制和重命名IndFrame一切正常。但是你可能已经想到了 - 我也想告诉你在Dependent_change子中你有一个错误。您在最后一个ElseIf中使用Independent而不是Dependent的值。

    Private Sub Dependent_Change()

    If Dependent.Value = "Replacement" Then
        DepFrame.Caption = "Replacement"
        Call rearrange_frame("Replacement2")
    ElseIf Dependent.Value = "Futures" Then
        DepFrame.Caption = "Futures"
        Call rearrange_frame("Futures2")

here: ElseIf Independent.Value = "Spread" Then

        DepFrame.Caption = "Spread"
        src = 2
    End If

    End Sub