Biblioteca Online : ¡La Suscripción ENI por 9,90 € el primer mes!, con el código PRIMER9. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí

Los objetos y colecciones en VBA

Noción de objeto

VBA es un lenguaje que permite hacer programación orientada a objetos (POO): un objeto representa una idea, concepto o entidad del mundo real, como un avión, un individuo e incluso una película. Tiene una estructura interna y un comportamiento, y se puede comunicar con sus homólogos. Los elementos que permiten describir un objeto forman lo que se llama una clase. Cada objeto que proviene de una clase es una instancia de clase. Las clases tienen propiedades, métodos y eventos.

1. Propiedades

El objeto es una entidad que podemos distinguir gracias a sus propiedades (su color o dimensiones, por ejemplo). Si tomamos como ejemplo un libro, este se caracteriza por sus propiedades: número de páginas, título, número de capítulos, editor, contenido, etc. Cada una de sus propiedades se puede especificar en cada libro, pero todos los libros tienen fundamentalmente las mismas propiedades. Algunas propiedades de los objetos se pueden modificar (velocidad de un coche, por ejemplo) y otras no (una marca de coche).

En programación con VBA, la sintaxis general de acceso a las propiedades de un objeto es la siguiente:

UnObjeto.SuPropiedad 

Aquí se accede a la propiedad SuPropiedad del objeto UnObjeto. La combinación UnObjeto.SuPropiedad tendrá el mismo comportamiento que una variable clásica, que puede tomar un valor o devolver un valor con el uso del operador =.

Por ejemplo, es posible leer el contenido SQL de una consulta de Access y visualizarla con el siguiente código:...

Modelo de objeto de Access

El objetivo de algunas de las secciones siguientes es mostrar el modelo jerárquico utilizado dentro de la aplicación Access, en forma de colecciones de objetos, que se van a explicar a continuación.

images/RI05-06.png

Colecciones en Access

A continuación, se muestran las principales colecciones que podemos manipular con VBA en Access.

Colección

Contiene una colección de

Descripción

COMAddins

COMAddin

Colección de los complementos COM

CommandBars

CommandBar

Colección de las barras de comando

Forms

Form

Colección de los formularios abiertos. Ver también CurrentProject.AllForms

Modules

Module

Colección de los módulos

Printers

Printer

Colección de las impresoras disponibles 

References

Reference

Colección de las referencias a librerías. Ver Menú: Herramientas\ Referencias

Reports

Report

Colección de estados. Ver también CurrentProject.AllReports

TempVars

TempVar

Colección de las variables temporales 

WebServices

WebService

Colección de las conexiones a servicios web

Objetos de Access

A continuación, se muestran los principales objetos que es posible manipular en el modelo Access.

Objeto

Descripción

Application

Representa la aplicación Microsoft Access activa.

AutoCorrect

Representa las opciones de corrección automática de Access.

DBEngine

Representa el motor de base de datos Microsoft Jet. Este objeto permite controlar el resto de los objetos de acceso a los datos.

DoCmd

Permite convertir en VBA las acciones de Macros.

FileDialog

Permite acceder a las funcionalidades de los cuadros de diálogo (Abrir o Guardar, por ejemplo).

LanguageSettings

Permite acceder a los argumentos lingüísticos de la aplicación.

Screen

Permite acceder a la ventana activa (formulario, estado o control).

VBE

Permite acceder al editor Visual Basic Editor.

CurrentProject

Permite acceder a diferentes objetos de Access específicos.

CurrentData

Permite acceder a varios objetos de Access de acceso a los datos.

1. El objeto Application

El objeto Application corresponde a la aplicación Microsoft Access activa.

a. Propiedades

Propiedad

Descripción

AutomationSecurity

Devuelve o define el modo de seguridad utilizado por Access durante la apertura del archivo, por programación. Este valor es una constante msoAutomationSecurity, cuya lista de valores figura en el anexo de este libro.

BrokenReference

Devuelve un booleano que indica si la aplicación tiene una o varias referencias rotas.

Build

Devuelve un valor numérico que presenta el número de copia de Microsoft Access 2021 actualmente instalada.

CodeContextObject

Devuelve un objeto que contiene una macro o el código de VB actual en ejecución.

CurrentObjectName

Devuelve el nombre del objeto activo (formulario, estado, tabla, consulta, macro o módulo).

CurrentObjectType

Devuelve un valor numérico según el tipo del objeto activo. La lista de las constantes acObjectType aparece en el anexo de este libro.

FeatureInstall

Devuelve o define el modo de administración de las llamadas a métodos o las propiedades que necesitan funcionalidades no instaladas en Microsoft Access.

IsCompiled

Devuelve un booleano que indica si el proyecto VB de la aplicación está compilado.

MenuBar

Devuelve o define la barra de menús que se utilizará por la base de datos.

Name

Devuelve el nombre de la base de datos de Microsoft Access.

Parent

Devuelve el objeto padre de la base de datos.

ProductCode

Devuelve el identificador único de la aplicación Microsoft Access.

ShortcutMenuBar

Devuelve o define el menú contextual que se mostrará cuando el usuario haga un clic derecho con el ratón.

UserControl

