Ответ 1
Вам нужно создать модуль класса с переменной combobox, объявленной WithEvents. Затем, когда вы создаете combobox, назначьте его переменной класса. Таким образом, вы можете написать свою процедуру события во время разработки, но прислушаться к ней только после создания combobox.
Создайте модуль класса CControlEvents
Private WithEvents mclsCbx As MSForms.ComboBox
Public Property Set Cbx(ByVal clsCbx As MSForms.ComboBox): Set mclsCbx = clsCbx: End Property
Public Property Get Cbx() As MSForms.ComboBox: Set Cbx = mclsCbx: End Property
Private Sub mclsCbx_Change()
MsgBox Me.Cbx.name
End Sub
Тогда в стандартном модуле
'this is public so it doesn't go out of scope
Public gclsControlEvents As CControlEvents
Sub MakeCombo()
Dim oleCbx As OLEObject
'Create the combobox
Set oleCbx = Sheet1.OLEObjects.Add("Forms.ComboBox.1")
oleCbx.Object.AddItem "1"
oleCbx.Object.AddItem "2"
'hookup the events
Application.OnTime Now, "HookupEvents"
End Sub
Sub HookupEvents()
Set gclsControlEvents = New CControlEvents
Set gclsControlEvents.Cbx = Sheet1.OLEObjects(1).Object
End Sub
Теперь, когда выпадающее поле изменяется, событие срабатывает.
Вам нужно подключить выпадающее поле в другой процедуре, кроме той, в которой вы его создаете. Существует ошибка (или функция), которая препятствует ее выполнению в той же процедуре. Что-то делать с режимом дизайна, я думаю. Вот почему вы используете Application.OnTime для запуска кода подключения после завершения создания кода.