Módulos,procedimientos, subrutinas y módulos de clases

Algo que normalmente me suelen  preguntar mis alumnos es la diferencia entre módulos y procedimientos en VBA. Un módulo se utiliza para recopilar bajo un nombre un conjunto de declaraciones, instrucciones y/o procedimientos. Aplicado al ejemplo de nuestra primera macro “Hola Mundo”, el módulo lo podíamos titular

Sub saludo() ‘ Sub de subrutina, el nombre de nuestro módulo
Dim saludo As String ‘ declaración de nuestra variable
saludo = MsgBox(“Hola Mundo”, vbCritical, “Mi saludo”) ‘instrucción
End Sub

Ahora  ¿qué es un módulo de clase? Es una plantilla con la que crear objetos.

Definirá todas las características que quisieramos que nuestro objeto final tuviera. Por ejemplo: podemos tener una clase llamada clsEmpleados en el cual deseamos tener todas las características con respecto a un empleado. Como propiedades podriamos definir: nombre, apellidos, domicilio, edad, casado, sueldo, fechaIngreso, Antiguedad, etc. Como métodos podriamos tener: ActualizarDatos o GuardarCambios (donde cambios a las propiedades anteriores se grabaran fisicamente en una base de datos), ValidarDatos (donde se valida los datos siempre y cuando haya habido cambios en las propiedades segun una variable privada Cambios)…

Un módulo de clase:

 

  • Es parecido a los tipos definidos por el usuario UDT.
  • Cada módulo define un tipo de objeto.
  • En ejecución creas una instancia (o objeto) de la clase.
  • No tiene interfaz de usuario.

Los módulos de clase no presentan una interfaz gráfica al desarrollados tal y como lo hacen las formas o formularios. En los formularios puedes colocar visualmente un botón, una lista, un texto, etc. Los módulos de clase solo contiene código que definen las caracteristicas del objeto.Si se desea presentar una ventana informativa (como un Acerca de) u otro formulario, este puede pertenecer a un proyecto ActiveX DLL y mandarlo llamar mediante un método (como MostraAcercaDe) que expone alguna clase dentro del proyecto.

  • Se pueden crear múltiples instancias en ejecución.

De acuerdo a la configuración de las propiedades de la clase se pueden crear varias instancias u objetos de una misma clase. Esto es, la propiedad Instancing de un módulo de clase indica como se trataran los objetos creados utilizando un módulo de clase determinado. Tenemos la opciónde que sea una clase Privada lo cual significa que no se puede instanciar directamente por otro programa, solo el proyecto ActiveX DLL o ActiveX Exe que lo contiene una copia u objeto de este tipo de clase.

  • Proporciona métodos y propiedades.

Eventos de un módulo de clase: Initialize y Terminate

Los módulos de clase presenta dos eventos:

  • Initialize: ocurre cuando se crea una instancia de una clase. Se usa, generalmente para inicializar cualquier dato usado por la instancia de una clase en el código.
  • Terminate: ocurre cuando toda referencia a una instancia de una clase son removidas de memoria al establecer todas las variables que la refieren a un objeto a Nothing o cuando la ultima referencia al el objeto se encuentra fuera de alcance. Usado generalmente para limpiar la memoria de objetos creados dentro de esta instancia y generar un error si hay alguna anomalía o guardar alguna información del objeto, etc.

Diferencias con los módulos estándar

  • Deben ser creadas explícitamente (crear instancia) antes de usarlas.

No se puede utilizar el metodo o la propiedad de una clase si no se tiene una instancia de la misma o una referencia al componente que la contiene si la clase esta configurada como Instancing = PublicNoCreatable.

  • Puedes crear múltiples instancias de la clase.

 

Veamos un ejemplo:

  1. Inicie VBA y vaya a Menú>Insertar>Módulo de clase.
  2. Dele un nombre por ejemplo ObAplicacion
  3. Inserte el siguiente código con el que crearemos un objeto Aplicacion:

Public WithEvents MiAplicacion as Application

Si pulsa ahora F2 y despliega la lista de objetos encontrará el objeto recién creado. A continuación crearemos dos procedimientos para nuestro objeto recién creado. El primero se encargará de insertar una nueva hoja en el libro:

Private Sub MiAplicacion_NuevaHoja(ByVal wb As Workbook, ByVal sh As Object)
Dim nombrehoja As String
nombrehoja = InputBox(“Introduzca un nombre para la hoja”)
ActiveSheet.Name = nombrehoja
ActiveSheet.Move After:=Sheets(Sheets.Count)

End Sub

Con este código crearemos un nuevo libro:

Private Sub MiAplicacion_NuevoLibro(ByVal wb As Workbook)
Dim numhojas, numactual, diferencia As Integer
‘por cada nuevo libro solicitamos al usuario el número de hojas
‘caso necesario se agregan o eliminan hojas
Do
    numhojas = Application.InputBox(“¿Cuántas hojas va a necesitar?”, Type:=1)
Loop While numhojas = False
numactual = Sheets.Count
diferencia = numactual – numhojas

‘eliminamos las hojas de sobra y desactivamos alertas
Do While diferencia > 0
Application.DisplayAlerts = False
Sheets.Item(diferencia).Select
ActiveWindow.SelectedSheets.Delete
diferencia = diferencia – 1
Loop
Application.EnableEvents = True
Application.DisplayAlerts = True

End Sub

Por último vamos a conectar el módulo de clase con el objeto Aplicación:

Option Explicit

Dim app As New ObjAplicacion
Sub Inicializa_MiAplicacion()
Set app.MiAplicacion = Application

End Sub


Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: