Condividi tramite


Procedura dettagliata: chiamata di codice da VBA in un progetto Visual C#

In questa procedura dettagliata viene illustrato come chiamare un metodo in una personalizzazione a livello di documento di Microsoft Office Excel da codice Visual Basic, Applications Edition (VBA) contenuto nella cartella di lavoro. La procedura comporta tre passaggi di base: aggiungere un metodo alla classe dell'elemento host Sheet1, esporre il metodo al codice VBA contenuto nella cartella di lavoro e quindi chiamare il metodo da tale codice.

Si applica a: le informazioni fornite in questo argomento sono valide per i progetti a livello di documento per Excel 2007, Excel 2010, Word 2007 e Word 2010. Per ulteriori informazioni, vedere Funzionalità disponibili in base ai tipi di progetto e applicazioni di Office.

Benché in questa procedura dettagliata venga utilizzato Excel in modo specifico, i concetti illustrati sono applicabili anche ai progetti a livello di documento di Word.

In questa procedura dettagliata vengono illustrate le seguenti attività:

  • Creazione di una cartella di lavoro contenente codice VBA.

  • Concessione dell'attendibilità al percorso della cartella di lavoro tramite il Centro protezione di Excel.

  • Aggiunta di un metodo alla classe dell'elemento host Sheet1.

  • Estrazione di un'interfaccia per la classe dell'elemento host Sheet1.

  • Esposizione del metodo al codice VBA.

  • Chiamata del metodo dal codice VBA.

Nota

Il computer potrebbe mostrare nomi o percorsi diversi per alcuni elementi dell'interfaccia utente di Visual Studio nelle istruzioni seguenti. L'edizione di Visual Studio in uso e le impostazioni utilizzate determinano questi elementi. Per ulteriori informazioni, vedere Gestione delle impostazioni.

Prerequisiti

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

-

Una versione di Visual Studio 2010 che include gli strumenti per sviluppatori di Microsoft Office. Per ulteriori informazioni, vedere [Configurazione di un computer per sviluppare soluzioni Office](bb398242\(v=vs.100\).md).
  • Excel 2007 o Excel 2010.

Creazione di una cartella di lavoro contenente codice VBA

Il primo passaggio consiste nel creare una cartella di lavoro con attivazione macro contenente una macro VBA semplice. Per poter esporre a VBA il codice di una personalizzazione occorre che la cartella di lavoro contenga codice VBA. In caso contrario, Visual Studio non è in grado di modificare il progetto VBA per consentire al codice VBA di eseguire chiamate nell'assembly di personalizzazione.

Se si dispone già di una cartella di lavoro contenente codice VBA che si desidera utilizzare, è possibile ignorare questo passaggio.

Creazione di una cartella di lavoro contenente codice VBA

  1. Avviare Excel.

  2. Salvare il documento attivo nel formato Cartella di lavoro con attivazione macro di Excel (* .xlsm) con nome WorkbookWithVBA. Salvarlo in un percorso di facile accesso, ad esempio il desktop.

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

    Nota

    Se la scheda Sviluppo 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 codice VBA seguente. Questo codice definisce una funzione semplice che non esegue alcuna operazione. L'unico scopo di questa funzione è garantire l'esistenza di un progetto VBA nella cartella di lavoro. Tale requisito dovrà essere soddisfatto in alcuni passaggi successivi di questa procedura dettagliata.

    Sub EmptySub()
    End Sub
    
  7. Salvare il documento e uscire da Excel.

Creazione del progetto

A questo punto è possibile creare un progetto a livello di documento per Excel che utilizza la cartella di lavoro con attivazione macro appena creata.

Per creare un nuovo progetto

  1. Avviare Visual Studio.

  2. Scegliere Nuovo dal menu File, quindi fare clic su Progetto.

  3. Nel riquadro dei modelli espandere Visual C#, quindi espandere Office.

  4. Selezionare il nodo 2010 o 2007.

  5. Nell'elenco dei modelli di progetto selezionare il progetto Cartella di lavoro di Excel.

  6. Nella casella Nome digitare CallingCodeFromVBA.

  7. Scegliere OK.

    Verrà avviata la Creazione guidata progetto Visual Studio Tools per Office.

  8. Selezionare Copia un documento esistente e, nella casella Percorso completo del documento esistente, specificare il percorso della cartella di lavoro WorkbookWithVBA creata in precedenza. Se si dispone già di una cartella di lavoro con attivazione macro che si desidera utilizzare, specificare invece il percorso di questa cartella di lavoro.

  9. Scegliere Fine.

    Visual Studio apre la cartella di lavoro WorkbookWithVBA nella finestra di progettazione e aggiunge il progetto ChiamataCodiceDaVBA in Esplora soluzioni.