Devuelve un booleano que indica si la aplicación se ha ejecutado por un usuario o si se trata de un control automático.

Version

Devuelve el número de la versión de Access (17.0).

Visible

Devuelve o define un booleano, que indica si la aplicación es visible o queda oculta por la ventana. 

b. Métodos que operan sobre las bases de datos de Access

Método

Descripción

CloseCurrentDatabase

Permite cerrar una base de datos de Access abierta automáticamente en la misma aplicación. 

CompactRepair

Compacta y repara la base de datos especificada. Devuelve un booleano que indica el resultado de la compactación.

ConvertAccessProject...

Manipular los objetos en VBA

1. Instrucción Set

Al contrario que la asignación de un valor a una variable de tipo sencillo (numérico, booleano, fecha, etc.), la asignación de un valor a una variable cuyo tipo es un objeto se realiza con la palabra clave Set.

La sintaxis general es la siguiente:

Set UnObjeto = [New] InstrucciónGeneraElObjeto 

La palabra clave New permite crear una nueva instancia de un objeto. Si el objeto ya existe, no es necesario utilizar esta palabra clave. InstrucciónGeneraElObjeto puede corresponder al nombre de un objeto o a una variable de objeto del mismo tipo.

Por ejemplo aquí, si se desea asignar a la variable tbl la tabla ENI_CONTRATO CON, el código sería el siguiente:

Dim tbl As TableDef  
Set tbl = CurrentDb.TableDefs("ENI_CONTRATO CON") 

Reinstanciación de la variable objeto

Es posible instanciar de nuevo una variable objeto, gracias a la siguiente instrucción:

Set UnObjeto = Nothing 

2. Instrucción With/End With

A la hora de modificar las diferentes propiedades de un objeto, puede ser largo y pesado para el programador repetir la ruta de acceso a este objeto, para cada propiedad que se desea modificar.

Por ejemplo, con las líneas de operación de un formulario:

'El formulario F_EMPLEADO_Detalle está abierto 
Forms("F_EMPLEADO_DETALLE").Caption = "Nueva ficha" 
Forms("F_EMPLEADO_DETALLE").Controls("EMP_INICIO_TRABAJO").Value=Fecha ...

Las clases de objetos

Una clase es un modelo que utilizará el programa para crear nuevos objetos. Los objetos tienen propiedades similares a su modelo, podrán realizar las mismas acciones que su modelo y podrán actuar ante los mismos eventos que los de su modelo.

En función de las necesidades, cada objeto podrá tener sus características propias (título de un libro, número de páginas, precio, etc.) y un comportamiento específico. Cualquier objeto de Access viene de una clase.

1. Los módulos de clases

Para manipular los objetos que el desarrollador creará, se podrán utilizar los módulos de clases.

Los módulos de clases se definen de la siguiente manera:

  • Los módulos de clases tienen el nombre del objeto que definen;

  • Tienen procedimientos y funciones públicos Public Sub y Public Function, que definen los métodos propios del objeto;

  • Tienen las funciones Property Get, que sirven para leer los valores de sus propiedades, así como los procedimientos Property Set/Property Let para definir los valores de estas propiedades.

Una vez que se definen estos elementos en un módulo de clase, podemos crear un nuevo objeto correspondiente a esta definición. La sintaxis general para conseguirlo es la siguiente:

Dim NombreObjeto As New NombreDeClasePersonalizada 

La llamada a los módulos de clase sigue estando restringida solo a los desarrolladores más experimentados.

En los siguientes ejemplos, se define una clase que representa un contrato.

Empezamos con una clase llamada clsContrato. En el menú Insertar, se selecciona Módulo de clase.

images/RI05-41_1.png

En la zona Propiedades, se modifica el nombre de la clase como clsContrato.

Images/cap5_pag41.png

2. Las propiedades

Las propiedades se corresponden con las instrucciones que permiten leer y definir las características de un objeto.

La creación de una propiedad se desarrolla en dos etapas: se define una variable privada dentro de la clase y después se definen, los bloques de propiedades Property Get y Property Let. La lectura de la propiedad se hace por medio de Property Get, y su escritura con Property Let.

En la interfaz de VBE, se activa el módulo de clase y seleccione el menú Insertar - Procedimiento:

images/RI05-42_1.png

Podemos crear la propiedad IDCliente indicándolo en la interfaz, como se muestra a continuación:

Images/cap5_pag42.png

Adaptando el código, al final se tienen las propiedades IDCliente, FechaContrato y Etiqueta definidas como sigue:

'Declaración de las variables privadas  
Private pIDCliente As Long  
Private pFechaContrato As Date  
Private pEtiqueta As String  
 
'El identificador ID del contrato 
Public Property Get ID() As Long  
    ID = pID  
End Property  
 
Public Property Let ID(newID As Long)  
    pID = newID  
End Property  
 
'El identificador ID de Cliente  
Public Property Get IDCliente() As  
    IDCliente = pIDCliente  
End Property  
 
Public Property Let IDCliente(newIDCliente As Long)  
    If newIDCliente > 0 Then  
        pIDCliente = newIDCliente  
    Else  
        Err.Raise Number :=vbObjectError...