visual una para macro llamar funciones funcion formulario desde crear como comandos codigo boton asignar abrir excel vba event-handling userform

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.