para - como llamar una funcion en vba excel
Asigne la función VBA con un clic a un botón creado dinámicamente en la forma de usuario de Excel (5)
Estoy creando botones dinámicamente en una forma de usuario de Excel con el siguiente código:
With Me.CurrentFrame.Controls.Add("Forms.CommandButton.1")
.Caption = "XYZ"
.name = "AButton"
.Font.Bold = True
.ForeColor = &HFF&
... blah blah blah
End With
Me gustaría asignar una función para ejecutar cuando se hace clic en estos botones, pero no puedo encontrar una forma directa de hacerlo, ya que no hay ninguna propiedad como parte del botón.
¿Hay alguna manera de hacer esto usando el modismo anterior? ¿Debería hacer todo esto de otra manera?
He estado mirando esto también. Parece que puedes ejecutar una macro usando la propiedad onClick:
Command1.OnClick = "Macro1"
Luego crea una macro con ese nombre que ejecuta la función deseada. Este es mi truco sobre esto hasta que encuentre algo mejor.
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
Para agregar un evento de control dinámicamente en un formulario de Excel; primero debe agregar el evento (s) en un módulo de clase. Para mi ejemplo, voy a agregar un módulo de clase llamado clsTEST con un 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 puede ver, lo único que hará es establecer el título en el botón para luego hacer clic en él varias veces. A continuación, en el código del formulario, ingrese lo siguiente:
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
Cuando active el formulario, creará un botón. cada vez que haga clic en el botón, la leyenda cambiará.
El siguiente código debería estar funcionando
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"""
Necesita crear dinámicamente controladores de código / evento para cada botón.
Hace falta algo de trabajo - ver aquí: http://navpadexcel.blogspot.com/2006/11/httpwwwcpearsoncomexcelvbehtm.html
Una mejor manera podría ser crear un grupo de botones en el formulario (tantos como creas que necesitarás) antes de tiempo. Crea el código del controlador de eventos también. Hazlos todos ocultos inicialmente.
Luego, cuando se abre el formulario, puede cambiar dinámicamente los títulos de los botones, hacerlos visibles y moverlos. El código de evento que creó inicialmente se vinculará a los botones activados como se esperaba.