Identificativo articolo: 306683 - Ultima modifica: venerdì 29 giugno 2007 - Revisione: 5.1

HOW TO: Eseguire macro di Office utilizzando l'automazione da Visual C# .NET

Questo articolo è stato precedentemente pubblicato con il codice di riferimento I306683

In questa pagina

Espandi tutto | Chiudi tutto

Sommario

Utilizzando l'automazione di Microsoft Office è possibile aprire un documento o crearne uno nuovo che contenga una macro di Visual Basic Applications Edition (VBA) ed eseguire tale macro in fase di esecuzione. In questo articolo viene illustrato come chiamare macro di Office da un client di automazione di Visual C# .NET. Il client di automazione di esempio riportato di seguito manipola un server di automazione di Office, ad esempio Access, Excel, PowerPoint o Word, in base alla selezione eseguita in un modulo. Dopo che il client ha avviato il server di automazione, apre un documento e quindi chiama due macro. La prima macro, DoKbTest, non ha parametri, mentre la seconda, DoKbTestWithParameter, assume un singolo parametro di tipo String.

Procedura

Creazione di documenti di Office contenenti macro

  1. Creare un documento di Word denominato C:\Doc1.doc. Per fare questo, attenersi alla seguente procedura:
    1. Creare un nuovo documento in Microsoft Word.
    2. Premere ALT+F11 per aprire Visual Basic Editor.
    3. Scegliere Modulo dal menu Inserisci.
    4. Nel nuovo modulo digitare il seguente codice per la macro:
      'Display a message box that displays the application name.
      Public Sub DoKbTest()
         MsgBox "Hello from " & Application.Name
      End Sub
      
      'Display a message box with the string passed from the
      'Automation client.
      Public Sub DoKbTestWithParameter( sMsg As String )
         MsgBox sMsg
      End Sub
    5. Chiudere Visual Basic Editor, salvare il documento e chiudere Word.
  2. Creare una cartella di lavoro di Excel denominata C:\Book1.xls utilizzando una procedura simile a quella vista per la creazione del documento di Word.
  3. Creare una presentazione di PowerPoint denominata C:\Pres1.ppt utilizzando una procedura simile a quella vista per la creazione del documento di Word.
  4. Creare un nuovo database di Access denominato C:\Db1.mdb. Per eseguire questa operazione, attenersi alla seguente procedura:
    1. Scegliere Modulo dal menu Inserisci.
    2. Incollare il codice della macro nel nuovo modulo.
    3. Salvare il modulo e chiudere Access.

