Condividi tramite


Procedura dettagliata: chiamata di codice in un componente aggiuntivo a livello di applicazione da VBA

Aggiornamento: novembre 2007

Si applica a

Le informazioni contenute in questo argomento riguardano solo i progetti Visual Studio Tools per Office e le versioni di Microsoft Office specificati.

Tipo di progetto

  • Progetti a livello di applicazione

Versione Microsoft Office

  • Microsoft Office System 2007

  • Microsoft Office 2003

Per ulteriori informazioni, vedere la classe Funzionalità disponibili in base ai tipi di progetto e applicazione.

In questa procedura dettagliata viene illustrato come esporre un oggetto in un componente aggiuntivo a livello di applicazione alle altre soluzioni Microsoft Office, inclusi i componenti aggiuntivi VBA (Visual Basic, Applications Edition) e COM.

Sebbene in questa procedura dettagliata si utilizzi specificamente Excel, i concetti illustrati sono applicabili a qualsiasi progetto di componente aggiuntivo fornito da Visual Studio Tools per Office.

In questa procedura dettagliata vengono illustrate le attività seguenti:

  • Definizione di una classe che può essere esposta alle altre soluzioni Office.

  • Esposizione della classe alle altre soluzioni Office.

  • Chiamata di un metodo della classe dal codice VBA.

Nota:

Nel computer in uso è possibile che vengano visualizzati nomi o percorsi diversi per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti. La versione di Visual Studio in uso e le impostazioni configurate determinano questi elementi. Per ulteriori informazioni vedere Impostazioni di Visual Studio.

Prerequisiti

Per completare questa procedura dettagliata, è necessario disporre dei seguenti componenti:

  • Visual Studio Tools per Office (componente facoltativo di Visual Studio 2008 Professional e Visual Studio Team System).

  • Microsoft Office Excel 2007.

    Nota:

    È possibile eseguire questa procedura dettagliata anche utilizzando Microsoft Office Excel 2003, sebbene per alcune istruzioni si presupponga l'utilizzo della barra multifunzione di Excel 2007.

Visual Studio Tools per Office viene installato per impostazione predefinita con le versioni di Visual Studio elencate. Per controllare se è installato, vedere Installazione di Visual Studio Tools per Office.

Per una dimostrazione video, vedere Video How to: Calling Code in an Application-Level Add-in from VBA.

Creazione del progetto per un componente aggiuntivo

Il primo passaggio consiste nella creazione di un progetto per un componente aggiuntivo per Excel.

Per creare un nuovo progetto

  • Creare un progetto per un componente aggiuntivo per Excel con il nome ExcelImportData, utilizzando il modello di progetto per componente aggiuntivo di Excel per Microsoft Office System 2007. Per ulteriori informazioni, vedere Procedura: creare progetti Visual Studio Tools per Office.

    Tramite Visual Studio verrà aperto il file di codice ThisAddIn.cs o ThisAddIn.vb e il progetto ExcelImportData verrà aggiunto in Esplora soluzioni.

Definizione di una classe che può essere esposta alle altre soluzioni Office

Lo scopo di questa procedura dettagliata è chiamare il metodo ImportData di una classe denominata AddInUtilities nel componente aggiuntivo dal codice VBA. Questo metodo importa i dati in un nuovo foglio di lavoro della cartella di lavoro attiva e crea un semplice oggetto DataSet per contenere i dati.

Per esporre la classe AddInUtilities alle altre soluzioni Office, è necessario rendere la classe pubblica e visibile a COM. Inoltre è necessario fornire un modo per esporre l'interfaccia IDispatch nella classe. Il codice nella procedura descritta di seguito dimostra una modalità per soddisfare questi requisiti. Per ulteriori informazioni, vedere Chiamata di codice nei componenti aggiuntivi a livello di applicazione da altre soluzioni Office.

