Repetir el mismo Private Sub de forma automática

Quiero hacer 100 Private Sub como el que sale a continuación:

Private Sub A1_Click()

   If A1.Value = True Then
      A1.BackColor = vbGreen
   Else
      A1.BackColor = vbRed
   End If

End Sub

Se supone que es un togglebutton que al pulsarlo, si es para "activarlo" se pone verde y si es para "desactivarlo" se pone rojo. Tengo 100 botones así en mi UserForm y me gustaría saber si hay una manera fácil de hacer esto que no sea escribir a mano los 100 Private Sub.

Gracias y un saludo,

Kirchhoff.

1 respuesta

Respuesta
3

Con un módulo de clase y un objeto con eventos se debería poder hacer.

Es complicado de explicar, pero requiere sólo unas pocas líneas de código. He subido un ejemplo: www.jrgc.es/ejemplos/ejemplo_20201229a.xlsm

Tendrás que redimensionar a 100 la matriz que almacena los togglebuttons (está a 15, que son los que tiene el userform del ejemplo)

Saludos_

Buenas jrcges:

Lamento la tardanza en contestar y siento decirte que tendrás que explicarme un poco cómo funciona porque aunque lo intuyo, la verdad es que es un nivel de programación que no manejo ni por asomo.

Si puedes escribir una breve explicación, te lo agradezco.

Un saludo,

Kirchhoff.

A ver si soy capaz de explicarlo un poco, aunque no me resulta fácil.
El módulo de clase clBotones puede considerarse el plano con el que construiremos "nuestros" togglebuttons, que en este caso están denominados "Botones". Como cada uno de estos "Botones" está declarado con eventos (el "WithEvents" en la sección de declaraciones del módulo de clase), cada uno "hereda" los eventos de los togglebuttons.
En la sección de declaraciones del formulario se declara una matriz que contendrá a "nuestros" togglebuttons, con tantos elementos como botones de alternar haya en el formulario (en el ejemplo son 15). Los elementos de esta matriz no harán referencia a los 15 togglebuttons del formulario en sí, sino a la "copia" que crearemos de cada uno de ellos usando como plano el módulo de clase (de ahí el "As New clBotones")
El código del evento Initialize del formulario se encarga de ir creando las (en el caso del ejemplo) 15 copias de la clase clBotones, vinculando a cada uno de ellos con cada uno de los togglebuttons del formulario. Esto lo hace la instrucción

Set clBotones(bContador).Botones = Me.Controls(ctrl.Name)

Ahora que tenemos almacenados los 15 togglebuttons del userform en la matriz clBotones, cada vez que se desencadena el evento Click de uno de ellos se ejecutan tanto el código del evento Click de dicho botón de alternar que pueda haber en el código del formulario (en el ejemplo no lo hay, pero si lo hubiera se ejecutaría de forma normal y prioritaria) como el código del evento Click en el módulo de clase. Esto nos permite que el código escrito para dicho evento en el módulo de clase valga para todos los togglebuttons almacenados en la matriz clBotones.
Saludos_

Muchas gracias jrcges:

Te pedía la explicación porque me gusta saber lo que hago, más allá de copiar la solución que alguien me de. En cuento pueda probarlo te informo de si realmente hace lo que quería que hiciera, que me imagino que sí.

Un saludo,

Kirchhoff.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas