2009-10-06 103 views
0

我遇到了excel interop的問題。基本上,我想要做的就是用一個複雜的參數類型在.NET中調用一個Excel工作簿中的宏。然而,在這樣做的時候,我遇到了Application和ApplicationClass之間的一些差異,這給我帶來了一些麻煩。Excel Interop:應用程序和應用程序類的區別

下面是一些代碼:

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}) 

以Excel VBA宏,複雜類型被映射到對象。 (有趣的一面是,我在C#中首先嚐試了這種方式,並且不斷得到類型不匹配異常,它與C#代碼之間的唯一區別在於它傳遞給在VB.NET中創建的complexType,並且傳入的C#版本在C#中創建一個complexType。出於某種原因,我還沒有找到(對象類型的某種微妙差異?),C#之一失敗,而VB.NET之一)

無論如何,與上面的代碼片段。它只適用於ExcelApplication.ComObject是ApplicationClass,而不是應用程序接口。應用程序沒有GetType()成員。而且由於它們是COM類,所以你不能施放它們。如果可能的話,我傾向於使用Application,因爲我有另一塊,它將通過使用GetObject(..)自動爲用戶加載打開的工作簿,並且在使用ApplicationClass時會中斷(因爲您再次無法投射COM類,因此您只能投射GetObject(..)進入應用程序界面)。

有沒有人遇到過這個問題?
有沒有辦法像ApplicationObject一樣使用GetObject(..)?
還是一種使用GetType()和Application的方法? 或者可能有一些方法來投射COM對象?即:鑄造應用程序到應用程序類

希望我的解釋足夠清楚,代碼說明了我在做什麼。

回答

1

這應該是你的興趣:

Run macro using VB.Net

我看到反射的第二個我知道這是不完全正確。

僅供參考我貼的代碼可用來源:

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 
+0

衛生署,我覺得像這樣的小玩意兒。我實際上已經在C#中嘗試過這種方法,但它不起作用(由於我的問題在括號中的原因可能......而且我真的不想使用Missing.Value 30次:)),但我從不甚至試圖在VB.NET中使用它。現在一切正常。謝謝。 – 2009-10-06 22:49:00

+0

我討厭互操作。新的C#有一種調用辦公互操作的新方法,它具有更好的函數調用格式(幾乎與VB相同)C#可能不工作,因爲C#中的投射是明確的,您可能需要推送(對象)myobject在通話使它工作,再加上函數調用所有30 Ref.missing :)。 – Spence 2009-10-07 00:36:22

相關問題