Atribuir on-clique função VBA a um botão criado dinamicamente em Excel formulário de usuário
-
05-09-2019 - |
Pergunta
Estou criando botões dinamicamente em um userform do Excel com o seguinte código:
With Me.CurrentFrame.Controls.Add("Forms.CommandButton.1")
.Caption = "XYZ"
.name = "AButton"
.Font.Bold = True
.ForeColor = &HFF&
... blah blah blah
End With
Eu gostaria de atribuir uma função a ser executada quando estes botões são clicados, mas não consigo encontrar uma maneira simples de fazer isso desde que não há nenhuma propriedade como parte do próprio botão.
Existe uma maneira de fazer isso usando o idioma acima? Devo estar indo sobre essa coisa toda de uma maneira diferente?
Solução
Você precisa criar dinamicamente manipuladores de código / eventos para cada botão.
É ter um pouco de fazer - veja aqui: http://navpadexcel.blogspot.com /2006/11/httpwwwcpearsoncomexcelvbehtm.html
A melhor maneira pode ser a criação de um grupo de botões no formulário (como muitos como você acha que vai precisar) antes do tempo. Criar o código de manipulador de eventos também. Torná-los todos escondidos inicialmente.
Então, quando o formulário for aberto, você pode alterar dinamicamente o botão legendas, torná-los visíveis e movê-los. O código de evento criado inicialmente estará ligado aos botões ativados como esperado.
Outras dicas
Para adicionar um evento de controle dinamicamente em um formulário de Excel; você precisa primeiro adicionar o evento (s) em um módulo de classe. Para o meu exemplo, eu estou indo para adicionar um módulo de classe chamado clsTest com um evento, 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
Como você pode ver, a única coisa que isso vai fazer é definir a legenda no botão para, em seguida, o número de vezes que você clicado ele. Em seguida, no código do formulário digite o seguinte:
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
Quando você ativa o formulário, ele irá criar um botão. cada vez que você clicar no botão a legenda vai mudar.
O código abaixo deve estar trabalhando
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"""
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
Eu estive olhando isso também. Parece que você pode executar uma macro usando a propriedade onClick:
Command1.OnClick = "Macro1"
Em seguida, criar uma macro com esse nome que executa a função desejada. Este é o meu corte em torno deste até eu encontrar algo melhor.