Aparte de los módulos para código que tiene Excel VBA, también existen Módulos de clase o Class Modules, en estos módulos se puede crear clases personalizadas con las cuales se puede representar en cierta forma objetos, aunque Excel VBA no es un lenguaje orientado a objetos, se puede aprovechar algunas ventajas que da el uso de clases.

Para ilustrar sobre el uso de clases, crearé la clase Rectángulo. En aspectos generales una clase tiene un constructor, variables privadas, métodos de lectura/escritura de las variables privadas, propiedades y métodos en sí. En un módulo de clase no existen constructores, más si existe el evento Initialize de la clase, una variable privada se crea con la sentencia private al definir una variable, propiedades de lectura/escritura se realizan con las palabras clave Get y Let, las propiedades con Property y los métodos como otros Sub o Function.

Aquí se muestra el código para la clase Rectangulo, seguidamente paso a explicar lo que significa cada cosa.

[code lang=”vb”]
‘variables privadas
Private pnombre As String
Private plargo As Double
Private pancho As Double
‘Constructora de la Clase
Private Sub Class_Initialize()
plargo = 6
pancho = 4
End Sub
‘Acceso variables publicas
Public Property Let nombre(p As String)
pnombre = p
End Property
Public Property Get nombre() As String
nombre = pnombre
End Property
Public Property Let largo(x As Double)
plargo = x
End Property
Public Property Get largo() As Double
largo = plargo
End Property
Public Property Let ancho(x As Double)
pancho = x
End Property
Public Property Get ancho() As Double
ancho = pancho
End Property
‘Propiedades
Property Get Area() As Double
Area = plargo * pancho
End Property
Property Get Perimetro() As Double
Perimetro = 2 * (plargo + pancho)
End Property
‘Metodos
Public Sub Resize(f As Double)
plargo = plargo * (1 + f)
pancho = pancho * (1 + f)
End Sub
[/code]

En el código, en primer lugar se ha declarado las variables privadas (pnombre,pancho,plargo), luego se ha delcarado el evento inicialización de una clase (Class_Initialize), que en caso no se declare los parámetros para la clase Rectangulo (largo, ancho) automáticamente toma los valores que indica Initialize.

Luego se ha declarado las propiedades de acceso lectura/escritura (Get/Let) a cada una de esas variables. Luego se ha declarado las propiedades Area y Perimetro que se calculan en función de los parámetros plargo y pancho. Finalmente se creó el método Resize, que reajusta el tamaño de plargo y pancho en un porcentaje f.

Teniendo una hoja activa escribir lo siguiente (ver figura):

Luego en un módulo normal agregar el siguiente sub.

[code lang=”vb”]
Sub readRectangulos()
Dim rg As Range
Dim oRec1 As Rectangulo
Dim oRec2 As Rectangulo
Set rg = Range("B3")
Set oRec1 = New Rectangulo
‘Se define los datos de oRec1
oRec1.largo = rg.Offset(0, 1).Value
oRec1.ancho = rg.Offset(0, 2).Value
rg.Offset(0, 3).Value = oRec1.Area
rg.Offset(0, 4).Value = oRec1.Perimetro
‘No se define los datos de oRec2
Set rg = Range("B4")
Set oRec2 = New Rectangulo
rg.Offset(0, 1).Value = oRec2.largo
rg.Offset(0, 2).Value = oRec2.ancho
rg.Offset(0, 3).Value = oRec2.Area
rg.Offset(0, 4).Value = oRec2.Perimetro
‘Aplicando Resize a oRec1
oRec1.Resize (0.25)
Set rg = Range("B5")
rg.Offset(0, 1).Value = oRec1.largo
rg.Offset(0, 2).Value = oRec1.ancho
rg.Offset(0, 3).Value = oRec1.Area
rg.Offset(0, 4).Value = oRec1.Perimetro
‘Libera memoria
Set oRec1 = Nothing
Set oRec2 = Nothing
End Sub
[/code]

Notar que se han declarado dos objetos Rectangulo oRec1 y oRec2, el primero toma datos de C3 y D3 de la hoja activa, mientras que oRec2 no toma ningun valor, mantiene los valores que se le dio en Class_Initialize para plargo y pancho. Se escriben estos valores en la hoja, luego se modifica oRec1 con el método Resize y se inscriben los valores en la hoja. Ejecutar readRectangulos para ver los resultados, puedes descargar el archivo aquí.

En el siguiente post mencionaré acerca del uso de colecciones para clases personalizadas. Suerte.

Usando módulos de clase

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *