Asignar evento a controles checkbox creados dinámicamente

6 envíos / 0 nuevos
Último envío
Vyrtim
Imagen de Vyrtim
Offline
última acción: Hace 4 años 6 meses
Nivel 1 - 200 puntos
alta: 13/07/2016 - 09:18
Puntos: 270
Asignar evento a controles checkbox creados dinámicamente

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!

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 1 día
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
La manera más sencilla es

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

Vyrtim
Imagen de Vyrtim
Offline
última acción: Hace 4 años 6 meses
Nivel 1 - 200 puntos
alta: 13/07/2016 - 09:18
Puntos: 270
Gracias Cron por tu respuesta

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

Cron
Imagen de Cron
Offline
última acción: Hace 8 meses 1 día
Nivel 1 - 200 puntosNivel 2 - 500 puntosNivel 3 - 1000 puntosNivel 4 - 2000 puntosNivel 5 - 4000 puntos
alta: 23/06/2010 - 12:30
Puntos: 12735
Hasta donde yo entiendo,

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

Vyrtim
Imagen de Vyrtim
Offline
última acción: Hace 4 años 6 meses
Nivel 1 - 200 puntos
alta: 13/07/2016 - 09:18
Puntos: 270
Gracias Cron,creo que he

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!

Vyrtim
Imagen de Vyrtim
Offline
última acción: Hace 4 años 6 meses
Nivel 1 - 200 puntos
alta: 13/07/2016 - 09:18
Puntos: 270
Muy buenas de nuevo!Como dije

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.