Ошибка «Требуется объект» при ссылке на динамически созданные элементы управления, хранящиеся в коллекции, в классе другого динамически созданного элемента управления

Я использую кнопку прокрутки для циклического переключения дат фазы. Когда я вызываю элемент из коллекции customtextboxcollection со значением его индекса, я получаю сообщение об ошибке «Требуется объект». И кнопка прокрутки, и текстовое поле, значение которого изменяется, представляют собой динамически создаваемые элементы управления, отображаемые в пользовательской форме с именем UserForm1.

Подпрограмма для создания элементов в коллекции 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

Почему эта ссылка вызывает ошибку? Как правильно на него ссылаться?


person VivaLaTexas    schedule 21.07.2014    source источник
comment
Вместо использования двух отдельных коллекций и двух разных классов вы можете создать один класс, который будет обрабатывать каждую пару элементов управления (один счетчик и одно текстовое поле). Это было бы проще обрабатывать с точки зрения перехвата событий между каждой парой.   -  person Tim Williams    schedule 21.07.2014
comment
Спасибо за ответ, Тим. Не могли бы вы сослаться на ресурс, который мог бы помочь мне ориентироваться в этом процессе? Я изменил оба элемента управления на один и тот же класс, но все равно получаю ту же ошибку. Еще раз спасибо за ваше время.   -  person VivaLaTexas    schedule 21.07.2014


Ответы (1)


Это не ответ на ваш реальный вопрос, а предложение альтернативного подхода, которым может быть легче управлять.

Вместо использования двух отдельных коллекций и двух разных классов вы можете создать один класс, который будет обрабатывать каждую пару элементов управления (один счетчик и одно текстовое поле). Это было бы проще обрабатывать с точки зрения перехвата событий между каждой парой.

клсспинтекст:

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 на пару и сохраните эти экземпляры в одной коллекции.

person Tim Williams    schedule 21.07.2014