Tutorial: Llamar a código de VBA en un proyecto de Visual C#
En este tutorial se muestra cómo llamar a un método en una personalización de nivel de documento para Microsoft Office Excel desde código de Visual Basic para Aplicaciones (VBA) en el libro.El procedimiento implica tres pasos básicos: agregar un método a la clase de elemento host Sheet1, exponer el método a código de VBA en el libro y, a continuación, llamar al método desde código de VBA en el libro.
Se aplica a: La información de este tema se aplica a los proyectos de nivel de documento para las siguientes aplicaciones: Excel 2013 y Excel 2010; Word 2013 y Word 2010. Para obtener más información, vea Características disponibles por aplicación y tipo de proyecto de Office.
Aunque en este tutorial se usa específicamente Excel, los conceptos que se describen son asimismo aplicables a los proyectos de nivel de documento para Word.
En este tutorial se muestran las tareas siguientes:
Crear un libro que contenga código de VBA.
Confiar en la ubicación del libro utilizando el Centro de confianza en Excel.
Agregar un método a la clase de elemento host Sheet1.
Extraer una interfaz para la clase de elemento host Sheet1.
Exponer el método a código de VBA.
Llamar al método desde código de VBA.
[!NOTA]
Es posible que su equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de usuario de Visual Studio en las siguientes instrucciones.La edición de Visual Studio que tenga y la configuración que esté usando determinan estos elementos.Para obtener más información, vea Valores de configuración de Visual Studio.
Requisitos previos
Necesita los componentes siguientes para completar este tutorial:
-
Una edición de Visual Studio 2012 que incluye las herramientas para desarrolladores de Microsoft Office. Para obtener más información, vea [Configurar un equipo para desarrollar soluciones de Office](bb398242\(v=vs.110\).md).
- Excel 2013 o Excel 2010.
Crear un libro que contenga código de VBA
El primer paso consiste en crear un libro habilitado para macros que contenga una macro de VBA sencilla.Antes de exponer el código en una personalización a VBA, el libro ya debe contener código de VBA.De lo contrario, Visual Studio no puede modificar el proyecto de VBA para que el código de VBA pueda llamar al ensamblado de personalización.
Si ya tiene un libro que contiene código de VBA que desea utilizar, puede omitir este paso.
Para crear un libro que contenga código de VBA
Inicie Excel.
Guarde el documento activo como un Libro de Excel habilitado para macros (*.xlsm) con el nombre WorkbookWithVBA.Guárdelo en una ubicación conveniente, como el escritorio.
En la cinta de opciones, haga clic en la ficha Desarrollador.
[!NOTA]
Si la ficha Desarrollador no está visible, debe mostrarla primero.Para obtener más información, vea Cómo: Mostrar la pestaña Programador en la cinta de opciones.
En el grupo Código, haga clic en Visual Basic.
Se abre el Editor de Visual Basic.
En la ventana Proyecto, haga doble clic en ThisWorkbook.
Se abre el archivo de código para el objeto ThisWorkbook.
Agregue el siguiente código de VBA al archivo de código.Este código define una función simple que no hace nada.El único propósito de esta función es asegurarse de que existe un proyecto de VBA en el libro.Esto se requiere para pasos posteriores de este tutorial.
Sub EmptySub() End Sub
Guarde el documento y salga de Excel.
Crear el proyecto
Ahora puede crear un proyecto de nivel de documento para Excel que utilice el libro habilitado para macros creado anteriormente.
Para crear un nuevo proyecto
Inicie Visual Studio.
En el menú Archivo, elija Nuevo y haga clic en Proyecto.
En el panel de plantillas, expanda **Visual c#**y, a continuación Office/SharePoint.
Seleccione el nodo Office Agregar-INS .
En la lista de plantillas de proyecto, seleccione el proyecto Libro de Excel 2010 o Libro 2013 de Excel .
En el cuadro Nombre, escriba CallingCodeFromVBA.
Haga clic en Aceptar.
Se abre el Asistente para proyectos de Visual Studio Tools para Office.
Seleccione Copiar un documento existentey, en el cuadro Ruta de acceso completa al documento existente, especifique la ubicación del libro WorkbookWithVBA que creó anteriormente.Si usa su propio libro habilitado para macros, especifique la ubicación de dicho libro.
Haga clic en Finalizar.
Visual Studio abre el libro WorkbookWithVBA en el diseñador y agrega el proyecto CallingCodeFromVBA al Explorador de soluciones.
Confiar en la ubicación del libro
Antes de exponer el código de la solución a código de VBA en el libro, debe confiar en VBA en el libro para ejecutarse.Existen varias formas de hacerlo.En este tutorial, logrará esta tarea confiando en la ubicación del libro en el Centro de confianza de Excel.
Para confiar en la ubicación del libro
Inicie Excel.
Haga clic en la pestaña Archivo.
Haga clic en el botón Opciones de Excel.
En el panel Categorías, haga clic en Centro de confianza.
En el panel Detalles, haga clic en Trust Center Settings.
En el panel de categorías, haga clic en Ubicaciones de confianza.
En el panel de detalles, haga clic en Agregar nueva ubicación.
En el cuadro de diálogo Ubicación de confianza de Microsoft Office, vaya a la carpeta que contiene el proyecto CallingCodeFromVBA.
Seleccione Las subcarpetas de esta ubicación también son de confianza.
En el cuadro de diálogo Ubicación de confianza de Microsoft Office, haga clic en Aceptar.
En el cuadro de diálogo Centro de confianza, haga clic en Aceptar.
En el cuadro de diálogo Opciones de Excel, haga clic en Aceptar.
Salga de Excel.
Agregar un método a la clase Sheet1
Ahora que el proyecto de VBA está configurado, agregue un método público a la clase de elemento host Sheet1 al que pueda llamar desde código de VBA.
Para agregar un método a la clase Sheet1
En el Explorador de soluciones, haga clic con el botón secundario en Sheet1.cs y, a continuación, en Ver código.
El archivo Sheet1.cs se abre en el editor de código.
Agregue el código siguiente a la clase Sheet1.El método CreateVstoNamedRange crea un nuevo objeto NamedRange en el intervalo especificado.Este método también crea un controlador de eventos para el evento Selected de NamedRange.Más adelante en este tutorial llamará al método CreateVstoNamedRange desde código de VBA en el documento.
private Microsoft.Office.Tools.Excel.NamedRange namedRange1; public void CreateVstoNamedRange(Excel.Range range, string name) { if (!this.Controls.Contains(name)) { namedRange1 = this.Controls.AddNamedRange(range, name); namedRange1.Selected += new Excel.DocEvents_SelectionChangeEventHandler( namedRange1_Selected); } else { MessageBox.Show("A named range with this specific name " + "already exists on the worksheet."); } } private void namedRange1_Selected(Microsoft.Office.Interop.Excel.Range Target) { MessageBox.Show("This named range was created by Visual Studio " + "Tools for Office."); }
Agregue el método siguiente a la clase Sheet1.Este método invalida el método GetAutomationObject para devolver la instancia actual de la clase Sheet1.
protected override object GetAutomationObject() { return this; }
Aplique los atributos siguientes antes de la primera línea de la declaración de clase Sheet1.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)]
Extraer una interfaz para la clase Sheet1
Antes de exponer el método CreateVstoNamedRange a código de VBA, debe crear una interfaz pública que defina este método y debe exponer esta interfaz a COM.
Para extraer una interfaz para la clase Sheet1
En el archivo de código Sheet1.cs, haga clic en cualquier parte de la clase Sheet1.
En el menú Refactorizar, haga clic en Extraer interfaz.
En el cuadro de diálogo Extraer interfaz, en el cuadro Seleccionar miembros públicos para formar la interfaz, haga clic en la entrada del método CreateVstoNamedRange.
Haga clic en Aceptar.
Visual Studio genera una nueva interfaz denominada ISheet1 y modifica la definición de la clase Sheet1 de modo que implemente la interfaz ISheet1.Visual Studio también abre el archivo ISheet1.cs en el Editor de código.
En el archivo ISheet1.cs, reemplace la declaración de interfaz ISheet1 con el código siguiente.Este código hace pública la interfaz ISheet1 y aplica el atributo ComVisibleAttribute para hacer la interfaz visible para COM.
[System.Runtime.InteropServices.ComVisible(true)] public interface ISheet1 { void CreateVstoNamedRange(Microsoft.Office.Interop.Excel.Range range, string name); }
Compile el proyecto.
Exponer el método a código de VBA
Para exponer el método CreateVstoNamedRange a código de VBA en el libro, establezca la propiedad ReferenceAssemblyFromVbaProject del elemento host Sheet1 en True.
Para exponer el método a código de VBA
En el Explorador de soluciones, haga doble clic en Sheet1.cs.
El archivo WorkbookWithVBA se abre en el diseñador, con Sheet1 visible.
En la ventana Propiedades, seleccione la propiedad ReferenceAssemblyFromVbaProject y cambie el valor a True.
Haga clic en Aceptar en el mensaje que aparece.
Compile el proyecto.
Llamar al método desde código de VBA
Ahora puede llamar al método CreateVstoNamedRange desde código de VBA en el libro.
[!NOTA]
En este tutorial, agregará código de VBA al libro a la vez que depura el proyecto.El código de VBA que agregue a este documento se sobrescribirá la próxima vez que genere el proyecto, ya que Visual Studio reemplaza el documento de la carpeta de resultados de la compilación con una copia del documento de la carpeta de proyecto principal.Si desea guardar el código de VBA, puede copiarlo en el documento de la carpeta de proyecto.Para obtener más información, vea Combinar personalizaciones de VBA y de nivel de documento.
Para llamar al método desde código de VBA
Presione F5 para ejecutar el proyecto.
En la ficha Programador, en el grupo Código, haga clic en Visual Basic.
Se abre el Editor de Visual Basic.
En el menú Insertar, haga clic en Módulo.
Agregue el siguiente código al nuevo módulo.
Este código llama al método CreateTable del ensamblado de personalización.La macro tiene acceso a este método mediante el método GetManagedClass global para obtener acceso a la clase de elemento host Sheet1 que expuso a código de VBA.El método GetManagedClass se generó automáticamente cuando se estableció la propiedad ReferenceAssemblyFromVbaProject anteriormente en este tutorial.
Sub CallVSTOMethod() Dim VSTOSheet1 As CallingCodeFromVBA.Sheet1 Set VSTOSheet1 = GetManagedClass(Sheet1) Call VSTOSheet1.CreateVstoNamedRange(Sheet1.Range("A1"), "VstoNamedRange") End Sub
Presione F5.
En el libro abierto, haga clic en la celda A1 de Sheet1.Compruebe que aparece el cuadro de mensaje.
Salga de Excel sin guardar los cambios.
Pasos siguientes
Para obtener más información sobre cómo llamar a código en soluciones de Office desde VBA, vea estos temas:
Llamar a código de un elemento host en una personalización de Visual Basic desde VBA.Este proceso es diferente del proceso de Visual C#.Para obtener más información, vea Tutorial: Llamar a código de VBA en un proyecto de Visual Basic.
Llamar a código en un complemento en el nivel de aplicación desde VBA.Para obtener más información, vea Tutorial: Llamar a código de VBA en un complemento de nivel de aplicación.
Vea también
Tareas
Cómo: Exponer código a VBA en un proyecto de Visual Basic
Cómo: Exponer código a VBA en un proyecto de Visual C#
Tutorial: Llamar a código de VBA en un proyecto de Visual Basic