Tutorial y ejemplos del módulo de clase VBA

Este tutorial le enseñará sobre los módulos de clase en VBA. Aprenderá qué son y cómo utilizarlos.

Módulos de clase VBA: introducción

Cuando inserta módulos en el Editor de Visual Basic (VBE) para ingresar su código, es posible que haya notado que también puede insertar lo que se llama un "Módulo de clase".

Módulos de clase frente a módulos

Los módulos de clase funcionan de una manera muy diferente a los módulos ordinarios, ya que facilitan la creación de un Modelo de objetos componentes (COM) que luego se puede usar dentro de su código VBA normal

Efectivamente, crea un objeto que funciona de la misma manera que un objeto integrado de Excel, como "Hojas de trabajo". En el objeto de hojas de trabajo, tiene una serie de propiedades y métodos que le permiten obtener la cantidad de hojas de trabajo dentro de un libro de trabajo o cada nombre individual de una hoja de trabajo, o mucha otra información.

Cuando crea un nuevo objeto de esta manera, está creando un bloque de construcción que se puede usar en cualquier lugar dentro de VBA. El objeto tiene una serie de propiedades y métodos a los que puede acceder su código VBA desde cualquier lugar dentro del libro de trabajo sin tener que volver a escribir el código nuevamente.

Además de hacer referencia a su nuevo objeto desde un módulo VBA estándar, también puede usarlo en el código detrás de un UserForm que es parte de su aplicación personalizada

También puede usarlo donde haya colocado controles Active X en una hoja de trabajo, como un botón de comando o un menú desplegable. Todos estos controles usan VBA, y su nuevo objeto se puede incorporar fácilmente al código de evento para estos controles.

También puede convertir su objeto en un complemento de Excel. Su objeto estará disponible automáticamente para otros usuarios que tengan ese complemento cargado. Esto agrega su propia arquitectura de varios niveles a su aplicación de Excel

Excel es una aplicación de varios niveles. Existe la capa de servicios al cliente, que controla la ventana de la hoja de trabajo real con la que el usuario está familiarizado. El modelo de objetos de Excel es la siguiente capa debajo. Presione F2 en un módulo VBA y podrá ver la gran cantidad de objetos y miembros de esos objetos que son el motor de Excel. Tenga en cuenta que su nuevo objeto también se mostrará aquí.

Finalmente, debajo de todo esto, tiene la capa de servicios de datos que contiene todos los datos que ha ingresado en las hojas de trabajo y celdas. Excel accede a esto utilizando el modelo de objetos de Excel.

La creación de un módulo de clase le permite ampliar el módulo de objetos de Excel con sus propios objetos y miembros personalizados

Este artículo le explica cómo crear una jerarquía simple de objetos usando módulos de clase.

Ventajas de usar módulos de clase

  1. Puede desarrollar un bloque de construcción robusto que se puede utilizar en cualquier número de aplicaciones de Excel diferentes.
  2. Una vez que se prueba a fondo, se puede confiar en que siempre producirá los resultados correctos de la misma manera que los objetos de Excel integrados.
  3. Si se realizan actualizaciones al código en otra parte de la aplicación, el nuevo objeto seguirá funcionando de la misma manera.
  4. Puede utilizar su nuevo objeto en otras aplicaciones de Excel como complemento
  5. Los objetos se pueden reutilizar en otras aplicaciones y ayudan a depurar

Desventajas de usar módulos de clase

  1. Pueden ser difíciles de crear y comprender.
  2. Las convenciones de nomenclatura son muy importantes porque esto es lo que verá cuando use su objeto dentro de un módulo normal.
  3. Si no ha creado un módulo de clase antes, pueden ser difíciles de entender y hay una curva de aprendizaje empinada.
  4. Imposible realizar cambios en tiempo de ejecución; debe restablecer el proyecto.
  5. Si las propiedades y las variables privadas tienen el mismo nombre, pueden producirse bucles infinitos que produzcan errores

