代码之家  ›  专栏  ›  技术社区  ›  VivaLaTexas

引用另一个动态创建控件的类中存储在集合中的动态创建控件时出现“Object Required”错误

  •  0
  • VivaLaTexas  · 技术社区  · 10 年前

    我使用一个旋转按钮来循环显示某个阶段的日期。当我用索引值从名为customtextboxcollection的集合中调用一个项时,我得到一个“Object Required”错误。数值更改的数字调整按钮和文本框都是动态创建的控件,显示在名为UserForm1的UserForm上。

    在单击数字调整按钮之前,在customtextbox集合中创建项目的子项将运行:

    Dim customtextboxcollection As Collection
    Dim spinbuttoncollection As Collection
    
    
    Public Sub ComboBox1_Click() 'When a person is selected to enter hours for an employee from a combobox, it triggers the creation of the controls
    
    Sheet1.Activate
    CommandButton1.Enabled = True 'Enable the OK and Apply buttons when personnel title is selected.
    UserForm1.Label2.Visible = True
    UserForm1.ratebox.Visible = True
    QuantityLabel.Visible = True
    quantitybox.Visible = True
    
    'The variables below are to access the table where I store saved information regarding the project phases I will add hours to.
    
    Dim counter As Integer
    counter = 6 'The index of the first row for phases
    Dim phasecolumn As Integer
    phasecolumn = 3 'The index of the column containing the phases
    Dim checkboxnumber As Integer
    checkboxnumber = 1 'This is the number needed to distinguish between the checkboxes that appear/disappear.
    phasestartcolumn = 4
    phaseendcolumn = 5
    Dim customtextboxHandler As cCustomTextBoxHandler
    Set customtextboxcollection = New Collection 'Sets the previously created collection
    
    Dim spinbuttonHandler As cSpinButtonHandler 'This is my spin button handler class
    Set spinbuttoncollection = New Collection 'Sets the previously created collection
    
    
    'This Do-Loop locates a row on the table with saved information
    Do
        If (Sheet3.Cells(savedpersonnelrow, savedpersonnelcolumn) = ComboBox1.Value) Then
            storagerow = savedpersonnelrow
            lastcomboboxvalue = ComboBox1.Value
            Exit Do
        End If
    
        savedpersonnelrow = savedpersonnelrow + 1
    
    Loop Until (savedpersonnelrow = 82)
    
    Sheet1.Activate
    
    'These sections create the controls depending on the number of phases saved.
    
    Set spin = UserForm1.Controls.Add("Forms.SpinButton.1")
    
            With spin
                .name = "SpinButton" & checkboxnumber
                .Left = 365
                .Top = topvalue + 6
                .Height = 15
                .Width = 40
                '.Value = Sheet3.Cells(storagerow, savedphasecolumn + checkboxnumber)
                'Sheet1.Activate
    
    
                Dim phasestart As Date
                phasestart = Sheet1.Cells(counter, phasestartcolumn).Value
                Dim phaseend As Date
                phaseend = Sheet1.Cells(counter, phaseendcolumn).Value
    
                spin.Min = phasestart
                spin.Max = phaseend
                spin.Orientation = fmOrientationVertical
    
                'Do
    
                    '.AddItem Format(phasestart, "mmm-yy")
                    'phasestart = DateAdd("m", 1, phasestart)
    
                'Loop Until (Month(phaseend) = Month(phasestart) And Year(phaseend) = Year(phasestart))
    
                Set spinbuttonHandler = New cSpinButtonHandler
                Set spinbuttonHandler.spin = spin
                spinbuttoncollection.Add spinbuttonHandler
    
            End With
    
    
    
    Set ctext = UserForm1.Controls.Add("Forms.TextBox.1")
    
            With ctext
                .name = "CustomTextbox" & checkboxnumber
                .Left = 470
                .Top = topvalue + 6
                .Height = 15
                .Width = 40
                .Value = phasestart
    
                Set customtextboxHandler = New cCustomTextBoxHandler
                Set customtextboxHandler.ctext = ctext
                customtextboxcollection.Add customtextboxHandler
    
            End With
    
    topvalue = topvalue + 15
    counter = counter + 1
    checkboxnumber = checkboxnumber + 1
    
    Loop Until counter = 14
    
    End Sub
    

    在我的名为cSpinButtonHandler的类中,我引用了与它对应的旋转按钮关联的这些customtextboxcollection对象:

    Public WithEvents spin As MSForms.SpinButton
    
    
    Private Sub spin_Click()
    
    UserForm1.CommandButton3.Enabled = True
    
    
    End Sub
    
    Private Sub spin_SpinDown()
    
    x = 0
    
    Do
        x = x + 1
    
    Loop Until spin.name = "SpinButton" & x
    
    Dim spindate As Date
    spindate = customtextboxcollection.Item(x).ctext.Value 'The error occurs here.
    
    customtextboxcollection.Item(x).ctext.Value = DateAdd("m", -1, spindate)
    
    End Sub
    

    为什么此引用会生成错误?引用它的正确方式是什么?

    1 回复  |  直到 10 年前
        1
  •  0
  •   Tim Williams    10 年前

    这不是对你真实问题的回答,而是对一种可能更容易管理的替代方法的建议。

    您可以创建一个单独的类来处理每对控件(一个旋转和一个文本框),而不是使用两个单独的集合和两个不同的类。这将更容易处理每对之间的挂钩事件。

    clsSpin文本:

    Option Explicit
    
    Public WithEvents txtbox As MSForms.TextBox
    Public WithEvents spinbutn As MSForms.SpinButton
    
    
    Private Sub spinbutn_Change()
        'here you can refer directly to "txtbox"
    End Sub
    
    Private Sub txtbox_Change()
        'here you can refer directly to "spinbutn"
    End Sub
    

    添加控件时,创建 clsSpinText 并将这些实例保存在单个集合中。