2014-04-11 3 views
0

Selection.ShapeRange의 각 셰이프 개체의 .TopLeftCell 속성을 가져오고 싶지만 다음 코드를 실행할 때 '이 개체가이 속성 또는 메서드를 지원하지 않습니다.'라는 런타임 오류 438이 발생했습니다.Excel VBA TopLeftCell 속성

Sub testTopLeftCell() 
    For Each target In Selection.ShapeRange 
     MsgBox target.TopLeftCell.Address 
    Next 
End Sub 

그러나 다음 코드는 작동합니다.

Sub testTopLeftCell2() 
    For Each target In Selection.ShapeRange 
     MsgBox ActiveSheet.Shapes(target.Name).TopLeftCell.Address 
    Next 
End Sub 

누구나 저에게 가르 칠 수 있습니까? 첫 번째 코드의 문제점은 무엇이고 두 번째 코드는 왜 작동합니까? 나는이 문제와 정말로 혼동을 느낀다.

+0

모양 (예 : 하나 이상의 사각형, 그림, 타원 ...)이 '선택'에 있습니다. 두 번째 코드가 작동한다고 확신하지만 모양 선택 후 코드를 실행하면 첫 번째 코드가 작동하지 않습니다. [다른 웹 사이트] (http://www.mrexcel.com/forum/excel-questions/432495-vbulletin-macro-problem-using-topleftcell.html#)에도 비슷한 질문이 있지만 완전히 대답하지는 않았습니다. 정보 만 있으면 현재 환경이 MS Excel 2007입니다. 어쨌든 감사드립니다. – kwiqry

+0

어쩌면 옵션을 명시 적으로 사용하고 대상을 선언하십시오. Dim target as shape –

답변

1

For Each는, 첫 번째 코드에서 너무 targetShapeRange(i)에 대한 액세스를 제공하지 않습니다됩니다 (같은 참고로하는 것에 ShapeRange (i)에 의해 참조 된 개체이지만 Shape 개체가 아닙니다.

MSDN의 참조 기사에 따르면 ShapeRange Object에는 .TopLeftCell 속성이 없습니다.

반면에 ShapeRange(i)은 을 의미하며,이 값은 .TopLeftCell 속성을 사용하여 Shape Object을 반환합니다. 물론 Shapes 컬렉션의 멤버 인 도형 객체에 Shapes(j)까지 액세스 할 수도 있습니다.

그래서 우리는 한 그 모양 개체에서 약간 다른 특성을 제공하는 도형 개체에 대한 인터페이스의 일종으로 ShapeRange 개체를 생각할 수있다 (이 경우 ShapeRange이 .TopLeftCell 속성을 가지고 있지 않지만 모양이 있습니다.)

다른 경우 ShapeRange는 Shape Object와 동일한 속성을 제공합니다.

이것은 혼돈이 단일 도형 객체가 선택되었을 때 동일한 결과를 3 번 ​​반환하는 코드와 함께 나오는 이유입니다. 그러나 .Name 속성과 TypeName Function이 ShapeRange Object 및 Shape Object에 대해 동일한 결과를 반환하기 때문에 이러한 결과가 나타납니다.

Sub testShapeRange() 
    For Each target In Selection.ShapeRange 
     MsgBox "target: " + target.Name + "," + TypeName(target) 
     MsgBox "Selection.ShapeRange(1): " + _ 
      Selection.ShapeRange(1).Name + ", " + _ 
      TypeName(Selection.ShapeRange(1)) 
     MsgBox "ActiveSheet.Shapes(target.Name): " + _ 
      ActiveSheet.Shapes(target.Name).Name + "," + _ 
      TypeName(ActiveSheet.Shapes(target.Name)) 
    Next 
End Sub 
1

이 하위에 대상이 ShapeRange이기 때문입니다. ShapeRange에는 TopLeftCell 속성이 없습니다. 그것은 Name 속성을 가지고 있습니다 ............... 이것은 두 번째 하위가 작동하는 이유입니다. 여기

가 ShapeRange에서 개별 모양을 얻을 수있는 방법입니다 : ShapeRange 개체의 인스턴스 ShapeRange 컬렉션

Sub durall() 
    Dim s As Shape, i As Long 
    For i = 1 To Selection.ShapeRange.Count 
     Set s = Selection.ShapeRange(i) 
     MsgBox s.Name 
     MsgBox s.TopLeftCell.Address 
    Next i 
End Sub 
+0

감사합니다. 귀하의 의견은이 질문에 대한 답을 찾는데 도움이되었습니다. – kwiqry