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.

È stato utile?

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top