Tutorial: Llamar a código de VBA en un complemento de nivel de aplicación
Actualización: noviembre 2007
Se aplica a |
---|
La información de este tema sólo se aplica a los proyectos de Visual Studio Tools para Office y versiones de Microsoft Office especificados. Tipo de proyecto
Versión de Microsoft Office
Para obtener más información, vea Características disponibles por aplicación y tipo de proyecto. |
En este tutorial se muestra cómo exponer un objeto de un complemento de nivel de aplicación a otras soluciones de Microsoft Office, incluidos los complementos de Visual Basic para Aplicaciones (VBA) y COM.
Aunque este tutorial utiliza específicamente Excel, los conceptos que muestra son aplicables a cualquier proyecto de complemento que proporciona Visual Studio Tools para Office.
Este tutorial ilustra las tareas siguientes:
Definir una clase que se pueda exponer a otras soluciones de Office.
Exponer la clase a otras soluciones de Office.
Llamar a un método de la clase 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 incluidos en las instrucciones siguientes. La edición de Visual Studio que se tenga y la configuración que se utilice 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:
Visual Studio Tools para Office (componente opcional de Visual Studio 2008 Professional y Visual Studio Team System).
Microsoft Office Excel 2007.
Nota: También puede realizar este tutorial con Microsoft Office Excel 2003. Sin embargo, algunas de las instrucciones suponen que utiliza la cinta de opciones de Excel 2007.
Visual Studio Tools para Office se instala, de forma predeterminada, con las versiones que se enumeran de Visual Studio. Para comprobar si está instalado, consulte Instalar Visual Studio Tools para Office.
Para ver una demostración en vídeo, visite Video How to: Calling Code in an Application-Level Add-in from VBA.
Crear el proyecto de complemento
El primer paso es crear un proyecto de complemento para Excel.
Para crear un nuevo proyecto
Cree un proyecto Complemento de Excel con el nombre ExcelImportData mediante la plantilla de proyecto Complemento de Excel para Microsoft Office System 2007. Para obtener más información, consulte Cómo: Crear proyectos de Visual Studio para Office.
Visual Studio abre el archivo de código ThisAddIn.cs o ThisAddIn.vb y agrega el proyecto ExcelImportData al Explorador de soluciones.
Definir una clase que se pueda exponer a otras soluciones de Office
El propósito de este tutorial consiste en realizar una llamada en el método ImportData de una clase denominada AddInUtilities en el complemento desde código de VBA. Este método importa datos en una nueva hoja de cálculo del libro activo y crea un objeto DataSet simple para contener los datos.
Para exponer la clase AddInUtilities a otras soluciones de Office, debe publicar la clase y hacerla visible para COM. También debe proporcionar una forma de exponer la interfaz IDispatch en la clase. El código del procedimiento siguiente muestra una manera de cumplir estos requisitos. Para obtener más información, consulte Llamar a código en complementos de nivel de aplicación desde otras soluciones de Office.
Para definir una clase que se pueda exponer a otras soluciones de Office
En el menú Proyecto, haga clic en Agregar clase.
En el cuadro de diálogo Agregar nuevo elemento, cambie el nombre de la nueva clase a AddInUtilities y haga clic en Agregar.
El archivo AddInUtilities.cs o AddInUtilities.vb se abre en el editor de código.
Agregue las siguientes instrucciones al comienzo del archivo:
Imports System.Data Imports System.Runtime.InteropServices Imports Excel = Microsoft.Office.Interop.Excel
using System.Data; using System.Runtime.InteropServices; using Excel = Microsoft.Office.Interop.Excel;
Reemplace la declaración de clase AddInUtilities vacía con el código siguiente.
Este código hace que la clase AddInUtilities resulte visible para COM y agrega el método ImportData a la clase. Para exponer la interfaz IDispatch, la clase AddInUtilities implementa también una interfaz que tiene el atributo InterfaceIsIDispatch.
<System.Runtime.InteropServices.ComVisibleAttribute(True)> _ <System.Runtime.InteropServices.InterfaceType(ComInterfaceType.InterfaceIsIDispatch)> _ Public Interface IAddInUtilities Sub ImportData() End Interface <System.Runtime.InteropServices.ComVisibleAttribute(True)> _ <System.Runtime.InteropServices.ClassInterface(System.Runtime.InteropServices.ClassInterfaceType.None)> _ Public Class AddInUtilities Implements IAddInUtilities Public Sub ImportData() Implements IAddInUtilities.ImportData ' Create a new DataTable. Dim ds As New DataSet() Dim dt As DataTable = ds.Tables.Add("Customers") dt.Columns.Add(New DataColumn("LastName")) dt.Columns.Add(New DataColumn("FirstName")) ' Add a new row to the DataTable. Dim dr As DataRow = dt.NewRow() dr("LastName") = "Chan" dr("FirstName") = "Gareth" dt.Rows.Add(dr) ' Add a new XML map to the collection. Dim activeWorkbook As Excel.Workbook = Globals.ThisAddIn.Application.ActiveWorkbook Dim xmlMap1 As Excel.XmlMap = activeWorkbook.XmlMaps.Add(ds.GetXmlSchema(), _ "NewDataSet") ' Import the data. If Not (xmlMap1 Is Nothing) Then Dim lastSheet As Object = activeWorkbook.Sheets(activeWorkbook.Sheets.Count) Dim newSheet As Excel.Worksheet = CType(activeWorkbook.Sheets.Add( _ After:=lastSheet), Excel.Worksheet) newSheet.Name = "Imported Data" activeWorkbook.XmlImportXml(ds.GetXml(), xmlMap1, True, _ newSheet.Range("A1")) End If End Sub End Class
[System.Runtime.InteropServices.ComVisibleAttribute(true)] [System.Runtime.InteropServices.InterfaceType(ComInterfaceType.InterfaceIsIDispatch)] public interface IAddInUtilities { void ImportData(); } [System.Runtime.InteropServices.ComVisibleAttribute(true)] [System.Runtime.InteropServices.ClassInterface(ClassInterfaceType.None)] public class AddInUtilities : IAddInUtilities { public void ImportData() { // Create a new DataTable. DataSet ds = new DataSet(); DataTable dt = ds.Tables.Add("Customers"); dt.Columns.Add(new DataColumn("LastName")); dt.Columns.Add(new DataColumn("FirstName")); // Add a new row to the DataTable. DataRow dr = dt.NewRow(); dr["LastName"] = "Chan"; dr["FirstName"] = "Gareth"; dt.Rows.Add(dr); // Add a new XML map to the collection. Excel.Workbook activeWorkbook = Globals.ThisAddIn.Application.ActiveWorkbook; Excel.XmlMap xmlMap1 = activeWorkbook.XmlMaps.Add(ds.GetXmlSchema(), "NewDataSet"); // Import the data. if (xmlMap1 != null) { object lastSheet = activeWorkbook.Sheets[activeWorkbook.Sheets.Count]; Excel.Worksheet newSheet = (Excel.Worksheet)activeWorkbook.Sheets.Add( System.Type.Missing, lastSheet, 1, System.Type.Missing); newSheet.Name = "Imported Data"; activeWorkbook.XmlImportXml(ds.GetXml(), out xmlMap1, true, newSheet.get_Range("A1", System.Type.Missing)); } } }
Exponer la clase a otras soluciones de Office
Para exponer la clase AddInUtilities a otras soluciones de Office, invalide el método RequestComAddInAutomationService de la clase ThisAddIn. En la invalidación, devuelva una instancia de la clase AddInUtilities.
Para exponer la clase AddInUtilities a otras soluciones de Office
En el Explorador de soluciones, expanda Excel.
Haga clic con el botón secundario en ThisAddIn.cs o ThisAddIn.vb y, a continuación, haga clic en Ver código.
Agregue el código siguiente a la clase ThisAddIn.
Private utilities As AddInUtilities Protected Overrides Function RequestComAddInAutomationService() As Object If utilities Is Nothing Then utilities = New AddInUtilities() End If Return utilities End Function
private AddInUtilities utilities; protected override object RequestComAddInAutomationService() { if (utilities == null) utilities = new AddInUtilities(); return utilities; }
En el menú Generar, haga clic en Generar solución.
Compruebe que la solución se genera sin errores.
Probar el complemento
Puede llamar a la clase AddInUtilities desde varios tipos diferentes de soluciones de Office. En este tutorial, utilizará código de VBA en un libro de Excel. Para obtener más información sobre los otros tipos de soluciones de Office que también puede utilizar, vea Llamar a código en complementos de nivel de aplicación desde otras soluciones de Office.
Para probar el complemento
Presione F5 para ejecutar el proyecto.
En Excel, guarde el libro activo como un Libro de Excel habilitado para macros (*.xlsm). 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, consulte Cómo: Mostrar la ficha 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 obtiene en primer lugar un objeto COMAddIn que representa el complemento ExcelImportData. A continuación, utiliza la propiedad Object del objeto COMAddIn para llamar al método ImportData.
Sub CallVSTOMethod() Dim addIn As COMAddIn Dim automationbject As Object Set addIn = Application.COMAddIns("ExcelImportData") Set automationObject = addIn.Object automationObject.ImportData End Sub
Presione F5.
Compruebe que se ha agregado una nueva hoja Imported Data al libro. Compruebe también que la celda A1 contiene la cadena Chany que la celda B1 contiene la cadena Gareth.
Salga de Excel.
Pasos siguientes
Puede obtener más información sobre cómo programar complementos en estos temas:
Usar la clase ThisAddIn para automatizar la aplicación host y realizar otras tareas en proyectos de complemento. Para obtener más información, consulte Programar complementos de nivel de aplicación y Elemento host AddIn.
Crear un panel de tareas personalizado en un complemento para Microsoft Office System 2007. Para obtener más información, consulte Información general sobre los paneles de tareas personalizados y Cómo: Agregar un panel de tareas personalizado a una aplicación.
Personalizar la cinta de opciones en un complemento para Microsoft Office System 2007. Para obtener más información, vea Información general sobre la cinta de opciones y Cómo: Iniciarse en la personalización de la cinta de opciones.
Vea también
Tareas
Cómo: Crear proyectos de Visual Studio para Office
Conceptos
Programar complementos de nivel de aplicación
Llamar a código en complementos de nivel de aplicación desde otras soluciones de Office
Desarrollar soluciones de Office
Personalizar características de la interfaz de usuario mediante interfaces de extensibilidad