2013-02-21 2 views
4

Я уже боролся с этой проблемой ... Я хочу сделать что-то очень простое. Я хочу создать несколько командных кнопок во время выполнения, а затем обработать события для этих команд с помощью одной процедуры. Поэтому я создал класс «withevents» для автоматизации, но мой код не работает. Когда я запускаю Test(), создается CommandButton, но когда я нажимаю на него ... ответа на сообщение нет ... Я не могу найти ошибку. Пожалуйста, любая помощь будет большой!Работа с событиями для OLEObject CommandButtons, созданная в Runtime

Класс CTest

Public WithEvents Button As MSForms.CommandButton 

Public Sub Button_Click() 
s = MsgBox("Hello", vbOKOnly) 
End Sub 

Модуль 1

Public TestCollection As Collection 

Sub Test() 

Set TestCollection = New Collection 
Dim Btn As CommandButton 
Dim OLEBtnObj As cTest 
Set OLEBtnObj = New cTest 
Set Btn = Sheet1.OLEObjects.Add(ClassType:="Forms.CommandButton.1", link:=False,_ DisplayAsIcon:=False, Left:=368.25, Top:=51, Width:=44.25, Height:=24).Object 
Set OLEBtnObj.Button = Btn 
TestCollection.Add Item:=OLEBtnObj 

End Sub 
+0

Я считаю, что элементы управления рабочими таблицами (.OLEObjects.Add), похоже, повторно скомпилируют проект. Если вы хотите, попробуйте работать с элементами управления Form и назначьте ему событие .OnClick, или если вы все еще хотите использовать ActiveX Control, попробуйте этот http://stackoverflow.com/questions/10633387/programatically-inserting-click- event-code-for-dynamic-generated-label-not-w –

ответ

5

У меня есть один довольно непрактичным решение :-). Чтобы проверить его, введите следующий код в Лист1 класса Class.

Для каждой новой кнопки Sheet1 будет добавлено новое обработанное событие. Этот обработчик событий выполнит общий обработчик событий и передаст ему имя нажатой команды.

' Standard Module 
Sub test() 
    ' adds three buttons to Sheet1 with click-event handlers 
    Sheet1.AddButton 
    ActiveCell.Offset(5, 0).Activate 
    Sheet1.AddButton 
    ActiveCell.Offset(5, 0).Activate 
    Sheet1.AddButton 
End Sub 

' Sheet1 Class Module 
Option Explicit 

' Add Microsoft Visual Basic For Applications Extensibility 

Public Function AddButton() As MSForms.CommandButton 
    Dim msFormsCommandButton As MSForms.CommandButton 
    Set msFormsCommandButton = Me.OLEObjects.Add(ClassType:="Forms.CommandButton.1").Object 
    CreateEventHandler msFormsCommandButton.Name 
    Set AddButton = msFormsCommandButton 
End Function 

Private Sub CommonButton_Click(ByVal buttonName As String) 
    MsgBox "You clicked button [" & buttonName & "]" 
End Sub 

Private Sub CreateEventHandler(ByVal buttonName As String) 
    Dim VBComp As VBIDE.VBComponent 
    Dim CodeMod As VBIDE.CodeModule 
    Dim codeText As String 
    Dim LineNum As Long 

    Set VBComp = ThisWorkbook.VBProject.VBComponents(Me.CodeName) 
    Set CodeMod = VBComp.CodeModule 
    LineNum = CodeMod.CountOfLines + 1 

    codeText = codeText & "Private Sub " & buttonName & "_Click()" & vbCrLf 
    codeText = codeText & " Dim buttonName As String" & vbCrLf 
    codeText = codeText & " buttonName = """ & buttonName & "" & vbCrLf 
    codeText = codeText & " CommonButton_Click buttonName" & vbCrLf 
    codeText = codeText & "End Sub" 
    CodeMod.InsertLines LineNum, codeText 
End Sub 
+0

Слава Богу! ЭТО работает ... После подробного рассмотрения этой проблемы невозможно создать класс-оболочку для динамически создаваемых OLEObjects с использованием ключевого слова «withevents». Единственное решение - программно вставить новый код в модуль Sheet для каждого созданного объекта ... хотя это не самое элегантное решение, оно работает. Чему так много даниэль! И для дальнейшего использования, как вы думаете, это было бы намного проще реализовать с помощью Visual Studio Tools for Office. Я думаю о том, чтобы познакомиться с этим API ... и теперь использовать VSOT вместо формы VBA ... –

+1

Привет, я рад, что это было полезно для вас. Я не нашел другого рабочего решения для кнопок OLE на листе, кроме этого. Знакомство с VSTO очень полезно. С другой стороны, VBA определенно намного проще работать. – dee

Смежные вопросы