Insertar un módulo de clase

Seleccione Insertar | Módulo de clase del menú VBE (Editor de Visual Basic). El nuevo módulo de clase se llamará automáticamente "Clase 1", pero debe cambiarse inmediatamente por el nombre que utilizará para su objeto.

Cambia el nombre en la ventana Propiedades donde apunta la flecha. Simplemente escriba su nuevo nombre, y esto cambiará en la colección Class Modules

Si la ventana Propiedades no está visible, seleccione Ver | Propiedades en el menú VBE o presione F4

Llame a su nuevo módulo de clase "MyItem" y haga doble clic en el nombre en la vista de árbol en el Explorador de proyectos para mostrar la ventana de código correspondiente.

Crear un elemento de objeto

Este ejemplo creará un objeto de nivel superior llamado "MyItems" con un objeto miembro debajo llamado "MyItem" que contendrá los datos individuales de cada elemento. Una vez creado, funcionará de la misma manera que un objeto de Excel integrado. Por ejemplo, hay un objeto llamado "Hojas de trabajo" que es una colección de cada hoja de trabajo dentro de su libro de trabajo. También hay un objeto llamado "Hoja" que representa cada hoja de trabajo individual dentro de su libro de trabajo y contiene todas las propiedades y métodos para cada hoja de trabajo. Este objeto se relaciona con el objeto de colección "Hojas de trabajo".

Puede recorrer la colección de "Hojas de trabajo", viendo cada "Hoja" por turno. De la misma manera, podrá recorrer la colección "MyItems" viendo las propiedades que creó en el miembro "Myitem".

Lo primero que debe hacer es crear el subobjeto para el nivel de miembro que contendrá los elementos reales dentro de la colección del objeto de nivel superior. Este es el equivalente de los miembros (por ejemplo, nombre, visible, recuento) dentro del objeto "Hoja" en Excel. Este código se ingresa en el módulo de clase llamado "MyItem"

Los módulos de clase tienen propiedades y métodos. Las propiedades son efectivamente como variables, en el sentido de que contienen valores de datos como variables, y los métodos son como subrutinas o funciones.

En el subobjeto vamos a crear dos propiedades para el objeto: Elemento y Detalle.

Inicialmente, se deben declarar dos variables de cadena para contener los valores de las propiedades:

12 Elemento privado como cadenaMDetail privado como cadena

Estos deben declararse en la sección Declaraciones en la parte superior del código del módulo de clase para que se puedan usar en todas las subrutinas a lo largo del módulo.

Deben recibir nombres únicos para que sean diferentes de las propiedades que vamos a crear, por lo que se ha puesto una "m" (para miembro) delante de cada nombre.

Las variables se declaran como privadas para que nadie que utilice el objeto las pueda ver. Son variables de trabajo para su uso dentro del código de objeto y no forman parte del objeto final.

El siguiente paso es configurar el código para dar acceso a las dos propiedades. Esto se hace mediante una declaración Property Let y Property Get para cada propiedad. Deben ser públicos; de lo contrario, el objeto de nivel superior no tendrá propiedades visibles.

123456789101112131415 Propiedad pública Let Item (vdata As String)mItem = vdataPropiedad finalPropiedad pública Obtener elemento () como cadenaItem = mItemPropiedad finalDetalle de alquiler de propiedad pública (vdata como cadena)mDetail = vdataPropiedad finalPropiedad pública Obtener detalle () como cadenaDetalle = mDetailPropiedad final

Este código crea los medios para leer y escribir valores en las dos propiedades (Elemento y Detalle) utilizando las dos variables privadas que se definieron en la sección de declaraciones del módulo.

El parámetro "vdata" se utiliza para pasar datos a la propiedad en cuestión.

Es importante que cada propiedad tenga una declaración "Let" y "Get" y que el nombre de la propiedad sea el mismo en cada caso. Podría terminar con dos propiedades diferentes si se escribe mal: ¡una en la que puede leer y otra en la que puede escribir!