Concessione dell'attendibilità al percorso della cartella di lavoro

Per poter esporre il codice contenuto nella soluzione al codice VBA contenuto nella cartella di lavoro è necessario che quest'ultimo sia impostato come attendibile per l'esecuzione. Esistono diversi modi per eseguire tale operazione. Questa procedura dettagliata prevede la concessione dell'attendibilità al percorso del documento tramite il Centro protezione di Excel.

Per concedere l'attendibilità al percorso della cartella di lavoro

  1. Avviare Excel.

  2. Fare clic sulla scheda File (per Excel 2010) o sul pulsante Microsoft Office (per Excel 2007).

  3. Fare clic sul pulsante Opzioni Excel.

  4. Nel riquadro delle categorie fare clic su Centro protezione.

  5. Nel riquadro dei dettagli fare clic su Impostazioni Centro protezione.

  6. Nel riquadro delle categorie, fare clic su Percorsi attendibili.

  7. Nel riquadro dei dettagli, fare clic su Aggiungi nuovo percorso.

  8. Nella finestra di dialogo Percorso attendibile di Microsoft Office, passare alla cartella contenente il progetto CallingCodeFromVBA.

  9. Selezionare Considera attendibili anche le sottocartelle di questo percorso.

  10. Nella finestra di dialogo Percorso attendibile di Microsoft Office, fare clic su OK.

  11. Scegliere OK nella finestra di dialogo Centro protezione.

  12. Scegliere OK nella finestra di dialogo Opzioni Excel.

  13. Uscire da Excel.

Aggiunta di un metodo alla classe Sheet1

Ora che il progetto VBA è configurato, aggiungere un metodo pubblico alla classe dell'elemento host Sheet1 che è possibile chiamare dal codice VBA.

Per aggiungere un metodo alla classe Sheet1

  1. In Esplora soluzioni fare clic con il pulsante destro del mouse su Sheet1.cs, quindi scegliere Visualizza codice.

    Il file Sheet1.cs verrà aperto nell'editor di codice.

  2. Aggiungere il codice seguente alla classe Sheet1. Il metodo CreateVstoNamedRange crea un nuovo oggetto NamedRange nell'intervallo specificato. Questo metodo crea inoltre un gestore eventi per l'evento Selected dell'oggetto NamedRange. Più avanti nella procedura dettagliata il metodo CreateVstoNamedRange verrà chiamato dal codice VBA contenuto nel 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.");
    }
    
  3. Aggiungere il seguente metodo alla classe Sheet1. Questo metodo esegue l'override del metodo GetAutomationObject() per restituire l'istanza corrente della classe Sheet1.

    protected override object GetAutomationObject()
    {
        return this;
    }
    
  4. Applicare gli attributi seguenti prima della prima riga della dichiarazione della classe Sheet1. Questi attributi rendono la classe visibile a COM, senza tuttavia generare un'interfaccia di classe.

    [System.Runtime.InteropServices.ComVisible(true)]
    [System.Runtime.InteropServices.ClassInterface(
        System.Runtime.InteropServices.ClassInterfaceType.None)]
    

Estrazione di un'interfaccia per la classe Sheet1

Prima che sia possibile esporre il metodo CreateVstoNamedRange a codice VBA occorre creare un'interfaccia pubblica che definisce questo metodo. È inoltre necessario esporre questa interfaccia a COM.

