2016-08-26 5 views
0

Я работаю в Excel 2013, создавая Userform с элементами управления, созданными во время выполнения. У меня возникли проблемы с созданием функции, которая будет срабатывать при событии изменения динамически созданных элементов управления.VBA Excel Userform EventHandler для динамически сгенерированных элементов управления не работает должным образом

Элементы управления содержатся в отдельном модуле класса, который создает их и управляет ими. Я хочу, чтобы добавить функцию, что пожары на события изменения в комбо-боксе, поэтому он у меня объявили WithEvents:

Private WithEvents myComboBox As MSForms.ComboBox 
... other controls and variable declarations... 

У меня есть функция, которая передается кадр, который я хочу элементы управления, чтобы быть в так что я могу создать все компоненты из класса.

Sub initialize(myID As String, myFrame As MSForms.Frame, Left As Double, Top As Double) 
    ... 
    Set myComboBox = myFrame.Controls.Add("Forms.ComboBox.1", myID & "_comboBox") 
    ... 
End Sub 

Это все работает, и ComboBox создается и свойства изменились, хотя myComboBox успешно изменить, как появляется ComboBox.

Поскольку myComboBox объявлен WithEvents, я могу найти myComboBox_Change как вариант в раскрывающемся меню и поставить его в модуле:

Private Sub myComboBox_Change() 
    MsgBox ("Change Event Fired") 
End Sub 

Но эта функция не будет работать, и я не могу понять почему. При изменении не появится сообщение, а точка останова, включенная в эту функцию, не остановит запуск какого-либо кода. Что я делаю не так?

+0

Я не могу проверить это сам и не обязательно правильно запомнить, но ... попробуйте «Public WithEvents myComboBox As MSForms .ComboBox "вместо" Private ... " – user3598756

+0

Спасибо за предложение, но это не повлияло. – SudoNim

+0

У вас есть больше * чем один *? Какова цель динамического присвоения имени как «myID &» _comboBox »? – Comintern

ответ

2

С помощью некоторых зондирующих вопросов от cyboashu я выяснил, что было не так. Класс, содержащий myComboBox, не удерживался переменной, объявленной для области всей пользовательской формы. После того, как функция создания завершена, компоненты все еще находятся в myFrame, но функции, которые будут запущены на события, были забыты

+0

будет работать с 'Private WithEvents myComboBox как MSForms.ComboBox'? – user3598756

+0

Да, как только класс был объявлен в правильном объеме, неважно, был ли этот компонент общедоступным или закрытым. Оба способа работы. – SudoNim

+0

Благодарим за информацию – user3598756