Creazione del client di automazione di Visual C# .NET

  1. Avviare Microsoft Visual Studio .NET. Scegliere Nuovo dal menu File, quindi scegliere Progetto. Selezionare Applicazione Windows dai tipi di progetti di Visual C#. In base all'impostazione predefinita viene creato il progetto Form1.
  2. Aggiungere un riferimento alle librerie di oggetti di Access, Excel, PowerPoint e Word. Per eseguire questa operazione, attenersi alla seguente procedura:
    1. Scegliere Aggiungi riferimento dal menu Progetto.
    2. Nella scheda COM trovare Microsoft Word Object Library e scegliere Seleziona.

      NOTA: la libreria oggetti di Microsoft Word contiene un numero di versione, rispettivamente 9.0 per Word 2000 e 10.0 per Word 2002.
    3. Ripetere il passaggio precedente per le librerie di oggetti di Access, Excel e PowerPoint.
    4. Scegliere OK nella finestra di dialogo Aggiungi riferimento per accettare la selezione. Se viene chiesto di generare wrapper per le librerie selezionate, scegliere .

      Nota: vedere la sezione Risoluzione dei problemi in caso di errore in cui viene fatto riferimento alla libreria di oggetti di Access 10.0.
  3. Scegliere Finestra di progettazione dal menu Visualizza. Aggiungere una casella combinata e un pulsante a Form1.
  4. Fare doppio clic su Button1 per generare una definizione per il gestore dell'evento Click del pulsante.
  5. Incollare il codice seguente nel gestore button1_Click:
    private void button1_Click(object sender, System.EventArgs e)
    {
        // Object for missing (or optional) arguments.
        object oMissing = System.Reflection.Missing.Value;
    
        //Switch based on the user selection.
        switch (comboBox1.SelectedIndex)
        {
            case 0:
                // Create an instance of Microsoft Access, make it visible,
                // and open Db1.mdb.
                Access.ApplicationClass oAccess = new Access.ApplicationClass();
                oAccess.Visible = true;
                //ACCESS9:
                oAccess.OpenCurrentDatabase("c:\\db1.mdb", false);
                //ACCESS10:
                //oAccess.OpenCurrentDatabase("c:\\db1.mdb", false, "");
    
                // Run the macros.
                RunMacro(oAccess, new Object[]{"DoKbTest"});
                RunMacro(oAccess, new Object[]{"DoKbTestWithParameter", "Hello from C# Client."});
    
                // Quit Access and clean up.
                oAccess.DoCmd.Quit(Access.AcQuitOption.acQuitSaveNone);
                System.Runtime.InteropServices.Marshal.ReleaseComObject (oAccess);
                oAccess = null;
                
                break;
    
            case 1:
                // Create an instance of Microsoft Excel, make it visible,
                // and open Book1.xls.
                Excel.ApplicationClass oExcel = new Excel.ApplicationClass();
                oExcel.Visible = true;
                Excel.Workbooks oBooks = oExcel.Workbooks;
                Excel._Workbook oBook = null;
                //EXCEL9:
                oBook = oBooks.Open("c:\\book1.xls", oMissing, oMissing,
                    oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing,
                    oMissing, oMissing, oMissing);
                //EXCEL10:
                //oBook = oBooks.Open("c:\\book1.xls", oMissing, oMissing,
                //    oMissing, oMissing, oMissing, oMissing, oMissing, oMissing, oMissing,
                //    oMissing, oMissing, oMissing, oMissing, oMissing);
    
                // Run the macros.
                RunMacro(oExcel, new Object[]{"DoKbTest"});
                RunMacro(oExcel, new Object[]{"DoKbTestWithParameter", "Hello from C# Client."});
    
                // Quit Excel and clean up.
                oBook.Close(false, oMissing, oMissing);
                System.Runtime.InteropServices.Marshal.ReleaseComObject (oBook);
                oBook = null;
                System.Runtime.InteropServices.Marshal.ReleaseComObject (oBooks);
                oBooks = null;
                oExcel.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject (oExcel);
                oExcel = null;
    
                break;
    
            case 2:
    
                // Create an instance of PowerPoint, make it visible,
                // and open Pres1.ppt.
                PowerPoint.ApplicationClass oPP =  new PowerPoint.ApplicationClass();
                oPP.Visible = MsoTriState.msoTrue;
                PowerPoint.Presentations oPresSet = oPP.Presentations;
                PowerPoint._Presentation oPres = oPresSet.Open("c:\\pres1.ppt",
                   MsoTriState.msoFalse, MsoTriState.msoFalse, 
                   MsoTriState.msoTrue);
    
                // Run the macros.
                RunMacro(oPP, new Object[]{"'pres1.ppt'!DoKbTest"});
                RunMacro(oPP, new Object[]{"'pres1.ppt'!DoKbTestWithParameter", "Hello from C# Client."});
    
                // Quit PowerPoint and clean up.
                oPres.Close();
                System.Runtime.InteropServices.Marshal.ReleaseComObject (oPres);
                oPres = null;
                System.Runtime.InteropServices.Marshal.ReleaseComObject (oPresSet);
                oPresSet = null;
                oPP.Quit();
                System.Runtime.InteropServices.Marshal.ReleaseComObject (oPP);
                oPP = null;
    
                break;
                
            case 3:
    
                // Create an instance of Word, make it visible,
                // and open Doc1.doc.
                Word.ApplicationClass oWord = new Word.ApplicationClass();
                oWord.Visible = true;
                Word.Documents oDocs = oWord.Documents;
                object oFile = "c:\\doc1.doc";
                //WORD9:
                Word._Document oDoc = oDocs.Open(ref oFile, ref oMissing,
                    ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                    ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                    ref oMissing, ref oMissing);           
                //WORD10:
                //Word._Document oDoc = oDocs.Open(ref oFile, ref oMissing,
                //    ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                //    ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                //    ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                //    ref oMissing);
    
                // Run the macros.
                RunMacro(oWord, new Object[]{"DoKbTest"});
                RunMacro(oWord, new Object[]{"DoKbTestWithParameter", "Hello from C# Client."});
    
                // Quit Word and clean up.
                oDoc.Close(ref oMissing, ref oMissing, ref oMissing);
                System.Runtime.InteropServices.Marshal.ReleaseComObject (oDoc);
                oDoc = null;
                System.Runtime.InteropServices.Marshal.ReleaseComObject (oDocs);
                oDocs = null;
                oWord.Quit(ref oMissing, ref oMissing, ref oMissing);
                System.Runtime.InteropServices.Marshal.ReleaseComObject (oWord);
                oWord = null;
    
                break;
    
        }
    
        GC.Collect();   //Garbage collection.
    }
     
    NOTA: come specificato, questo codice utilizza le librerie di oggetti di Office 9.0. Quando si aggiungono riferimenti al progetto, se si selezionano le librerie di oggetti di Office 10.0 anziché quelle di Office 9.0, cercare nel codice le righe di commenti contenenti "//ACCESS10", "//EXCEL10" e "//WORD10" e rimuovere il commento dalla riga o dalle righe di codice a cui il commento si riferisce. Allo stesso modo, cercare nel codice commenti contenenti "//ACCESS9", "//EXCEL9" e "//WORD9" e mettere in commento la riga o le righe a cui il commento si riferisce.

  6. : come specificato, questo codice utilizza le librerie di oggetti di Office 9.0. Quando si aggiungono riferimenti al progetto, se si selezionano le librerie di oggetti di Office 10.0 anziché quelle di Office 9.0, cercare nel codice le righe di commenti contenenti "//ACCESS10", "//EXCEL10" e "//WORD10" e rimuovere il commento dalla riga o dalle righe di codice a cui il commento si riferisce. Allo stesso modo, cercare nel codice commenti contenenti "//ACCESS9", "//EXCEL9" e "//WORD9" e mettere in commento la riga o le righe a cui il commento si riferisce. Aggiungere la funzione riportata di seguito dopo il gestore button1_Click:
    private void RunMacro(object oApp, object[] oRunArgs)
    {
        oApp.GetType().InvokeMember("Run",
            System.Reflection.BindingFlags.Default |
            System.Reflection.BindingFlags.InvokeMethod,
            null, oApp, oRunArgs);
    }
  7. : come specificato, questo codice utilizza le librerie di oggetti di Office 9.0. Quando si aggiungono riferimenti al progetto, se si selezionano le librerie di oggetti di Office 10.0 anziché quelle di Office 9.0, cercare nel codice le righe di commenti contenenti "//ACCESS10", "//EXCEL10" e "//WORD10" e rimuovere il commento dalla riga o dalle righe di codice a cui il commento si riferisce. Allo stesso modo, cercare nel codice commenti contenenti "//ACCESS9", "//EXCEL9" e "//WORD9" e mettere in commento la riga o le righe a cui il commento si riferisce. Scegliere Finestra di progettazione dal menu Visualizza e fare doppio clic su Form1 per generare una definizione per l'evento Load del modulo.
  8. : come specificato, questo codice utilizza le librerie di oggetti di Office 9.0. Quando si aggiungono riferimenti al progetto, se si selezionano le librerie di oggetti di Office 10.0 anziché quelle di Office 9.0, cercare nel codice le righe di commenti contenenti "//ACCESS10", "//EXCEL10" e "//WORD10" e rimuovere il commento dalla riga o dalle righe di codice a cui il commento si riferisce. Allo stesso modo, cercare nel codice commenti contenenti "//ACCESS9", "//EXCEL9" e "//WORD9" e mettere in commento la riga o le righe a cui il commento si riferisce. Incollare nel gestore Form1_Load il codice riportato di seguito:
    private void Form1_Load(object sender, System.EventArgs e)
    {
        comboBox1.DropDownStyle = ComboBoxStyle.DropDownList;
        comboBox1.Items.AddRange(new object[]
            {"Access", "Excel", "PowerPoint", "Word"});
        comboBox1.SelectedIndex = 0;
    }
    
  9. : come specificato, questo codice utilizza le librerie di oggetti di Office 9.0. Quando si aggiungono riferimenti al progetto, se si selezionano le librerie di oggetti di Office 10.0 anziché quelle di Office 9.0, cercare nel codice le righe di commenti contenenti "//ACCESS10", "//EXCEL10" e "//WORD10" e rimuovere il commento dalla riga o dalle righe di codice a cui il commento si riferisce. Allo stesso modo, cercare nel codice commenti contenenti "//ACCESS9", "//EXCEL9" e "//WORD9" e mettere in commento la riga o le righe a cui il commento si riferisce. Scorrere la finestra del codice fino all'inizio e aggiungere le righe riportate di seguito alla fine dell'elenco di istruzioni using. Office XP:
    using System.Reflection;
    using Microsoft.Office.Core; //Office XP
    Office 2000:
    using System.Reflection;
    using Office;  //Office 2000