Para ayudar a crear este código, puede utilizar Insertar | Procedimiento en el menú VBE para crear un esqueleto de código que creará el código inicial para las propiedades "Get" y "Let" para un nombre de propiedad dado

Esto mostrará una ventana emergente en la que escribe el nombre de la propiedad y selecciona "Propiedad" en los botones de opción:

Haga clic en "Aceptar" y el código esqueleto se agregará al módulo de la clase:

1234567 Propiedad pública Obtener MyProperty () como variantePropiedad finalPropiedad pública Let MyProperty (ByVal vNewValue como variante)Propiedad final

Esto evita errores sobre los nombres de las propiedades. Simplemente agregue su código entre las declaraciones "Propiedad pública" y "Propiedad final".

Ahora tiene un objeto llamado "MyItem" que contendrá todos los datos para este ejercicio.

¿Cansado de buscar ejemplos de código VBA? ¡Prueba AutoMacro!

Crear una colección

La siguiente etapa es crear un objeto de nivel superior como un objeto de colección para dar acceso a las propiedades que ha configurado en el objeto "MyItem".

Nuevamente, debe definir un objeto de trabajo para que actúe como el objeto de colección de la misma manera que definió las dos variables de cadena en el objeto "MyItem".

1 Elementos privados como colección

Nuevamente, esto tiene que tener un nombre único, por lo que hay una 'm' (objeto miembro) delante del nombre, y también se declara como 'Privado' para que no aparezca cuando se está utilizando el nuevo objeto. usó

A continuación, debe completar el código Class_Initialize. Esto se ejecuta cuando usa por primera vez el objeto dentro de su código y determina qué valores se cargarán en el objeto

Puede acceder a esta subrutina seleccionando "Clase" en el primer menú desplegable e "Inicializar" en el segundo menú desplegable de la ventana del módulo.

12345678910 Private Sub Class_Initialize ()Atenuar objItem como MyItemEstablecer mItems = Nueva colecciónPara n = 1 a 3Establecer objItem = New MyItemobjItem.Item = Hojas de trabajo ("Hoja1"). Rango ("a" & n) .ValorobjItem.Detail = Hojas de trabajo ("Hoja1"). Rango ("b" & n) .ValormItems.Add objItemSiguiente nEnd Sub

El código configura un objeto llamado "objItem" usando la definición de "MyItem" que construimos como un módulo de clase anteriormente.

Luego crea una nueva colección basada en el objeto "mItems" definido anteriormente.

Repite los valores que se encuentran en la Hoja1 del libro de trabajo y los coloca en las propiedades que creamos para el objeto "MyItem". Tenga en cuenta que cuando utiliza "objitem", aparece un menú desplegable que muestra las dos propiedades, exactamente como si estuviera utilizando un objeto de Excel integrado.

Luego, el objeto de artículo se agrega al objeto de colección que ahora contiene todos los datos en los valores de propiedad.

Los datos de entrada no tienen que tomarse de una hoja de trabajo. Pueden ser valores estáticos, o pueden provenir de una conexión a una base de datos como Microsoft Access o SQL Server, o pueden provenir de otra hoja de trabajo.

Luego, debe agregar una función pública llamada "Elemento"

123 Elemento de función pública (índice como entero) como MyItemEstablecer elemento = mItems.Item (índice)Función final

Esto le permite hacer referencia a objetos individuales dentro del objeto de colección por su número de índice. Esta función proporciona un "espejo" de lo que está sucediendo en la colección "mMyItems" en segundo plano.

También necesitará agregar una propiedad llamada "Count" para que su código pueda establecer cuántos objetos "MyItem" hay en la colección "MyItems", en caso de que desee recorrerlo en iteración.

123 Propiedad pública Obtener recuento () siempre queCount = mItems.CountPropiedad final

En este caso, solo necesita una propiedad "Obtener" porque es de solo lectura. Utiliza la colección mItems porque ya tiene una propiedad de recuento incorporada.

