2009-12-01 3 views
3

부 (Boo)를 조사 중이며 Excel (2007)을 자동화하는 몇 가지 훌륭한 VB 스크립트를 변환하는 것이 유용한 방법이라고 생각합니다. 많은 것들이 매우 쉽게 번역되는 것처럼 보입니다. 그러나 범위를 선택하는 데 많은 어려움을 겪고 있습니다. 대상을 얻거나 설정하려고 할 때마다 TargetInvocationException 멤버를 찾을 수 없습니다. 여기Boo - Excel 자동화, 범위 선택 문제

내가 booish에서 실행 한 A (삭감) 예제 :

def CreateInstance(progid): 
    type = System.Type.GetTypeFromProgID(progid)  
    return type() 

xl as duck = CreateInstance("Excel.Application") 
xl.Visible = true 
xl.Workbooks.Add 

sht as duck = xl.ActiveSheet 
#Next line throws exception 
rng as duck = sht.Range("A1") 

어떤 일이 등등과 같은 시트의 이름 속성을 설정으로, 좋은 일을하고,하지만 난 범위와 방법을 작동합니까 ? VB에서 숨길 수있는 몇 가지 특별한 메소드가 있습니까? 그렇다면 어떻게 찾을 수 있습니까?

건배,

Lenny.

답변

3

Range는 실제로 속성이며 인덱서로 작동한다는 점에서 다소 특이한 속성입니다. 즉, 배열이나 사전과 같은 의미를 가짐을 의미합니다. 대부분의 언어에서는 sht.Range["A1"]에 액세스 할 수 있습니다. 즉 문법 설탕, 그리고 정말로 단지, 즉 다른 방법처럼 액세스 것 :

sht.get_Range("A1",System.Reflection.Missing.Method) 

내가 문법 설탕 스타일과 명시 적 메서드 호출을 모두 사용하여, 코드를 반복 우우, 루비와 아이언 루비를 사용하려고했습니다. IronRuby에서 완벽하게 작동하도록 할 수는 있지만 은 32 비트 인터프리터에만 있습니다. 내 구성에있는 32 비트 응용 프로그램 인 일반 Ruby에서도 제대로 작동했습니다. 64 비트 인터프리터에서는 Range 속성이 절대로 올바르게 해석되지 않았습니다.

그래서 나는 Boo Interactive Shell이 ​​64 비트 모드로 실행되고 있고 그로 인해 interop가 실패한 것으로 의심하게되었습니다. 아쉽게도 CORFLAGS.exe를 사용하여 로컬 Boo 바이너리를 32 비트 모드로 실행 한 후에도 동일한 문제가 재현되어 실제 문제는 아닙니다. 일을 무슨 짓을

는하지만, 명시 적으로처럼, 엑셀 후에 .NET Interop를 도서관뿐만 아니라 상호 운용성 서비스 네임 스페이스를 가져이었다

import Microsoft.Office.Interop.Excel 
import System.Runtime.InteropServices 

xl_type=typeof(Application).GetCustomAttributes(typeof(CoClassAttribute),true)[0].CoClass 
xl=xl_type() 
xl.Visible=true 
xl.Workbooks.Add 
다음

:

xl.Range["A1","A2"].Value=12 
xl.Range["A1",System.Type.Missing].Value="Alpha" 
(xl.ActiveSheet as Worksheet).Range["A1","A2"].Value2='Whatever' 

이러한 모든 작업 , 근본적으로 당신은 늦은 바인딩 (당신의 오리 타이핑이하는 것)에서 익숙한 "Scriptiness"를 포기해야합니다.

VB/VBScript와 다른 점은 대부분의 언어 (C# 4.0 제외)에서 일반적으로 선택적 매개 변수는 투명하게 처리되지 않으므로 처리 할 때 API를 더 자세히 살펴야한다는 것입니다. 선택적 매개 변수를 지원하는 메서드 (System.Type.Missing 또는 System.Reflection에 해당하는 매개 변수로 바꾸기) Excel 상호 운용성 문서를 통해이를 확인할 수 있습니다.하지만 리플렉션을 사용하면 옵션으로 표시된 매개 변수를 쉽게 찾을 수 있습니다.

Ruby는 이러한 개체를 늦게 바인딩하는 데 알맞은 솔루션을 가지고 있기 때문에 Boo의 COM interop 시나리오에 누락 된 기능이나 버그가 있다고 의심됩니다.

덧붙여 편집 : Sam Ng writes about indexed property support in C# 4.0; 그의 게시물에 설명 된 문제가 Boo에도 적용될 수 있습니다.

+0

많은 노력을 기울여 주셔서 감사합니다. 좀 더 조사하겠습니다! –