Программно создать прослушиватель событий в VBA

Можно ли программно создать event method на comboBox?

На листе у меня есть comboBox, и я могу получить его имена по коду:

       Dim ole As OLEObject
       For Each ole In ActiveSheet.OLEObjects

       If TypeName(ole.Object) = "ComboBox" Then
       ' ole.Name '<<<<<<<< here 
       End If
       Next ole

Как я могу создать и назначить event method для ole.Name:

 Private Sub myComboBox_Change()
   ...
 End Sub

В Java это можно сделать с помощью: myComboBox.setOnChangeListener(...some code of listener interface...);)

Ответ 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 для запуска кода подключения после завершения создания кода.