Ahora tiene un objeto (MyItems) con una jerarquía completa definida por el objeto "MyItem"

Para que todo funcione, ahora debe completar una hoja de trabajo (Hoja1) con datos para que la rutina Class Initialize pueda recopilarlos en el objeto

Su hoja de cálculo debería verse así:

Usando su nuevo objeto

Ahora puede usar su objeto Collection (MyItems) dentro de un módulo estándar de Excel VBA. Ingrese el siguiente código:

12345678 Sub test_object ()Atenuar MyClass como nuevos MyItems, n como enteroMsgBox MyClass.CountPara n = 1 a MyClass.CountMsgBox MyClass.Item (n) .ItemMsgBox MyClass.Item (n) .DetailSiguiente nEnd Sub

Este código crea un objeto llamado "MyClass" basado en el objeto de colección que creó llamado "MyItems". Esto activa la rutina "Inicializar" que extrae todos los datos de la hoja de trabajo al objeto.

Muestra el número de elementos de la colección y luego recorre la colección mostrando el texto "Elemento" y el texto "Detalle". Notará que cuando se refiere al objeto "MyClass" en su código, verá una lista de las dos propiedades de los miembros que ayuda a agregar la propiedad correcta.

Si cambia el valor de una celda en los datos de entrada en la hoja de cálculo, esto se actualizará automáticamente en la colección cuando vuelva a ejecutar el código anterior, ya que cuando dimensiona el objeto, la rutina de inicialización se ejecuta y recoge todos los datos nuevos.

Si usa la palabra "Estático" en lugar de "Atenuar", la rutina de inicialización no se ejecuta y los valores antiguos se mantienen, siempre que el código se ejecute continuamente. Si los datos de la hoja de cálculo cambian, esto no se reflejará en el objeto.

1234567 Sub Test_Static ()Myclass estático como New MyItems, n como enteroPara n = 1 a Myclass.CountMsgBox Myclass.Item (n) .ItemMsgBox Myclass.Item (n) .DetailSiguiente nEnd Sub

Resumen de la creación de un objeto mediante un módulo de clase

Como ha visto, crear una jerarquía de módulos de clase para usar como objeto es un negocio bastante complicado, incluso para una estructura tan simple como el ejemplo que se proporciona aquí. ¡El margen para cometer errores es enorme!

Sin embargo, tiene enormes ventajas al hacer que su código sea más elegante y más fácil de leer. También es más fácil compartirlo con otras aplicaciones y desarrolladores de Excel convirtiéndolo en un complemento.

En este ejemplo de cómo crear un objeto para contener datos, sería un enfoque normal crear una matriz multidimensional para contener los datos de la hoja de cálculo de varias columnas, y escribiría una línea de código para actualizar o leer cada elemento en la matriz. Esto probablemente terminaría siendo bastante complicado y fácilmente se podrían cometer errores al abordar los diversos elementos.

Con su nuevo objeto, simplemente puede referirse a él y a los miembros que ha creado debajo de él para contener los datos.

Además, si los datos cambian en la hoja de cálculo (o en una base de datos vinculada si la ha utilizado como fuente de datos dentro de su módulo de clase), siempre que utilice la instrucción 'Dim', se llamará a la rutina de inicialización y los datos se actualizarán instantáneamente. . No es necesario escribir código para volver a llenar su matriz.

Uso de un módulo de clase para crear un repositorio de variables

Cuando escribe código VBA, usa variables por todas partes, todas con diferentes alcances. Algunos solo pueden definirse para un procedimiento en particular, algunos para un módulo en particular y algunos pueden ser variables globales que se pueden usar en toda la aplicación.

Puede crear un módulo de clase que contendrá una gran cantidad de variables y, debido a que es un objeto, se puede usar en cualquier lugar dentro de su código, incluso en un formulario de usuario o en un control Active X que haya colocado en una hoja de trabajo.

