2009-10-06 6 views
0

Excel interop에서 문제가 있습니다. 기본적으로, 내가하려고하는 것은 복잡한 인수 형식을 사용하여 .NET의 Excel 통합 문서에서 매크로를 호출하는 것입니다. 그러나 그렇게함으로써 나는 Application과 ApplicationClass 사이의 차이점을 겪고있다. 여기 Excel Interop : 응용 프로그램 및 응용 프로그램 차이점

일부 코드 : 엑셀 VBA 매크로에서

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

, 복합 타입은 객체에 매핑됩니다.

(흥미로운 측면 노트, 나는 이것을 C#에서 처음 시도했는데 형식 불일치 예외가 계속 발생했다.이 코드와 C# 코드의 유일한 차이점은 VB.NET에서 작성된 complexType을 전달하고 C# 버전이 C#에서 만든 complexType. 어떤 이유로 ObjectType에 미묘한 차이가 있습니까? (즉, VB.NET이 작동하는 반면 C#은 실패 함)

어쨌든 위의 코드 스 니펫. ExcelApplication.ComObject가 ApplicationClass이고 Application 인터페이스가 아닌 경우에만 작동합니다. 응용 프로그램에는 GetType() 멤버가 없습니다. 그리고 그들은 COM 클래스이므로 캐스팅 할 수 없습니다. 가능한 한 응용 프로그램을 사용하고 싶습니다. GetObject (..)를 사용하여 사용자에 대해 자동으로 열려있는 통합 문서를로드하고 ApplicationClass를 사용할 때이 작업이 중단됩니다 (COM 클래스를 캐스팅 할 수 없으므로 캐스팅 만 가능함). 애플리케이션 인터페이스로 GetObject (..).

이전에이 문제를 발견 한 사람이 있습니까?
ApplicationClass에서 GetObject (..)와 같은 것을 사용할 수 있습니까?
또는 응용 프로그램에서 GetType()을 사용하는 방법은 무엇입니까? 또는 COM 개체를 전송할 수있는 방법이 있습니까? ie : ApplicationClass에 응용 프로그램을 캐스팅하십시오.

제 설명이 명확하고 코드가 제가하고있는 것을 보여주기를 바랍니다.

답변

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에서 사용하려고했습니다. 이제는 모두 작동합니다. 고맙습니다. –

+0

나는 interop이 싫다. 새로운 C#에는 Office interop을 호출하는 새로운 방법이 있습니다.이 함수는 더 나은 형식의 함수 호출 (거의 VB와 동일합니다)을 사용합니다. C#에서의 캐스팅이 명시 적이기 때문에 아마도 작동하지 않을 것입니다. 아마도 객체의 myobject 함수 호출에 30 개의 Ref.missing을 추가 한 것). – Spence