Atribuir on-clique função VBA a um botão criado dinamicamente em Excel formulário de usuário

StackOverflow https://stackoverflow.com/questions/566770

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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top