0

Excelの相互運用で問題が発生しています。基本的に、私がやろうとしているのは、複雑な引数タイプを使用して.NETからExcelブックのマクロを呼び出すことです。ただし、そうすることで、ApplicationとApplicationClassの間にいくつかの違いが生じ、頭痛の種になります。

ここにいくつかのコードがあります:

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

エクセルVBAマクロでは、complexTypeはオブジェクトにマップされます。

(興味深いことに、私は最初にこれをC#で試し、Type Mismatch例外を取得し続けました。これと、C#コードの唯一の違いは、これがVB.NETで作成されたcomplexTypeで渡され、C#バージョンがで作成されたcomplexTypeで渡されることです。 C#。まだ理解していない何らかの理由で(オブジェクトタイプの微妙な違いはありますか?)、C#は失敗しますが、VB.NETは機能します)

とにかく、上記のコードスニペットで。これは、ExcelApplication.ComObjectがApplicationClassであり、Applicationインターフェイスではない場合にのみ機能します。アプリケーションにはGetType()メンバーがありません。また、COMクラスであるため、キャストすることはできません。GetObject(..)を使用してユーザー用に開いているブックを自動的にロードする別のピースがあるため、可能であればApplicationを使用したいと思います。これは、ApplicationClassを使用すると機能しなくなります(ここでもCOMクラスをキャストできないため、キャストのみが可能です) GetObject(..)をアプリケーションインターフェイスに)。

誰かが以前にこの問題に遭遇したことがありますか?
ApplicationClassでGetObject(..)のようなものを使用する方法はありますか?
または、アプリケーションでGetType()を使用する方法はありますか?または、COMオブジェクトをキャストする方法はありますか?つまり、ApplicationをApplicationClassにキャストします

うまくいけば、私の説明は十分に明確であり、コードは私がしていることを示しています。

4

1 に答える 1

1

これはあなたにとって興味深いはずです:

VB.Netを使用してマクロを実行する

私が反射を見た2番目に私はこれが完全に正しくないことを知っていました。

参考までに、ソースで入手可能なコードを投稿しました。

    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
于 2009-10-06T22:32:16.377 に答える