Excel Interop: Applicazione e ApplicationClass differenze
-
20-09-2019 - |
Domanda
Io corro in un problema con Excel interoperabilità. In sostanza, quello che sto cercando di fare è chiamare una macro in una cartella di lavoro Excel da .NET con un tipo di argomento complesso. Tuttavia, così facendo che sto funzionando in alcune differenze tra l'applicazione e ApplicationClass che mi stanno dando qualche mal di testa.
Un po 'di codice:
Dim complexType As New BigBadClass
Dim result As Boolean = importerClass.ExcelApplication.ComObject.GetType().InvokeMember("Run", _
Reflection.BindingFlags.Default + Reflection.BindingFlags.InvokeMethod, Nothing, _
importerClass.ExcelApplication.ComObject, _
New Object() {"TheMacroName", AStringValue, ALongValue, complexType})
Nella macro VBA di Excel, complexType viene mappata a un oggetto.
(Interessante nota a margine, ho provato questo in C # prima e continuava ad eccezioni di tipo non corrispondente, l'unica differenza tra questo e il codice C # è che questo passa in un complexType creato in VB.NET, e la versione C # passata in un complexType creato in C #. Per qualche ragione che non ho ancora capito (una sorta di sottili differenze nel tipo Object?), il C # uno non riesce, mentre quello VB.NET funziona)
In ogni modo, con il frammento di codice di cui sopra. Funziona solo se l'ExcelApplication.ComObject è un ApplicationClass, e non l'interfaccia dell'applicazione. Applicazione non dispone di un membro GetType (). E dal momento che sono classi COM, è possibile non li lanci. Io preferirei usare applicazione, se possibile, come ho già un altro pezzo che caricherà cartelle di lavoro aperte automaticamente per l'utente utilizzando GetObject (..) e questo rompe quando si utilizza ApplicationClass (come ancora una volta non puoi lanciare classi COM, in modo da poter lanciare solo GetObject (..) in un'interfaccia Application).
Qualcuno ha incontrato questo problema prima?
C'è un modo per usare qualcosa come GetObject (..) con ApplicationClass?
O un modo per utilizzare GetType () con l'applicazione?
O forse un modo per lanciare oggetti COM? vale a dire: la fusione Applicazione per ApplicationClass
Spero che la mia spiegazione è abbastanza chiara, e il codice illustra quello che sto facendo.
Soluzione
Questo dovrebbe essere di interesse per voi:
Esegui macro utilizzando VB.Net
La seconda riflessione che ho visto ho capito che questo non era abbastanza di destra.
Solo per riferimento ho postato il codice disponibile sul fonte:
Dim oExcel As Excel.ApplicationClass
Dim oBook As Excel.WorkbookClass
Dim oBooks As Excel.Workbooks
'Start Excel and open the workbook.'
oExcel = CreateObject("Excel.Application")
oExcel.Visible = True
oBooks = oExcel.Workbooks
oBook = oBooks.Open("c:\book1.xls")
'Run the macros.'
oExcel.Run ("DoKbTest")
oExcel.Run("DoKbTestWithParameter", "Hello from VB .NET Client")
'Clean-up: Close the workbook and quit Excel.'
oBook.Close (False)
System.Runtime.InteropServices.Marshal.ReleaseComObject (oBook)
oBook = Nothing
System.Runtime.InteropServices.Marshal.ReleaseComObject (oBooks)
oBooks = Nothing
oExcel.Quit()
System.Runtime.InteropServices.Marshal.ReleaseComObject (oExcel)
oExcel = Nothing