Buenas a todos!,
Se me ha presnetado el siguiente problema: tengo una serie de checkbox que he creado dinámicamente en la "Hoja1" de mi libro excel, y me gustaría acceder al evento click de cada uno de ellos.
¿Alguien tendría alguna idea de por dónde podrían ir los tiros?
Gracias por adelantado y un saludo a todos!
La manera más sencilla es hacer click derecho sobre el checkbox, seleccionar "Asignar macro" y tal cual está, darle a "Nuevo"
Se te creará una función que se llamará "Casilladeverificadión1_Haga_clic_en", cambiando la primera parte por el nombre de la casilla de verificación que sea.
En el caso de que las casillas no estén y solo aparezcan en función de lo que ocurra en otras macros (eso es lo que yo entiendo por creadas dinámicamente), entonces deberías cambiar la macro que lo crea para darle un nombre definido y luego crea las funciones de respuesta al click con esos nombres que hayas definido.
Un saludo
Gracias Cron por tu respuesta,
efectivamente, las casillas se crean a través de otra macro, y ya las crea con un nombre definido que, en teoría, puedo consultar. Entiendo que las funciones de respuesta al click las crea vba automáticamente al crear el control (igual que cuando insertas tú manualmente el control en la hoja de cálculo).
El tema entonces es, ¿cómo puedo llamar a la función de evento de un control específico de forma dinámica? Si tuviera 10 controles de tipo checkbox, por ejemplo... ¿podría hacer la llamada como CheckBox&i_Click o algo similar (donde i es un entero) ? En definitiva... ¿cómo se haría la llamada al evento click?
Gracias de nuevo y un saludo
Hasta donde yo entiendo, tendrías que llamar a la función específica.
Lo que sí puedes hacer es asignar la función al click de la casilla, y eso deberías hacerlo al crearla (cuando creas un objeto no necesariamente creas las funciones de respuesta, debes hacerlo explícitamente)
Entonces, lo correcto (a mi entender) es crearte una función que averigüe desde qué checkbox se le ha llamado y que haga lo que tenga que hacer en función de ese dato.
Un saludo
Gracias Cron,
creo que he entendido por dónde vas y voy a intentar hacer algo en ese sentido, a ver si funciona. De todas formas, he estado investigando y creo que he encontrado una forma de generar dinámicamente nuevo código de vba usando el método .CreateEventProc; en teoría podría solucionar así el tema de la llamada a la función específica (o eso creo).
Gracias de nuevo por tu rápida respuesta,
Un saludo!
Muy buenas de nuevo!
Como dije en el mensaje anterior, he estado haciendo pruebas con el método .CreateEventProc y ¡sí!, ¡funciona!. me genera el código de la función click de manera dinámica.
El código es el siguiente (previo insertado de un control checkbox en la "Hoja2"):
Sub CreateEventProcedure()
Dim VBProj As VBIDE.VBProject
Dim VBComp As VBIDE.VBComponent
Dim CodeMod As VBIDE.CodeModule
Dim LineNum As Long
Const DQUOTE = """" ' one " character
Set VBProj = ThisWorkbook.VBProject
Set VBComp = VBProj.VBComponents("Hoja2")
Set CodeMod = VBComp.CodeModule
i = 1
With CodeMod
LineNum = .CreateEventProc("Click", "CheckBox" & i)
LineNum = LineNum + 1
.InsertLines LineNum, " MsgBox " & DQUOTE & "Hello World" & DQUOTE
End With
End Sub
Ahora el tema es que cuando ejecuto el código anterior, me aparece el siguiente mensaje de error:
"No se puede entrar en tiempo de interrupción en este momento" y me da las opciones de continuar o finalizar
Si le doy a continuar, acaba la macro correctamente y me inserta bien el nuevo código en su sitio, pero me gustaría saber si hay alguna forma de evitar que se despliegue ese mensaje durante la ejecución, o de responderle automáticamente mediante código.
Un saludo y gracias de nuevo por todo.