Cómo: Exponer código a VBA en un proyecto de Visual C#
Puede exponer código de un proyecto de Visual C# a código de Visual Basic para Aplicaciones (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, consulte Llamar a código de VBA en personalizaciones de nivel de documento y 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 los proyectos de nivel de documento para las siguientes aplicaciones: Excel 2007 y Excel 2010; Word 2007 y Word 2010. Para obtener más información, vea Características disponibles por aplicación y tipo de proyecto de Office.
Exponer código en un proyecto de Visual C#
Para permitir que el código de VBA llame a código de un proyecto de Visual C#, modifique el código de forma que esté visible para COM y, a continuación, establezca la propiedad ReferenceAssemblyFromVbaProject en True en el diseñador.
Para tener acceso a un tutorial que muestra cómo llamar a un método de un proyecto de Visual C# desde VBA, vea Tutorial: Llamar a código de VBA en un proyecto de Visual C#.
Para exponer código de un proyecto de Visual C# a VBA
Abra o cree un proyecto en el nivel del 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 de VBA.
Para obtener más información sobre los formatos de archivo de documento que admiten macros, vea Llamar a código de VBA en personalizaciones de nivel de documento.
Nota
Esta característica no se puede usar en los proyectos de plantilla de Word.
Asegúrese de que el código de VBA del documento se puede ejecutar sin pedir al usuario que habilite las macros. Puede confiar en que el código de VBA se ejecute si agrega la ubicación del proyecto de Office a la lista de ubicaciones de confianza en las opciones 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 public.
Aplique los siguientes atributos ComVisibleAttribute y ClassInterfaceAttribute a la clase que expone 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 del 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 devuelva la instancia actual de la clase.
protected override object GetAutomationObject() { return this; }
Si expone una clase que no es un elemento host a 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 expone una clase denominada DocumentUtilities a VBA.
protected override object GetAutomationObject() { return new DocumentUtilities(); }
Para obtener más información acerca de los elementos de host, vea Información general sobre elementos y controles Host.
Extraiga una interfaz de la clase que expone 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 Extraer interfaz (Refactorización, C#).
Agregue la palabra clave public a la declaración de interfaz.
Haga la interfaz visible para COM agregando el siguiente atributo ComVisibleAttribute 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 en Visual Studio.
En la ventana Propiedades, seleccione la propiedad ReferenceAssemblyFromVbaProject y cambie el valor a True.
Nota
Si el libro o el documento aún no contiene código de VBA o si el código de VBA del documento no dispone 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 cuando se da esta situación.
Haga clic en Aceptar en el mensaje que aparece. Este mensaje le recuerda que si agrega código de VBA al libro o el documento al ejecutar el proyecto desde Visual Studio, el código de VBA se perderá la próxima vez que genere el proyecto. Esto se debe a que el documento de la carpeta de salida de la compilación se sobrescribe cada vez se genera el proyecto.
Llegado a este punto, Visual Studio configura el proyecto de forma 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 parte del proyecto de VBA para tener acceso a la clase que expuso a VBA. Para obtener más información, consulte Llamar a código de VBA en personalizaciones de nivel de documento.
Compile el proyecto.
Vea también
Tareas
Cómo: Crear proyectos de Office en Visual Studio
Tutorial: Llamar a código de VBA en un proyecto de Visual C#
Cómo: Exponer código a VBA en un proyecto de Visual Basic
Conceptos
Llamar a código de VBA en personalizaciones de nivel de documento