Per definire una classe che può essere esposta alle altre soluzioni Office

  1. Scegliere Aggiungi classe dal menu Progetto.

  2. Nella finestra di dialogo Aggiungi nuovo elemento modificare il nome della nuova classe in AddInUtilities e scegliere Aggiungi.

    Il file AddInUtilities.cs o AddInUtilities.vb viene aperto nell'editor di codice.

  3. Aggiungere le seguenti istruzioni all'inizio del file.

    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. Sostituire la dichiarazione di classe AddInUtilities vuota con il codice riportato di seguito.

    Questo codice rende visibile la classe AddInUtilities a COM e aggiunge il metodo ImportData alla classe. Per esporre l'interfaccia IDispatch, nella classe AddInUtilities viene implementata anche un'interfaccia dotata dell'attributo 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));
            }
        }
    }
    

Esposizione della classe alle altre soluzioni Office

Per esporre la classe AddInUtilities alle altre soluzioni Office, eseguire l'override del metodo RequestComAddInAutomationService nella classe ThisAddIn. Nell'override, restituire un'istanza della classe AddInUtilities.

Per esporre la classe AddInUtilities alle altre soluzioni Office

  1. In Esplora soluzioni espandere Excel.

  2. Fare clic con il pulsante destro del mouse su ThisAddIn.cs o su ThisAddIn.vb e scegliere Visualizza codice.

  3. Aggiungere il codice seguente alla classe 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. Scegliere Compila soluzione dal menu Compila.

    Verificare che la soluzione venga compilata senza errori.

Test del componente aggiuntivo

È possibile chiamare la classe AddInUtilities da alcuni tipi diversi di soluzioni Office. In questa procedura dettagliata, si utilizzerà il codice VBA in una cartella di lavoro di Excel. Per ulteriori informazioni sugli altri tipi di soluzioni Office utilizzabili, vedere Chiamata di codice nei componenti aggiuntivi a livello di applicazione da altre soluzioni Office.

Per testare il componente aggiuntivo

  1. Premere F5 per eseguire il progetto.

  2. In Excel, salvare la cartella di lavoro attiva come Cartella di lavoro con attivazione macro di Excel (* .xlsm). Salvarla in un percorso comodo, ad esempio il desktop.

  3. Sulla barra multifunzione, fare clic sulla scheda Sviluppatore.

    Nota:

    Se la scheda Sviluppatore non è visibile, è necessario prima visualizzarla. Per ulteriori informazioni, vedere Procedura: visualizzare la scheda Sviluppo nella barra multifunzione.

  4. Nel gruppo Codice, fare clic su Visual Basic.

    Viene aperto Visual Basic Editor.

  5. Nella finestra Progetto, fare doppio clic su ThisWorkbook.

    Viene aperto il file di codice per l'oggetto ThisWorkbook.

  6. Aggiungere al file di codice il seguente codice VBA. Il codice ottiene innanzitutto un oggetto COMAddIn che rappresenta il componente aggiuntivo ExcelImportData. Quindi utilizza la proprietà Object dell'oggetto COMAddIn per chiamare il metodo 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. Premere F5.

  8. Verificare che un nuovo foglio di dati importati sia stato aggiunto alla cartella di lavoro. Verificare inoltre che la cella A1 contenga la stringa Chan e che la cella B1 contenga la stringa Gareth.

  9. Uscire da Excel.

Passaggi successivi

Per ulteriori informazioni sulla programmazione dei componenti aggiuntivi, vedere gli argomenti seguenti:

Vedere anche

Attività

Procedura: creare progetti Visual Studio Tools per Office

Concetti

Programmazione di componenti aggiuntivi a livello di applicazione

Chiamata di codice nei componenti aggiuntivi a livello di applicazione da altre soluzioni Office

Sviluppo di soluzioni Office

Elementi host di componenti aggiuntivi

Personalizzazione delle funzionalità dell'interfaccia utente utilizzando le interfacce di estensibilità

Architettura dei componenti aggiuntivi a livello di applicazione