Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Introducción
Una de las ventajas de usar la programación orientada a objetos (OOP) es la reutilización del código. La manera típica de hacerlo es crear una instancia de un objeto de una clase ya definida con la sintaxis Set variable = New ClassName . Los programadores de VBA usan estos objetos cada vez que usan cualquier objeto dentro de su plataforma de aplicación. Algunos ejemplos son el objeto Workbook en Excel, el objeto Presentation en PowerPoint o el objeto Document en Word. Además, los programadores de VBA usan formularios de usuario, que son objetos que pertenecen a un tipo especial de clase. Todos estos objetos se definen en bibliotecas que están fuera del proyecto del desarrollador de VBA. Haga clic en el | Herramientas Referencias... elemento de menú para ver la lista de bibliotecas externas que el Editor de Visual Basic (VBE) establece automáticamente en nombre del desarrollador.
En esta sugerencia, exploraremos cómo acceder a una clase personalizada en una biblioteca externa creada por nosotros. Aunque el ejemplo siguiente se basa en Excel 2003, las sugerencias se aplican a otros productos de MS Office que admiten VBA y se aplican a las versiones 2000 o posteriores.
Se trata de una sugerencia de nivel intermedio/avanzado y supone un cierto nivel de confort con la programación VB(A).
Hay dos pasos de configuración distintos necesarios para que un proyecto de VBA pueda acceder a un objeto declarado en el módulo de clase de otro proyecto vba. El primer conjunto hace que el módulo de clase se pueda usar fuera del proyecto en el que se declara y proporciona un medio por el que se puede crear una instancia de un objeto. El segundo conjunto se ocupa de cómo el proyecto cliente usa esta clase.
Configuración del proyecto que contiene la definición de clase
De forma predeterminada, un módulo de clase tiene la propiedad Instancing establecida en Private. Esto significa que solo el proyecto que contiene la definición de la clase puede crear una instancia de un objeto de esa clase. La única otra opción que admite VBA es Public, no creatable. Lo que significa es que un proyecto externo puede usar un objeto de esta clase, pero no puede crear una instancia de él. Puede parecer extraño, pero así es. La manera de cambiar la propiedad del valor predeterminado es seleccionar el módulo de clase en el Explorador de proyectos de VBE, seleccionar el módulo de clase de interés, acceder a la ventana Propiedades (si es necesario, usar F4 para que sea visible) y cambiar la propiedad Instancing a 2-PublicNotCreatable.
Para seguir el ejemplo de esta sugerencia, cree un módulo de clase, asígnele el nombre clsEmployee, cambie su propiedad Instancing y agréguele el código siguiente.
Option Explicit
Dim sName As String
Property Get Name() As String
Name = sName
End Property
Property Let Name(uName As String)
sName = uName
End Property
A continuación, dado que la propiedad Instancing de la clase es PublicNotCreatable, el proyecto debe proporcionar una manera de que un cliente cree una instancia del objeto. Agregue una nueva función en un módulo estándar:
Option Explicit
Public Function New_clsEmployee() As clsEmployee
Set New_clsEmployee = New clsEmployee
End Function
donde clsEmployee es el nombre de la clase de interés. Además, no debe ser un módulo privado.
Un cambio final hará que la vida sea un poco más fácil. Cambie el nombre del proyecto de VBAProject predeterminado a ClassProvider. Para ello, seleccione el proyecto en el Explorador de proyectos de VBE y, a continuación, seleccione Herramientas | Propiedades de VBAProject... | Pestaña General | y en el campo Nombre del proyecto , escriba ClassProvider.
Guarde este archivo, por ejemplo, como Clase Provider.xls.
A continuación, pase al proyecto de cliente.
Configuración del proyecto que usará la clase exportada
El proyecto cliente usa la clase en gran medida como lo haría con una clase definida en cualquier otra biblioteca externa (como un formulario de usuario), con una diferencia clave. Dado que no puede crear una instancia de un objeto de esa clase, debe usar la función New_clsEmployee() declarada anteriormente. Al igual que con cualquier otra biblioteca externa, decida si desea usar el enlace anticipado o el enlace en tiempo de ejecución. En el código siguiente se muestran ambas cosas. Recuerde que para usar el código de enlace anticipado, el proyecto de cliente debe incluir una referencia (Herramientas | Referencias...) al archivo de Provider.xlsde clase .
Option Explicit
Sub UseExportedClass_EarlyBinding()
Dim anEmployee As ClassProvider.clsEmployee
Set anEmployee = ClassProvider.New_clsEmployee
anEmployee.Name = "Tushar Mehta"
MsgBox anEmployee.Name
End Sub
Sub UseExportedClass_LateBinding()
Dim anEmployee As Object
Set anEmployee = Application.Run("'g:\temp\class provider.xls'!new_clsEmployee")
anEmployee.Name = "Tushar Mehta"
MsgBox anEmployee.Name
End Sub
Nota final
La biblioteca externa no tiene que ser un archivo guardado normalmente. Puede estar en un complemento específico de la aplicación (como un archivo guardado con el sufijo .xla o .ppa). Recuerde que este tipo de complemento no se abre a través de la | de archivo normal Abierto... pero cargado con el | Tools Complementos... Comando.