Назначение функции VBA по нажатию динамически создаваемой кнопки в пользовательской форме Excel - PullRequest
9 голосов
/ 19 февраля 2009

Я динамически создаю кнопки в пользовательской форме Excel со следующим кодом:

With Me.CurrentFrame.Controls.Add("Forms.CommandButton.1")
    .Caption = "XYZ"
    .name = "AButton"
    .Font.Bold = True
    .ForeColor = &HFF&
    ... blah blah blah
End With

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

Есть ли способ сделать это, используя вышеупомянутую идиому? Должен ли я говорить об этом все по-другому?

Ответы [ 5 ]

14 голосов
/ 31 октября 2012

Для динамического добавления управляющего события в форму Excel; сначала нужно добавить событие (я) в модуль класса. Для моего примера я собираюсь добавить модуль класса с именем clsTEST с одним событием, btn_click ()

    '#### CLASS NAMED clsTEST
    Public WithEvents btn As MSForms.CommandButton
    Public frm As UserForm

    Dim iCount As Long

    Private Sub btn_Click()

    iCount = IIf(iCount < 1, 1, iCount + 1)
    btn.Caption = "Count " & Str(iCount)

End Sub
'### END CLASS

Как вы можете видеть, единственное, что нужно сделать, это установить подпись на кнопке, а затем количество нажатий на нее. Далее в форме кода введите следующее:

    Dim mColButtons As New Collection    '## SET A NEW COLLECTION

    Private Sub UserForm_Activate()
    '
    Dim btnEvent As clsTEST
    Dim ctl As MSForms.Control
    '
    Set ctl = Me.Controls.Add("Forms.CommandButton.1")
    '
    With ctl
    .Caption = "XYZ"
    .Name = "AButton"
    END With
    '
    Set btnEvent = new clsTEST   
    Set btnEvent.btn = ctl
    set btnEvent.frm = Me
    '
    mColButtons.add btnEvent
    'End Sub

Когда вы активируете форму, она создаст кнопку. каждый раз, когда вы нажимаете на кнопку, заголовок будет меняться.

9 голосов
/ 19 февраля 2009

Вам необходимо динамически создавать обработчики кода / событий для каждой кнопки.

Это займет немного времени - см. Здесь: http://navpadexcel.blogspot.com/2006/11/httpwwwcpearsoncomexcelvbehtm.html

Лучшим способом может быть создание группы кнопок на форме (столько, сколько, по вашему мнению, вам нужно) заранее. Также создайте код обработчика событий. Сделайте их спрятанными изначально.

Затем, когда ваша форма открывается, вы можете динамически изменять заголовки кнопок, делать их видимыми и перемещать их. Первоначально созданный код события будет связан с активированными кнопками, как и ожидалось.

2 голосов
/ 05 октября 2009

Код ниже должен работать

Dim NewButton As OLEObject
Dim CodeModule As Object

Set NewButton = ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", _
    Link:=False, DisplayAsIcon:=False, Left:=52.5, Top:=Hght, _
    Width:=202.5, Height:=26.25)
NewButton.Object.Caption = "Click Me!"
Set CodeModule = ActiveWorkbook.VBProject.VBComponents.VBE.ActiveCodePane.CodeModule
CodeModule.InsertLines CodeModule.CreateEventProc("Click", NewButton.Name) + 1, vbTab & "MsgBox ""Hello world"""
1 голос
/ 06 мая 2010
Sub Oval1_Click()
    file = ActiveWorkbook.Name
    Set Output = Workbooks.Add()
    ActiveWorkbook.SaveAs Filename:="Try.xls"        
    Sheets(1).Select        
    ActiveSheet.Buttons.Add(460, 10, 140, 30).Select
    ActiveSheet.Buttons.Text = "DATA"      
    ActiveSheet.Shapes("Button 1").Select
    Selection.OnAction = "Book1.xlsm!data_Click"
End Sub

Sub data_Click()      
    MsgBox "you have clicked me"       
    ActiveSheet.DrawingObjects.Delete        
End Sub
0 голосов
/ 09 июня 2009

Я тоже смотрю на это. Кажется, вы можете запустить макрос, используя свойство onClick:

Command1.OnClick = "Macro1"

Затем создайте макрос с таким именем, который запускает нужную функцию. Это мой хак, пока я не найду что-нибудь получше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...