Динамическая форма на Vba: элементы и события
Инструмент разработки - VBA для Excel 2000.
Исходная ситуация: в проекте есть пустая форма (модуль кода тоже пуст).
Надо: при загрузке добавить на нее нужное кол-во элементов управления (в моем случае CheckBox) и код обработки события Click для каждого из них.
Никак не могу связать между собой элементы и коды их реакции на событие.
Если добавлять в модуль кода формы текст из файла или строки (методы AddFromFile или InsertLines соответственно), то все добавляется благополучно. Только вот на событие "коробочки" не реагируют, как будто для них кода и не существует.
Реагирует только сама форма, хотя код события ее инициализации вставлен тем же способом, что и для "коробочек".
Если же добавлять код обработки события после предварительного использования метода CreateEventProc("Click", "CheckBox1"), то возникает сообщение об ошибке "57017: Event handler is invalid".
Пробовал добавлять код события этим же способом прямо после добавления элемента на форму при ее инициализации. Результат - ошибка 57017.
Пробовал создавать один элемент в режиме конструирования, а потом копировать его в нужном количестве и вставлять из файла или регистрировать методом CreateEventProc (для копий) код обработки события.
В первом случае - опять нет реакции. Во втором - та же ошибка.
Подскажите, пожалуйста, что делать-то.
Единственное , что могу посоветовать - создать класс, наделённый всеми свойствами нужного элемента,а потом динамически создавать элементы этого класса и помещать на форму
Вот обсуждение данного вопроса. И там дан работающий код:
Цитата:
Originally posted by SergeySV
Вот обсуждение данного вопроса. И там дан работающий код:
http://forum.codenet.ru/showthread.php?s=&threadid=13037&highlight=VBide
Вот обсуждение данного вопроса. И там дан работающий код:
http://forum.codenet.ru/showthread.php?s=&threadid=13037&highlight=VBide
Спасибо всем за внимание к моему вопросу.
С модулем класса попробую. Вероятно, ничего другого уже и не остается, т.к. материалы, находящиеся по предложенной ссылке (увы) не помогли. Эффект тот же - объект управления создается, а на код обработки события для него не реагирует.
Private Sub CommandButton1_Click()
Workbooks.Add
ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _
, DisplayAsIcon:=False, Left:=164.25, Top:=27, Width:=45, Height:= _
41.25).Select
n = Application.VBE.VBProjects.Count
Application.VBE.ActiveVBProject.VBComponents(2).CodeModule.InsertLines 2, "Private Sub CommandButton1_Click()"
Application.VBE.ActiveVBProject.VBComponents(2).CodeModule.InsertLines 3, "MsgBox ""Hello from new book!"""
Application.VBE.ActiveVBProject.VBComponents(2).CodeModule.InsertLines 4, "End Sub"
End Sub
Потом в этой новой книги можно было скоко угодно нажимать на кнопку и без всяких ошибок появлялся MsgBox
Так что если у тебя проблемы, то дело скорей всего в каких то настройках твоего офиса и смена кода тебе не поможет, потому что дело не в нем. Да и вообще, я бы не оставлял без внимания тот факт, что работающий у всех код, на каком то одном компьютере не работает. Если уж не разобрался бы в причинах, то по крайне мере снес бы office и поставил его заново
Цитата:
Originally posted by SergeySV
У меня OfficeXp код отработал нормально
Private Sub CommandButton1_Click()
Workbooks.Add
ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _
, DisplayAsIcon:=False, Left:=164.25, Top:=27, Width:=45, Height:= _
41.25).Select
n = Application.VBE.VBProjects.Count
Application.VBE.ActiveVBProject.VBComponents(2).CodeModule.InsertLines 2, "Private Sub CommandButton1_Click()"
Application.VBE.ActiveVBProject.VBComponents(2).CodeModule.InsertLines 3, "MsgBox ""Hello from new book!"""
Application.VBE.ActiveVBProject.VBComponents(2).CodeModule.InsertLines 4, "End Sub"
End Sub
Потом в этой новой книги можно было скоко угодно нажимать на кнопку и без всяких ошибок появлялся MsgBox
Так что если у тебя проблемы, то дело скорей всего в каких то настройках твоего офиса и смена кода тебе не поможет, потому что дело не в нем. Да и вообще, я бы не оставлял без внимания тот факт, что работающий у всех код, на каком то одном компьютере не работает. Если уж не разобрался бы в причинах, то по крайне мере снес бы office и поставил его заново
У меня OfficeXp код отработал нормально
Private Sub CommandButton1_Click()
Workbooks.Add
ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _
, DisplayAsIcon:=False, Left:=164.25, Top:=27, Width:=45, Height:= _
41.25).Select
n = Application.VBE.VBProjects.Count
Application.VBE.ActiveVBProject.VBComponents(2).CodeModule.InsertLines 2, "Private Sub CommandButton1_Click()"
Application.VBE.ActiveVBProject.VBComponents(2).CodeModule.InsertLines 3, "MsgBox ""Hello from new book!"""
Application.VBE.ActiveVBProject.VBComponents(2).CodeModule.InsertLines 4, "End Sub"
End Sub
Потом в этой новой книги можно было скоко угодно нажимать на кнопку и без всяких ошибок появлялся MsgBox
Так что если у тебя проблемы, то дело скорей всего в каких то настройках твоего офиса и смена кода тебе не поможет, потому что дело не в нем. Да и вообще, я бы не оставлял без внимания тот факт, что работающий у всех код, на каком то одном компьютере не работает. Если уж не разобрался бы в причинах, то по крайне мере снес бы office и поставил его заново
Спасибо за совет.
По крайней мере он заставил меня внимательно проверить код и найти ошибку (был указана неверная ссылка на компонент проекта). Пример для рабочего листа заработал.
Но (опять же увы) это не мой случай. Коллекция OLEObjects не принадлежит формам. Не применим к ним и одноименный метод.
Еще раз всем спасибо. Буду думать дальше.