Añadir controles y evento en tiempo de ejecución excel

Tengo un formulario en excel que en su evento initialize crea tantos labels como trabajadores encuentra en la hoja "personal" y sus correspondientes textbox para introducir la cantidad de horas trabajadas y dos commandbutton, uno para validar los datos introducidos y copiarlos en la hoja "horas" y otro para salir. El problema es que no sé como añadir los eventos en tiempo de ejecución a cada uno de los botones. Pego el código a continuación para que se comprenda mejor:
Dim lrow As Long
Dim ws As Worksheet
Private Sub UserForm_Initialize()
Dim n As Integer
Set ws = Worksheets("Personal")
lrow = ws.Cells(Rows.Count, 1) _
  .End(xlUp).Row - 1
Txtfecha.Value = Format(Date, "medium date")
Txtfecha.SetFocus
Me.ScrollHeight = (lrow * 25) + 95
For n = 1 To lrow
With Me.Controls.Add("Forms.Label.1")
.Name = "Label" & n: .Caption = ws.Range("A" & n + 1) & " " & _
ws.Range("B" & n + 1) & " " & ws.Range("C" & n + 1)
.Top = ((n - 1) * 25) + 40: .Height = 25
.Left = 20: .Width = 175: .Font.Size = 11
End With
With Me.Controls.Add("Forms.Textbox.1")
.Name = "Txtbox" & n: .Top = ((n - 1) * 25) + 35: .Height = 20
.Left = 200: .Width = 30: .Font.Size = 11
End With
Next
With Me.Controls.Add("Forms.Commandbutton.1")
.Name = "CmdValidar": .Caption = "VALIDAR"
.Top = (lrow * 25) + 45: .Height = 30
.Left = 25: .Width = 75: .Font.Size = 12
.BackColor = &H80FFFF: .ForeColor = &H4000&
.Font.Bold = True
End With
With Me.Controls.Add("Forms.Commandbutton.1")
.Name = "CmdSalir": .Caption = "SALIR"
.Top = (lrow * 25) + 45: .Height = 30
.Left = 145: .Width = 75: .Font.Size = 12
.BackColor = &H80FFFF: .ForeColor = &H4000&
.Font.Bold = True
End With
End Sub
Private Sub CmdValidar_Click()
Dim n As Integer
Dim ltrow As Long
Dim wsh As Worksheet
wsh = Worksheets("Horas")
Set ws = Worksheets("Personal")
lrow = ws.Cells(Rows.Count, 1) _
  .End(xlUp).Row - 1
ltrow = wsh.Cells(Rows.Count, 1) _
  .End(xlUp).Offset(1, 0).Row
For n = 1 To lrow
With wsh
.Cells(ltrow, 1).Value = Txtfecha.Value
.Cells(ltrow, 2).Value = Label & n.Caption
.Cells(ltrow, 3).Value = txtbox & n.Value
End With
ltrow = ltrow + 1
Next
End Sub
Respuesta
1

Para agregar el evento en tiempo de ejecución debes hacer lo siguiente:

1.-Coloca esto en las declaraciones de tu formulario

Option Explicit
'Variable con evento para crear el objeto / control
Private WithEvents CmdValidar As CommandButton
Private WithEvents CmdSalir As CommandButton

Dim lrow As Long
Dim ws As WorksheetDim lrow As Long
Dim ws As Worksheet

2.-Luego el código para que funcione debes redactarlo de esta manera.

Private Sub UserForm_Initialize()
Dim n As Integer
Set ws = Worksheets("Personal")
lrow = ws.Cells(Rows.Count, 1) _
.End(xlUp).Row - 1
Txtfecha.Value = Format(Date, "medium date")
Txtfecha.SetFocus
Me.ScrollHeight = (lrow * 25) + 95
For n = 1 To lrow
With Me.Controls.Add("Forms.Label.1")
.Name = "Label" & n: .Caption = ws.Range("A" & n + 1) & " " & _
ws.Range("B" & n + 1) & " " & ws.Range("C" & n + 1)
.Top = ((n - 1) * 25) + 40: .Height = 25
.Left = 20: .Width = 175: .Font.Size = 11
End With
With Me.Controls.Add("Forms.Textbox.1")
.Name = "Txtbox" & n: .Top = ((n - 1) * 25) + 35: .Height = 20
.Left = 200: .Width = 30: .Font.Size = 11
End With
Next
' Crear "CommandButton" con Controls.Add y asignarlo a CmdValidar
Set CmdValidar = Me.Controls.Add("Forms.CommandButton.1", "VALIDAR", Visible)
' Estableciendo propiedades
With CmdValidar
.Caption = "VALIDAR"
.Top = (lrow * 25) + 45: .Height = 30
.Left = 25: .Width = 75: .Font.Size = 12
.BackColor = &H80FFFF: .ForeColor = &H4000&
.Font.Bold = True
.Font.Size = 10
.Visible = True ' Hacerlo visible
End With
' Crear "CommandButton" con Controls.Add y asignarlo a CmdValidar
Set CmdSalir = Me.Controls.Add("Forms.CommandButton.1", "SALIR", Visible)
' Estableciendo propiedades
With CmdSalir
.Caption = "SALIR"
.Top = (lrow * 25) + 45: .Height = 30
.Left = 145: .Width = 75: .Font.Size = 12
.BackColor = &H80FFFF: .ForeColor = &H4000&
.Font.Bold = True
.Font.Size = 10
.Visible = True ' Hacerlo visible
End With
End Sub