La ventaja añadida es que cuando se refiere a su objeto variable, verá una lista de todos los nombres de variable contenidos en el objeto ordenados en orden ascendente.

Para crear un repositorio, debe insertar un nuevo módulo de clase. Para ello, utilice Insertar | Módulo de clase desde el menú VB Editor

Cambie el nombre a "MyVariables" utilizando la misma metodología que se discutió anteriormente en este artículo.

Ingrese el siguiente código:

12345678910111213141516 MV privado como variantePropiedad pública Obtener Variable1 () como varianteVariable1 = mVPropiedad finalPropiedad pública Let Variable1 (ByVal vNewValue como variante)mV = vNewValuePropiedad finalPropiedad pública Obtener Variable2 () como varianteVariable1 = mVPropiedad finalPropiedad pública Let Variable2 (ByVal vNewValue como variante)mV = vNewValuePropiedad final

Este código configura las propiedades "Let" y "Get" para dos variables ("Variable1" y "Variable2"). Las propiedades Let y Get son necesarias para cada una de sus variables para que sean de lectura / escritura

Puede usar sus propios nombres para las variables en lugar de los de muestra en este código, y puede agregar más variables, asegurándose de que cada nueva variable tenga una declaración "Let" y "Get".

La declaración privada de la variable "mV" es para crear una variable de trabajo que solo se usa dentro del módulo de clase para transferir valores.

Para usar el repositorio de variables, ingrese el siguiente código en un módulo estándar:

123456 VarRepo global como nuevas MyVariablesSub TestVariableRepository ()MsgBox VarRepo.Variable1VarRepo.Variable1 = 10MsgBox VarRepo.Variable1End Sub

Este código crea una instancia global de su objeto "MyVariables" que creó. Solo necesita hacer esta declaración una vez desde cualquier lugar dentro de su código.

El código primero muestra el valor de "Variable1" para mostrar que está vacío.

Se asigna un valor de 10 a "Variable1" y luego se muestra el nuevo valor dentro del objeto para mostrar que esta propiedad ahora tiene este valor.

Debido a que la instancia del objeto "MyVariables" se ha definido globalmente, puede hacer referencia a cualquiera de las variables definidas dentro del objeto desde cualquier lugar dentro de su código.

Esto tiene una gran ventaja en el sentido de que si desea utilizar sus variables en cualquier lugar de su código, solo necesita definir una variable global, y desde esa instancia, todas las variables se pueden acceder y modificar libremente a lo largo de su código.

Convertir su objeto en un complemento

Hasta ahora, el código para la creación del objeto está dentro de la aplicación de su libro de trabajo. Sin embargo, si desea poder compartir su objeto con otros desarrolladores o en otras aplicaciones de Excel propias, puede convertirlo en un complemento.

Para hacer esto, todo lo que debe suceder es guardar el archivo como un complemento. Seleccione Archivo | Guardar como y aparecerá una ventana del navegador.

Seleccione el tipo de archivo como Complemento (.xlam) en el menú desplegable de tipo de archivo y haga clic en Aceptar. El archivo se guardará en la carpeta de complementos de forma predeterminada, pero puede cambiar la ubicación.

Luego, puede incorporar el archivo de complemento en sus aplicaciones de Excel, lo que le brinda la flexibilidad de hacer uso de su nuevo objeto

Para incluir su nuevo complemento en Excel, haga clic en Archivo en la cinta de Excel y luego haga clic en Opciones en la parte inferior del panel de la izquierda.

Haga clic en "Complementos" en el panel de la izquierda en la ventana emergente que aparece. En la parte inferior de la ventana hay un botón marcado "Ir"

Haga clic en este y aparecerá una ventana emergente "Complemento". Haga clic en "Examinar" y luego busque su archivo de complemento. A continuación, podrá hacer referencia a su objeto en su código.

Va a ayudar al desarrollo del sitio, compartir la página con sus amigos

wave wave wave wave wave