Exponer código a VBA en un proyecto de Visual C#
Puede exponer código en un proyecto de Visual C# para Visual Basic para Aplicaciones código (VBA) si desea que los dos tipos de código interactúen entre sí.
El proceso de Visual C# es diferente del proceso de Visual Basic. Para obtener más información, vea Cómo: Exponer código a VBA en un proyecto de Visual Basic.
Se aplica a: la información de este tema se aplica a proyectos de nivel de documento para Excel y Word. Para obtener más información, consulte Características disponibles por aplicación de Office lication y tipo de proyecto.
Exponer código en un proyecto de Visual C#
Para habilitar el código VBA para llamar al código en un proyecto de Visual C#, modifique el código para que sea visible para COM y, a continuación, establezca la propiedad ReferenceAssemblyFromVbaProject en True en el diseñador.
Para ver un tutorial que muestra cómo llamar a un método en un proyecto de Visual C# desde VBA, vea Tutorial: Llamada a código desde VBA en un proyecto de Visual C#.
Para exponer código en un proyecto de Visual C# a VBA
Abra o cree un proyecto de nivel de documento basado en un documento de Word, un libro de Excel o una plantilla de Excel que admita macros y que ya contenga código VBA.
Para obtener más información sobre los formatos de archivo de documento que admiten macros, vea Combinar VBA y personalizaciones de nivel de documento.
Nota:
Esta característica no se puede utilizar en proyectos de plantilla de Word.
Asegúrese de que el código VBA del documento puede ejecutarse sin pedir al usuario que habilite las macros. Puede confiar en la ejecución de código VBA si agrega la ubicación del proyecto de Office a la lista de ubicaciones de confianza en la configuración del Centro de confianza de Word o Excel.
Agregue el miembro que desea exponer a VBA a una clase pública del proyecto y declare el nuevo miembro como público.
Aplique los atributos y ClassInterfaceAttribute siguientes ComVisibleAttribute a la clase que está exponiendo a VBA. Estos atributos hacen que la clase sea visible para COM, pero sin generar una interfaz de clase.
[System.Runtime.InteropServices.ComVisible(true)] [System.Runtime.InteropServices.ClassInterface( System.Runtime.InteropServices.ClassInterfaceType.None)]
Invalide el método GetAutomationObject de una clase de elemento host en el proyecto para devolver una instancia de la clase que expone a VBA:
Si expone una clase de elemento host a VBA, invalide el método GetAutomationObject que pertenece a esta clase y devuelve la instancia actual de la clase.
protected override object GetAutomationObject() { return this; }
Si expone una clase que no es un elemento host en VBA, invalide el método GetAutomationObject de cualquier elemento host del proyecto y devuelva una instancia de la clase de elemento no host. Por ejemplo, en el código siguiente se supone que se expone una clase denominada
DocumentUtilities
a VBA.protected override object GetAutomationObject() { return new DocumentUtilities(); }
Para obtener más información sobre los elementos host, consulte Información general sobre los elementos host y los controles host.
Extraiga una interfaz de la clase que está exponiendo a VBA. En el cuadro de diálogo Extraer interfaz , seleccione los miembros públicos que desea incluir en la declaración de interfaz. Para obtener más información, consulte Extracción de refactorización de interfaz.
Agregue la palabra clave public a la declaración de interfaz.
Haga que la interfaz sea visible para COM agregando el siguiente ComVisibleAttribute atributo a la interfaz.
[System.Runtime.InteropServices.ComVisible(true)]
Abra el documento (para Word) o la hoja de cálculo (para Excel) en el diseñador de Visual Studio.
En la ventana Propiedades , seleccione la propiedad ReferenceAssemblyFromVbaProject y cambie el valor a True.
Nota:
Si el libro o documento aún no contiene código VBA o si el código VBA del documento no es de confianza para ejecutarse, recibirá un mensaje de error al establecer la propiedad ReferenceAssemblyFromVbaProject en True. Esto se debe a que Visual Studio no puede modificar el proyecto de VBA del documento en esta situación.
Haga clic en Aceptar en el mensaje que se muestra. Este mensaje le recuerda que si agrega código VBA al libro o documento al ejecutar el proyecto desde Visual Studio, el código VBA se perderá la próxima vez que compile el proyecto. Esto se debe a que el documento de la carpeta de salida de compilación se sobrescribe cada vez que se compila el proyecto.
En este momento, Visual Studio configura el proyecto para que el proyecto de VBA pueda llamar al ensamblado. Visual Studio también agrega un método denominado
GetManagedClass
al proyecto de VBA. Puede llamar a este método desde cualquier lugar del proyecto de VBA para acceder a la clase que ha expuesto a VBA.Compile el proyecto.