2014-02-19 1 views
1

다소 VBA 초보자가 여기 있습니다.Excel VBA : 워크 시트의 현재 셰이프를 모두 ShapeRange에 추가하는 방법은 무엇입니까?

그것은 나에게 분명 방법 ShapeRange 사용하여 개별 또는 여러 Shape 객체를 생성합니다 :

Dim sht As Worksheet 
Set sht = MySht 
' 
'*Add some shapes* 
' 
Dim shprng As ShapeRange 
Set shprng = sht.Shapes.Range(Array(1,2,3)) 

shprng에 워크 시트에 현재 존재하는 형태의 ALL을 추가 할 수있는 방법이 있나요? 즉, Shapes 개체에서 ShapeRange을 반환하는 방법이 있습니까? 다음과 같은 내용 :

Set shprng = sht.Shapes.Range.SelectAll '<--- Does not work: Type Mismatch 
Set shprng = sht.Shapes     '<--- Same error 
Set shprng = sht.Shapes.Range   '<--- Error: Argument not optional 

감사합니다.

답변

4

시트의 모든 셰이프를 선택하여 ShapeRange를 만들려면 먼저 셰이프를 선택하고 선택 개체에서 ShapeRange를 가져옵니다.

sht.Shapes.Range.SelectAll 
Set shprng = Selection.ShapeRange 

나는 보통이 벗겨지기 쉬운 경향이 이상한 상황에서 오류가 발생할 수 있기 때문에 VBA에서 선택 객체를 사용하지 않으. 더 나은 방법은 Shape 인덱스 배열을 만들고이 배열을 사용하여 ShapeRange를 가져 오는 것입니다.

Dim shape_index As Variant 
Dim i As Long 

ReDim shape_index(1 To sht.Shapes.Count) 
For i = 1 To UBound(shape_index) 
    shape_index(i) = i 
Next 

Set shprng = sht.Shapes.Range(shape_index) 
+0

감사합니다. 제가하려는 일을 수행합니다. 'Shapes' 컬렉션 객체가 활성화 된 객체 벡터인지 여부를 알고 있습니까? 내가 의미하는 바는'sht.Shapes.Count = 5'라고하고'sht.Shapes (2) .Delete'라고했습니다. 'shapes.Shapes.Count'는 이제 4와 같고,'Shapes (3)'과'Shapes (4)'는 이제 2,3이됩니까? –

+0

예, 설명대로 셰이프 개체가 자동으로 업데이트됩니다. – Tmdean

+1

사이드 노트 : 코드가 실패 할 경우 두 개의 셰이프가 같은 이름을 가질 수 있습니다. 이것을 shprng에 추가하면됩니다 : shprng.select : sht.Shapes (i) .select replace : = false : set shprng = selection.shaperange'. activesheet가 모양이있는 시트 인 경우 작동합니다. –

관련 문제