![VBA — Динамически созданный выпадающий список работает на одной форме, но не работает на другой, проблема с модулем класса?](https://rvso.com/image/1628789/VBA%20%E2%80%94%20%D0%94%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B8%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D0%B9%20%D0%B2%D1%8B%D0%BF%D0%B0%D0%B4%D0%B0%D1%8E%D1%89%D0%B8%D0%B9%20%D1%81%D0%BF%D0%B8%D1%81%D0%BE%D0%BA%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82%20%D0%BD%D0%B0%20%D0%BE%D0%B4%D0%BD%D0%BE%D0%B9%20%D1%84%D0%BE%D1%80%D0%BC%D0%B5%2C%20%D0%BD%D0%BE%20%D0%BD%D0%B5%20%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0%D0%B5%D1%82%20%D0%BD%D0%B0%20%D0%B4%D1%80%D1%83%D0%B3%D0%BE%D0%B9%2C%20%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0%20%D1%81%20%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D0%B5%D0%BC%20%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0%3F.png)
Здравствуйте и спасибо за прочтение: Это перекрестный пост из OZGRID:https://www.ozgrid.com/forum/index.php?thread/1227932-dynamic-created-combo-box-working-on-one-form-but-not-other-class-module-issue/ Пока мне там не повезло, обновлю, как только проблема решится здесь или там.
У меня есть две формы с динамически созданными выпадающими списками, пытающиеся ссылаться на один и тот же модуль класса.
Первый вариант работает так, как и ожидалось, и я не вижу проблем с моим кодом в новой форме.
Код модуля класса находится здесь:
Option Explicit
Private WithEvents m_ComboBoxEvents As MSForms.ComboBox
Public Property Set Box(RHS As MSForms.ComboBox)
Set m_ComboBoxEvents = RHS
End Property
Private Sub m_ComboBoxEvents_Change()
If REACTIONS.Visible = True Then
Debug.Print "hELlO"
'\\ WHEN COMBOBOX CHANGES ON REACTION FORM IT PASSES THE CAPTION INFORMATION FOR THE BUTTONS.
If Len(Box.Name) = 7 Then REACTIONS.Frame20.Controls("MyNCBtn" & Right(Box.Name, 1)).Caption = Box.List(Box.ListIndex, 1) ' will only work until 9
If Len(Box.Name) = 8 Then REACTIONS.Frame20.Controls("MyNCBtn" & Right(Box.Name, 2)).Caption = Box.List(Box.ListIndex, 1) ' will work until 99
End If
Debug.Print "Hi"
If UFSTDRDS.Visible = True Then
MsgBox ("Hello")
End If
End Sub
Public Property Get Box() As MSForms.ComboBox
Set Box = m_ComboBoxEvents
End Property
Код формы здесь.
Sub Not_Working()
Dim clsComboBox As New cComboBox
Dim MyCBx As MSForms.ComboBox
Dim m_colComboBoxEvents As Collection ' If I remove this line I get variable undefined error in next line, but it is not required in the working code above
Set m_colComboBoxEvents = New Collection
Loop starts here
Set MyCBx = Me.MultiPage1.Pages(2).Controls.Add("Forms.ComboBox.1", "MyNCBox" & x, 1)
Dim MyCBxfill As Variant
MyCBxfill = ws1.Range("A1").CurrentRegion
With MyCBx
.Top = 280 + ((x - 1) * 30)
.Left = 250
.Width = 350
.Height = 20
.FontSize = 8
.FontName = "Times New Roman"
.ColumnCount = UBound(MyCBxfill, 2)
'.ColumnWidths = ",0"
.List = MyCBxfill
End With
Set clsComboBox = New cComboBox
Set clsComboBox.Box = MyCBx
m_colComboBoxEvents.Add clsComboBox, CStr(m_colComboBoxEvents.Count + 1)
Loop ends here
End Sub
Если вы прокрутите сайт ozgrid, то увидите пример под названием test.xlsb (обратите внимание, что было несколько текстовых обменов, но пока никто не предоставил решения), там также есть более подробная информация, но мне кажется, я включил в тот пост слишком много подробностей. По какой-то причине класс у меня не работает.
Я не против совершенно нового подхода или альтернативного синтаксиса. Я просто не могу понять, почему это работает в исходном контексте, а не в новом.
Любые идеи и улучшения существующего кода будут оценены по достоинству.
С уважением
Джастин
решение1
Решено Рори @ Ozgrid.com, как подробно описано ниже:
Я не смотрел вашу рабочую книгу, но объявление вашей коллекции во втором коде находится не в том месте. Эта строка:
Dim m_colComboBoxEvents As Collection
необходимо на уровне модуля. В противном случае, как только ваша процедура завершится, переменная будет очищена и не останется ни одного экземпляра вашего класса.