Press "Enter" to skip to content

Agganciare Word via Interop quando è aperto o crearne una nuova istanza

Annoto questo pezzetto di codice per tenerne nota, è la versione .NET (C#) della funzionalità che in VB6 o VBA permetteva di creare un oggetto Word.Application che in caso il suddetto fosse aperto non generasse una nuova istanza ma usasse quella presente.

In questo modo, se ci sono documenti aperti li troveremo nella collection corrispondente, quindi potremo agganciarli e usarli Il codice sostituisce la famigerata GetObject non tipizzata ed è il seguente:

            Word.Application myWord = null;
            try
            {
                myWord = System.Runtime.InteropServices.Marshal.GetActiveObject(
                     "Word.Application") as Word.Application;
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                if (ex.Message.Contains("Operation unavailable") || ex.ErrorCode == -2147221021)
                {
                    myWord = new Word.ApplicationClass();
                }
                else
                {
                    throw ex;
                }
            }

Il codice su scritto assume che sia stata creata la seguente clausola using:

using Word = Microsoft.Office.Interop.Word;

La try/catch  viene utilizzata perché se Word non è aperto otteniamo l’eccezione su scritta, ho usato una OR per testare 2 delle cose che ci sono nei dati dell’exception perché non sono certa sia usato lo stesso codice o la descrizione non sia tradotta in base alla locale. Se avete un metodo più certo per testare una Com Exception parlate pure 😉

P.s. Lo stesso metodo può essere utilizzato per agganciare Excel, Outlook o qualsiasi altra applicazione via Interop. Per Excel cambia la stringa che diviene “Excel.Application” presumo che per Outlook sia “Outlook.Application” e così via.