2017-10-23 19 views
1

내가 만든 양식 응용 프로그램이 독립형이되도록 VBA 코드를 C#으로 전송하려고하는 중입니다. (그룹에서) 모양 안에있는 도형에서 텍스트를 가져 오는 데 문제가 있습니다. 다음은 VBA에서 완벽하게 작동하는 예제입니다.Visio Shape의 텍스트를 올바르게 읽는 방법

Dim text as String 
text = groupShape.shapes.item("rectangle").text 

올바른 값을 반환합니다. C#에서는 microsoft.office.interop.visio.dll 참조를 사용하고 있습니다. 모양 이름을 잘 읽을 수 있었기 때문에 응용 프로그램과 문서 객체가 잘 작동한다는 것을 알았습니다. C#에서 위의 코드는 다음과 같습니다.

var text = ""; 
text = Doc.Shapes.ItemU("groupShape").Shapes.ItemU("rectangle").text 

올바른 값을 반환하지 않습니다. 그것은 "Object"를 반환 할 것이므로 문자열은 반환하지 않는다는 것을 믿습니다.

텍스트를 반환하려면 어떻게해야합니까? 감사!

편집 : 내가 작성한 실제 코드는 다음과 같습니다. VBA를하고, C#을

VBA :

Dim tempShape As Shape 

Set tempShape = ActiveDocument.Pages(pageName).Shapes.Item("MainTable") 

txtJobName.value = tempShape.Shapes.Item("textJobName").Text 

C#을

IVisio.Shape tempShape = Doc.Pages[Loaded_Page.Name].Shapes.ItemU["MainTable"]; 

Txt_JobName.Text = tempShape.Shapes.ItemU["textJobName"].Characters.Text; 

ANOTHER 편집 : 나는 또한 텍스트가있는 셀을 참조하여 모양 데이터 속성에가는 시도했습니다 여전히 운이 없다.

Txt_JobName.Text = tempShape.Shapes.ItemU["textJobName"].CellsSRC[8, 0, 0].ResultStr[0]; 

답변

0

항상 그렇듯이 .Text가 "Obj"를 반환하는 이유는 그 도형에 텍스트가 없다는 것입니다. 텍스트가 있으면 리턴합니다. 나는 "Obj"라는 귀환에 너무 빠져 들었다. 왜 모양에 텍스트가없는 경우 빈 텍스트 또는 null을 반환하지 않는지 궁금합니다. 어쨌든,이 질문에 대한 다른 모든 대답은 매우 도움이되며 내 문제를 발견하게됩니다.

+0

즉, 모양에 필드가 있음을 의미합니다. 이 항목은 # 3, "Field"입니다. 'shape.Characters.Text' 사용 Visio 문서에서 어떤 필드인지 확인하십시오. – Nikolay

1
나는 Visio를 형식 라이브러리에 익숙하지 않다

하지만,이 :

groupShape.shapes.item("rectangle") 

Shape 객체를 반환합니다. 다른 점으로 버리는 대신 객체 참조를 가져옵니다. VBA는 여기에서 "도움이"되고 있으며 기쁜 마음으로 런타임에 만 해결되는 늦게 바인딩 된 호출을 작성할 수 있습니다. C#은 dynamic 키워드로만 허용되며 일반적으로 dynamic에 대해 코드를 작성하고 싶지는 않습니다. 강력한 종류로 작업하기 :

Dim rectangle As Shape 
Set rectangle = groupShape.shapes.item("rectangle") 

Dim rectangleText As String 
rectangleText = rectangle.Text 

는 C#/상호 운용성 코드가 동일 할 필요가 : 항상, 즉

var groupShape = (Shape)Doc.Shapes.ItemU("groupShape"); 
var rectangle = (Shape)groupShape.Shapes.ItemU("rectangle"); 
var rectangleText = rectangle.Text // assuming Text is defined on the Shape interface 

을 작업중인 유형의 인식; 회원이 object을 반환하고보다 구체적인 유형이 필요하면 회원 요청에 대한 컴파일시 유효성 검사를 수행하기 전에 적절하게 캐스팅하거나 컴파일 시간을 신경 쓰지 않으면 dynamic으로 전송해야합니다 검증 및이를 연기 실행 - 시간 :

var text = (string)((dynamic)groupShape.Shapes.ItemU("rectangle")).Text 

공지 사항 string에 캐스팅; textstring입니다. 그 캐스트를 잊어 버리면 코드처럼 dynamic이 암과 같은 실행 경로 전체에 퍼져서 유형 안전이 손상되어 사용자가 원하지 않을 것입니다.

+0

당신이 말한 것은 의미가 있었지만 슬프게도 나는 좋아하지 않았습니다. 귀하의 예제와 같은 두 번째 모양의 객체를 만들려고했는데 텍스트를 가져 와서 동일한 결과를 얻으려고 시도했습니다. 또한 동적/문자열로 캐스팅 한 정보로 몇 가지 다른 방법을 시도했습니다. – jediderek

+0

나는 그것이 무엇인지 알지 못한다. 그러나 갑자기 이것이 일하고있다. 이전에는 작동하지 않았지만 지금은 작동합니다. – jediderek

+0

잘못 배치 된 parenthese 일 수 있습니다. –

2

먼저 .Item이 아닌 .ItemU을 사용해보십시오. 두 가지 기능이 다릅니다. 기본 VBA (암시 적으로 VBA에서 사용하는 것)는 Item입니다.C에서 다른 모양을 실제로 처리 할 수도 있습니다.

두 번째로 .Text은 T로 시작해야하며, 작은 t의 코드는 컴파일하지 말아야합니다. 소문자로 된 .text이 어딘가에서 가져온 확장 메서드가 아님 (Visio와 관련 없음)

세 번째주의 사항 - UI에서 볼 때 모양에서 텍스트를 가져 오려면 shape.Characters.Text을 사용하는 것이 더 좋으며, 모양에 필드가 포함되어 있기 때문에 shape.Text은 필드 텍스트가 있어야하는 장소에 대한 자리 표시 자 ('obj')를 반환합니다. 그러나 이것은 VBA와 C# 모두에 적용됩니다.

네 번째 ..은 VBA에서 모양 이름이 아닌 변수 이름으로 보입니다. 코드에서 그룹 모양의 이름이 무엇인지 명확하지 않습니다. VBA에서 어떻게 그걸 얻습니까? 확인해 볼 가치가 있습니다.

+0

실제 코드로 내 질문에 대한 업데이트를 추가했습니다. 나는 그 모든 검사를 벌써했다 :/C# .item은 라이브러리에 존재하지 않는다. interop 라이브러리에'get_Item' 메쏘드가 있다면 @itemu – jediderek

+0

@jediderek 만 사용하라. –

+0

@ Mat'sMug .ItemU는 get_item 메소드입니다. – jediderek