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.
Creare un documento di Word denominato C:\Doc1.doc. Per fare questo, attenersi alla seguente procedura:
Creare un nuovo documento in Microsoft Word.
Premere ALT+F11 per aprire Visual Basic Editor.
Scegliere
Modulo
dal menu
Inserisci.
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
Chiudere Visual Basic Editor, salvare il documento e chiudere Word.
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.
Creare una presentazione di PowerPoint denominata C:\Pres1.ppt utilizzando una procedura simile a quella vista per la creazione del documento di Word.
Creare un nuovo database di Access denominato C:\Db1.mdb. Per eseguire questa operazione, attenersi alla seguente procedura:
Scegliere
Modulo
dal menu
Inserisci.
Incollare il codice della macro nel nuovo modulo.
Salvare il modulo e chiudere Access.
Creazione del client di automazione di Visual C# .NET
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.
Aggiungere un riferimento alle librerie di oggetti di Access, Excel, PowerPoint e Word. Per eseguire questa operazione, attenersi alla seguente procedura:
Scegliere
Aggiungi riferimento
dal menu
Progetto.
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.
Ripetere il passaggio precedente per le librerie di oggetti di Access, Excel e PowerPoint.
Scegliere
OK
nella finestra di dialogo
Aggiungi riferimento
per accettare la selezione. Se viene chiesto di generare wrapper per le librerie selezionate, scegliere
Sì.
Nota: vedere la sezione
Risoluzione dei problemi
in caso di errore in cui viene fatto riferimento alla libreria di oggetti di Access 10.0.
Scegliere
Finestra di progettazione
dal menu
Visualizza. Aggiungere una casella combinata e un pulsante a Form1.
Fare doppio clic su
Button1
per generare una definizione per il gestore dell'evento Click del pulsante.
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.
: 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:
: 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.
: 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:
: 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
Premere F5 per eseguire l'applicazione.
Selezionare un'applicazione di Office da
ComboBox1
e scegliere
Button1.
L'applicazione di Office selezionata verrà avviata e le macro DoKBTest e DoKBTestWithParameter eseguite.
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
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:
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.