Compartir a través de


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

  • Proyectos de nivel de aplicación

Versión de Microsoft Office

  • Microsoft Office System 2007

  • Microsoft Office 2003

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

  1. En el menú Proyecto, haga clic en Agregar clase.

  2. 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.

  3. 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;
    
  4. 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

  1. En el Explorador de soluciones, expanda Excel.

  2. Haga clic con el botón secundario en ThisAddIn.cs o ThisAddIn.vb y, a continuación, haga clic en Ver código.

  3. 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;
    }
    
  4. 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

  1. Presione F5 para ejecutar el proyecto.

  2. 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.

  3. 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.

  4. En el grupo Código, haga clic en Visual Basic.

    Se abre el Editor de Visual Basic.

  5. En la ventana Proyecto, haga doble clic en ThisWorkbook.

    Se abre el archivo de código para el objeto ThisWorkbook.

  6. 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
    
  7. Presione F5.

  8. 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.

  9. Salga de Excel.

Pasos siguientes

Puede obtener más información sobre cómo programar complementos en estos temas:

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

Elemento host AddIn

Personalizar características de la interfaz de usuario mediante interfaces de extensibilidad

Arquitectura de los complementos de nivel de aplicación