Bueno espero les sirva de ayuda.

2 respuestas más de otros expertos

Respuesta
2

Option Explicit
'Declaramos dos variables con eventos de tipo "botón de comando", en este caso..ok
Private WithEvents CmdValidar As CommandButton
Private WithEvents CmdSalir As CommandButton

Dim n As Integer
Dim Ufila As Long
Dim Sfila As Long
Dim wsp As Worksheet
Dim wsh As Worksheet

'El código para que funcione debes redactarlo de esta manera y dentro del módulo tipo formulario... ok
Private Sub UserForm_Initialize()
Set wsp = Worksheets("Personal")
Ufila = wsp.Cells(Rows.Count, 1) _
.End(xlUp).Row - 1
Txtfecha.Value = Format(Date, "medium date")
Txtfecha.SetFocus
Me.ScrollBars = fmScrollBarsBoth
Me.ScrollHeight = (Ufila * 25) + 295
Me.ScrollWidth = (Ufila * 25) + 295
For n = 1 To Ufila
With Me.Controls.Add("Forms.Label.1")
.Name = "Label" & n: .Caption = wsp.Range("A" & n + 1) & " " & _
wsp.Range("B" & n + 1) & " " & wsp.Range("C" & n + 1)
.Top = ((n - 1) * 25) + 40: .Height = 25
.Left = 20: .Width = 175: .Font.Size = 11
End With
With Me.Controls.Add("Forms.Textbox.1")
.Name = "Txtbox" & n: .Top = ((n - 1) * 25) + 35: .Height = 20
.Left = 200: .Width = 30: .Font.Size = 11
End With
Next
' Agregar el botón al formulario y asignarlo a variable CmdValidar.
Set CmdValidar = Me.Controls.Add("Forms.CommandButton.1", "VALIDAR", Visible)
' Estableciendo propiedades.
With CmdValidar
.Caption = "VALIDAR"
.Top = (Ufila * 25) + 45: .Height = 30
.Left = 25: .Width = 75: .Font.Size = 12
.BackColor = &H80FFFF: .ForeColor = &H4000&
.Font.Bold = True
.Font.Size = 10
.Visible = True ' Hacerlo visible
End With
' Agregar un nuevo botón al formulario y asignarlo a variable CmdSalir.
Set CmdSalir = Me.Controls.Add("Forms.CommandButton.1", "SALIR", Visible)
' Estableciendo propiedades.
With CmdSalir
.Caption = "SALIR"
.Top = (Ufila * 25) + 45: .Height = 30
.Left = 145: .Width = 75: .Font.Size = 12
.BackColor = &H80FFFF: .ForeColor = &H4000&
.Font.Bold = True
.Font.Size = 10
.Visible = True ' Hacerlo visible
End With
End Sub

'Programar el botón CmdValidar, con evento click.
Private Sub CmdValidar_Click()
Set wsh = Worksheets("Horas")
Sfila = wsh.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
For n = 1 To Ufila
With wsh
.Cells(Sfila, 1).Value = Me.Txtfecha.Value
.Cells(Sfila, 2).Value = Me.Controls("Label" & n).Caption
.Cells(Sfila, 3).Value = Me.Controls("Txtbox" & n).Value
End With
Sfila = Sfila + 1
Next
End Sub

'Programar el botón CmdSalir, con evento click.
Private Sub CmdSalir_Click()
Unload Me
End Sub

Respuesta
1
Consulta. ¿Lo qué no te funciona son los botones en tiempo de ejecución?
Todo se crea perfectamente pero ni el botón validar ni el botón salir al clickar sobre ellos realizan la función encomendada porque tienen que estar asociados al evento correspondiente. Ya probé escribiendo el código, por ejemplo, del botón salir:
Sub CmdSalir_Click ()
Unload Me
End Sub
Pero, lógicamente, no hace nada, pues también hay que asociarle el eventoen tiempo de ejecución y no se hacerlo. No sé si eso te aclara algo más.
Saludos.
En tiempo de diseño, debes hacer doble click sobre el control cmdXXXXX, eso te abrirá el editor de vba con un procedimiento listo para introducir el código.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas