Как добавить обработку событий в элемент управления из динамически загружаемой библиотеки OCX в Excel VBA

В проекте Excel 2003 VBA я использую TreeCtrl из MSCOMCTL.OCX. Я динамически добавляю элемент управления в форму в своем приложении (см. код ниже).

Я хочу обработать событие NodeClick для TreeCtrl.

Поскольку элемент управления добавляется динамически, простое использование TreeCtrl_NodeClick не работает. Также я не могу использовать подход WithEvents, так как он не работает с типами, неизвестными во время компиляции.

'Does not work. WithEvents probably only works on known data types that have events.
'private WithEvents treeCtrl As Object 

'This code adds the control to the form
Private Sub UserForm_Initialize()
    Dim treeCtrl As Object
    Set treeCtrl = Me.Controls.Add("MSComctlLib.TreeCtrl.2", "MyTreeCtrl")
    'Does not work: AddHandler is not available in VBA.
    'AddHandler TreeCtrl.NodeClick, AddressOf UserForm1.MyTreeCtrl_NodeClick 
End Sub

'This is supposed to be the event handler but it does not get called.
Private Sub MyTreeCtrl_NodeClick(ByVal Node As Object) 
    MsgBox "Node clicked"
End Sub

Обратите внимание, что мне нужно динамически загружать MSCOMCTL.OCX. Я не могу поместить его в качестве статической ссылки в свой проект VBA (поскольку мой проект должен работать в разных версиях Excel).


person Tom    schedule 27.12.2012    source источник


Ответы (1)


Согласно этот ответ от MS «вы не можете обрабатывать события для элемента управления TreeView, добавленного во время выполнения, с помощью Excel VBA», хотя есть предлагаемый обходной путь с использованием VB6 (!).

Является ли добавление элемента управления во время разработки, а затем скрытие его до тех пор, пока не потребуется вариант?

person Niall    schedule 27.12.2012
comment
Большое спасибо, что указали на это. По крайней мере, я знаю, что теперь могу перестать искать. Относительно вашего вопроса: раньше я добавлял элемент управления во время разработки, но затем появилась 64-разрядная версия Windows 7, которая плохо работала со статической ссылкой на MSCOMCTL.OCX; подробности здесь: ссылка. В качестве обходного пути я добавил еще одну кнопку в форму. Таким образом, после выбора узла в дереве пользователь теперь должен дополнительно нажать кнопку. Не так блестит, но, по крайней мере, работает. - person Tom; 28.12.2012
comment
Без проблем. На самом деле у меня было много проблем с MSCOMCTL, так как каждый раз, когда он исправляется, он имеет тенденцию ломать любые приложения, использующие ListView (хотя, по моему опыту, не TreeView). Один вариант, с которым я экспериментировал (но не полностью реализованный из-за перехода на .NET), — это ссылка на отдельную копию MSCOMCTL, хранящуюся не в System32, а в другом месте на диске C. Похоже, это решило мои проблемы (хотя у меня были опасения, что я пропущу обновления безопасности), и интересно, может ли это помочь в этой ситуации? - person Niall; 28.12.2012