Per estrarre un'interfaccia per la classe Sheet1

  1. Nel file di codice Sheet1.cs, fare clic in qualsiasi punto della classe Sheet1.

  2. Scegliere Estrai interfaccia dal menu Effettua refactoring.

  3. Nella finestra di dialogo Estrai interfaccia, nella casella Selezionare i membri pubblici per l'interfaccia fare clic sulla voce del metodo CreateVstoNamedRange.

  4. Scegliere OK.

    Visual Studio genera una nuova interfaccia denominata ISheet1 e modifica la definizione della classe Sheet1 affinché implementi l'interfaccia ISheet1. Visual Studio apre inoltre il file ISheet1.cs nell'Editor del codice.

  5. Nel file ISheet1.cs, sostituire la dichiarazione dell'interfaccia ISheet1 con il codice seguente. Questo codice rende pubblica l'interfaccia ISheet1 e applica l'attributo ComVisibleAttribute per rendere l'interfaccia visibile a COM.

    [System.Runtime.InteropServices.ComVisible(true)]
    public interface ISheet1
    {
        void CreateVstoNamedRange(Microsoft.Office.Interop.Excel.Range range, string name);
    }
    
  6. Compilare il progetto.

Esposizione del metodo al codice VBA

Per esporre il metodo CreateVstoNamedRange al codice VBA contenuto nella cartella di lavoro, impostare la proprietà ReferenceAssemblyFromVbaProject dell'elemento host Sheet1 su True.

Per esporre il metodo al codice VBA

  1. In Esplora soluzioni fare doppio clic su Sheet1.cs.

    Il file WorkbookWithVBA viene aperto nella finestra di progettazione. Viene visualizzato il foglio Sheet1.

  2. Nella finestra Proprietà selezionare la proprietà ReferenceAssemblyFromVbaProject e modificarne il valore impostandola su True.

  3. Fare clic su OK nel messaggio visualizzato.

  4. Compilare il progetto.

Chiamata del metodo dal codice VBA

A questo punto è possibile chiamare il metodo CreateVstoNamedRange dal codice VBA contenuto nella cartella di lavoro.

Nota

Questa procedura dettagliata prevede l'aggiunta di codice VBA alla cartella di lavoro durante l'esecuzione del debug del progetto. Se si ricompila il progetto, il codice VBA aggiunto a questo documento verrà sovrascritto. Infatti, Visual Studio sostituisce il documento contenuto nella cartella dell'output di compilazione con una copia del documento contenuto nella cartella del progetto principale. Se si desidera salvare il codice VBA è possibile copiarlo nel documento contenuto nella cartella del progetto. Per ulteriori informazioni, vedere Chiamata di codice nelle personalizzazioni a livello di documento da VBA.

Per chiamare il metodo dal codice VBA

  1. Premere F5 per eseguire il progetto.

  2. Nella scheda Sviluppatore, fare clic su Visual Basic nel gruppo Codice.

    Verrà aperto Visual Basic Editor.

  3. Scegliere Modulo dal menu Inserisci.

  4. Aggiungere al nuovo modulo il codice seguente.

    Questo codice chiama il metodo CreateTable nell'assembly di personalizzazione. La macro accede a questo metodo utilizzando il metodo GetManagedClass globale per accedere alla classe dell'elemento host Sheet1 esposta al codice VBA. Il metodo GetManagedClass è stato generato automaticamente nel passaggio precedente della procedura dettagliata in cui è stata impostata la proprietà ReferenceAssemblyFromVbaProject.

    Sub CallVSTOMethod()
        Dim VSTOSheet1 As CallingCodeFromVBA.Sheet1
        Set VSTOSheet1 = GetManagedClass(Sheet1)
        Call VSTOSheet1.CreateVstoNamedRange(Sheet1.Range("A1"), "VstoNamedRange")
    End Sub
    
  5. Premere F5.

  6. Nella cartella di lavoro aperta, fare clic sulla cella A1 del foglio Sheet1. Verificare che venga visualizzata la finestra di messaggio.

  7. Uscire da Excel senza salvare le modifiche.

Passaggi successivi

Ulteriori informazioni su come chiamare elementi di codice in soluzioni Office da VBA sono disponibili negli argomenti seguenti:

Vedere anche

Attività

Procedura: esporre il codice a VBA in un progetto Visual Basic

Procedura: esporre il codice a VBA in un progetto Visual C#

Procedura dettagliata: chiamata di codice da VBA in un progetto Visual Basic

Altre risorse

Combinazione di VBA con le personalizzazioni a livello di documento

Programmazione delle personalizzazioni a livello di documento