Los módulos de clase llegaron para quedarse en VBA, haciendo a Excel una herramienta mas optimizada para la programación basada en objetos. En esta Guia Rápida hablaremos de como se pueden utilizar para mejorar tus líneas de código.
1. Que es un módulo de clase.
Los módulos de clase técnicamente son objetos que se pueden crear dentro del ambiente de programación como objetos vacíos, mismos que les podemos asignar cualquier propiedad existente (o no) para generar procesos complejos o almacenar información para después.
2. Declaración y propiedades.
Ahora revisemos sus generales.
Para agregar un modulo de clase bastara con ir a la pestaña Programador (o desarrollador) en la cinta de opciones o presionar Alt+F11.
Una vez dentro, en la parte izquierda de la ventana programador da click derecho sobre cualquier hoja y selecciona Insertar > Modulo de Clase.
La ventana se ve igual a todos los demás blogs de desarrollo, pero aceptara un tipo de código especifico que nos dejara desarrollar los objetos nuevos.
Dentro de las propiedades (lado izquierdo inferior seleccionando el modulo de clase) veremos que contiene dos propiedades: Nombre e Instansing.
Nombre no es mas que el nombre del módulo, con el cual podremos llamarlo a través de otras instancias.
Instansing será la forma en la que se muestra el código. Por default, los módulos de clase son privados, por lo que si quieres utilizarlos dentro de otras líneas de código puedes cambiarlos a “PublicNotCreateble”.
3. La propiedad Let
Vamos a iniciar la programación.
Dentro de la ventana de desarrollador escribamos primero una variable tipo Private que nos servirá para traer valores desde otros módulos.
Private dbl as Double
Ahora, iniciemos este objeto con la propiedad Let, la cual nos dejara obtener un valor para nuestra clase.
Public Property Let Valor(numero as Double) dbl = numero End Property
La propiedad Let siempre debe tener al menos una variable dentro del paréntesis para poder funcionar, en este caso llamaremos a la variable número para asignar un valor del tipo número decimal.
Usando la variable dbl asignada arriba, lograremos traer un nuevo numero de un módulo externo.
4. La propiedad Get
A diferencia de Let, Get nos permitirá seleccionar el valor asignado a nuestro objeto y devolverlo dentro de cualquier otra instancia.
Public Property Get Valor() as Double valor = dbl End Property
Al hacer una declaración de este tipo, podremos obtener el valor de dbl que asignamos dentro del Let, con lo cual el objeto ya tiene una característica (un numero decimal).
5. El llamado desde un módulo normal.
Continuemos ahora en un modulo normal en VBA para inicializar nuestro objeto. Lo podemos insertar de la misma forma que el modulo de clase pero ahora seleccionando la opción Insertar > Modulo.
Una vez dentro, declararemos una variable del tipo publico para llamar a nuestra clase.
Public nClase as New Clase1
Necesitamos primero asignar el valor a nuestra clase, por lo que llamaremos a nuestra variable nClase en un procedimiento.
Sub nClaseIn()
Dim aDbl as Double
aDbl = 8.5
nClase.Valor = aDBL
End Sub
Nota como mediante esto estamos designando un número que servirá como propiedad Valor dentro de la clase publica nClase, por lo que ahora nuestro objeto tiene un valor de 8.5 almacenado en su memoria.
A diferencia de un método normal, ese objeto valdrá 8.5 hasta que nosotros designemos lo contrario, por lo que desde otro procedimiento podemos acceder a su valor sin ningún problema
Sub nClaseOut()
MsgBox nClase.Valor
End Sub
Si probamos los procedimientos por separado veremos como el valor de nuestro objeto en el modulo de clase no cambiara, así corramos mil macros más o hagamos cualquier cosa (menos volver a designar el valor).
Los códigos completos quedan así:
Para el modulo de clase
Private dbl As Double 'Permite tener un valor al cual acceder
Public Property Let Valor(numero As Double)
' La propiedad Let nos permitira designar un valor a nuestro objeto
' Recuerda que siempre debe contener al menos una variable dentro del parentesis
' Aqui podriamos escribir cualquier tipo de operacion que queramos.
dbl = numero
End Property
Public Property Get Valor() As Double
' La propiedad Get nos permite obtener lo que sea que hayamos designado
' dentro del mismo nombre de la propiedad en Let
' En este caso, Let es un numero double y Get debe devolver lo mismo
Valor = dbl
End Property
Para el modulo normal
Public nClase As New Clase1 ' Una nueva instancia del objeto
Sub nClaseIn()
' Inicializaremos nuestra clase declarando una variable a su propiedad
' Let, con lo que esa propiedad obtendra un valor
Dim aDbl As Double
aDbl = 8.5
nClase.Valor = aDbl
End Sub
Sub nClaseOut()
' Con este procedimiento llamaremos por separado al objeto.
' El valor del objeto en su propiedad Valor sera el designado
' al inicializar con el procedimiento de arriba.
MsgBox nClase.Valor
End Sub
Puedes usar los módulos de clase en cualquier procedimiento, evento o incluso en UserForms, por lo que son una herramienta útil y pueden tener tantas propiedades como uno quiera.
Cualquier duda nos leemos abajo.