martes, 19 de enero de 2016

VBA: La Colección Controls de un UserForm.

Días atrás un lector planteaba la siguiente cuestión:
En un formulario tengo 3 controles del tipo opción dentro de un grupo de opciones y a cada uno de ellos quiero renombrarlo (con la propiedad .Caption) en función de lo que tenga en un rango de celdas en una hoja de Excel.
He probado a poner en el código cuando se activa el formulario algo así:

for c=1 to lista_nombres.count
a="formulario.opcion_"&c&".Caption"
a=lista_nombres.offset(c-1,0).value
next c

pero no me hace nada. es como si no reconociera bien el nombre de la propiedad.


Bien, lo que falló en el intento del lector fue la forma en cómo construyó y aplicó la propiedad .Caption a/los Control/es... y sobre todo en la forma en que llamaba o nombraba los Botones de opción de su formulario.
Una manera correcta sería emplear la collection .Controls dentro del UserForm.


Veamos nuestros puntos de partida.
En primer lugar tenemos un rango de tres celdas (A1:A3) con tres valores (al que hemos asignado un Nombre definido:= 'lista_nombres'):

VBA: La Colección Controls de un UserForm.



Por otro lado tenemos el siguiente formulario de usuario (al que he renombrado como 'formulario', y el que tiene dispuestos los siguientes controles:

VBA: La Colección Controls de un UserForm.



1- Un cuadro o Frame que contiene los tres botones de opción (llamado 'Frame1').
2- Tres botones de opción (OptionButton) llamados 'opcion_1', 'opcion_2' y 'opcion_3'.
3- Un Botón de comando, llamado CommandButton1, destinado a ejecutar el proceso....


Para resolver nuestra cuestión en particular, insertamos el siguiente código dentro de la ventana de código del UserForm desde el editor de VB:

Private Sub CommandButton1_Click()
'recorremos las celdas de nuestro rango
For c = 1 To Range("lista_nombres").Count
     'creamos/componemos los nombres de los botones de opción...
     a = "opcion_" & c
     'los llamamos mediante el uso de la collection .Controls
     Me.Controls(a).Caption = Range("lista_nombres").Item(c).Value
Next c
End Sub



Listo...
Si ejecutamos el UserForm, y presionamos el botón de comando, veremos como los nombres de los botones toman los valores de cada celda de la hoja de cálculo...


Igualmente podríamos haber asociado la carga de datos a un evento _Initialize del formulario:
Private Sub UserForm_Initialize()
For c = 1 To Range("lista_nombres").Count
     a = "opcion_" & c
     Me.Controls(a).Caption = Range("lista_nombres").Item(c).Value
Next c
End Sub

No hay comentarios:

Publicar un comentario en la entrada