Esecuzione e verifica del client di automazione

  1. Premere F5 per eseguire l'applicazione.
  2. Selezionare un'applicazione di Office da ComboBox1 e scegliere Button1. L'applicazione di Office selezionata verrà avviata e le macro DoKBTest e DoKBTestWithParameter eseguite.

Risoluzione dei problemi

Quando si fa riferimento alla libreria di oggetti di Access 10.0 in un progetto di Visual C# .NET, è possibile che venga visualizzato un errore relativo alla mancata riuscita della conversione della libreria in un assembly .NET. Per la procedura di risoluzione di questo errore, in modo da poter fare riferimento alla libreria di oggetti di Access 10.0, vedere il seguente articolo della Microsoft Knowledge Base (gli articoli con prefisso "Q" contengono informazioni in inglese):
317157  (http://support.microsoft.com/kb/317157/ ) PRB: Errors When Referencing the Microsoft Access 10.0 Type Library

RIFERIMENTI

Per ulteriori informazioni, fare clic sui numeri degli articoli della Knowledge Base riportati di seguito (gli articoli con prefisso "Q" contengono informazioni in inglese):
303872  (http://support.microsoft.com/kb/303872/ ) HOWTO: Create an Excel Macro Using Automation from Visual C# .NET
177760  (http://support.microsoft.com/kb/177760/ ) VBA: How to Run Macros in Other Office Programs
Per ulteriori informazioni e risorse sull'automazione di Office, vedere i seguenti siti Web Microsoft:
Microsoft Office Development with Visual Studio (informazioni in lingua inglese)
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx (http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx)

FAQs And Highlights for Office Development (informazioni in lingua inglese)
http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx (http://msdn2.microsoft.com/en-us/library/aa188489(office.10).aspx)

Le informazioni in questo articolo si applicano a
  • Microsoft Visual C# .NET 2002 Standard Edition
  • Microsoft Access 2000 Standard Edition
  • Microsoft Excel 2000 Standard Edition
  • Microsoft PowerPoint 2000 Standard Edition
  • Microsoft Word 2000 Standard Edition
  • Microsoft Access 2002 Standard Edition
  • Microsoft Excel 2002 Standard Edition
  • Microsoft PowerPoint 2002 Standard Edition
  • Microsoft Word 2002 Standard Edition
Chiavi: 
kbhowto kbhowtomaster kbautomation kbaccess _ik11561 kbword kbexcel kbgrpdso KB306683
LE INFORMAZIONI CONTENUTE NELLA MICROSOFT KNOWLEDGE BASE SONO FORNITE SENZA GARANZIA DI ALCUN TIPO, IMPLICITA OD ESPLICITA, COMPRESA QUELLA RIGUARDO ALLA COMMERCIALIZZAZIONE E/O COMPATIBILITA' IN IMPIEGHI PARTICOLARI. L'UTENTE SI ASSUME L'INTERA RESPONSABILITA' PER L'UTILIZZO DI QUESTE INFORMAZIONI. IN NESSUN CASO MICROSOFT CORPORATION E I SUOI FORNITORI SI RENDONO RESPONSABILI PER DANNI DIRETTI, INDIRETTI O ACCIDENTALI CHE POSSANO PROVOCARE PERDITA DI DENARO O DI DATI, ANCHE SE MICROSOFT O I SUOI FORNITORI FOSSERO STATI AVVISATI. IL DOCUMENTO PUO' ESSERE COPIATO E DISTRIBUITO ALLE SEGUENTI CONDIZIONI: 1) IL TESTO DEVE ESSERE COPIATO INTEGRALMENTE E TUTTE LE PAGINE DEVONO ESSERE INCLUSE. 2) I PROGRAMMI SE PRESENTI, DEVONO ESSERE COPIATI SENZA MODIFICHE, 3) IL DOCUMENTO DEVE ESSERE DISTRIBUITO INTERAMENTE IN OGNI SUA PARTE. 4) IL DOCUMENTO NON PUO' ESSERE DISTRIBUITO A SCOPO DI LUCRO.
 

Traduzione articoli