글목록

2022년 1월 29일

PowerPoint 매크로 - 현재 선택된 도형/개체를 ShapeRange에 지정하기

Powerpoint에서 작업 중인 슬라이드에서 개체를 선택한 후, 어떠한 매크로를 실행하고자 합니다. 이때 사용자가 선택한 개체를 변수에 할당한 후 일괄 작업을 하도록 매크로를 작성할 수 있습니다.

사용자가 슬라이드에서 어떤 개체나 글자 등을 선택하게 되면, 선택된 항목은 ActiveWindow.Selection에 할당되어 있습니다. 선택된 개체가 어떠한 형태인지, 몇개인지 등에 대한 정보가 모두 포함되어있습니다. 만약, 선택된 개체가 도형이나 그림이라면 ShapeRange 안에 포함되어 있습니다. 다만, Shape 개체는 그룹화되어 있기도 하고, 각각의 개체일 수도 있고, 이들의 조합인 경우도 있습니다.

어떤 도형이나 그림을 여러 개 선택한 후, 배열을 다시 하고 싶다고 하면, 사용자가 현재 어떤 개체를 선택했는지 알아야합니다. 선택한 상황에 따라 아래와 같이 선택 개체를 사용자가 임의로 접근할 수 있는 ShapeRange에 지정해주면 작업이나 코드가 간결해질 수 있습니다.

1. 여러 개의 개체를 선택했다면, 각각의 개체를 ShapeRange로 지정합니다. 아래와 같이 선택하면, ShapeRange의 Item(1), Item(2), Item(3)에 각각 원, 사각형, 삼각형이 지정됩니다.

아래와 같이 선택되면, 그룹화된 개체와 별이 각각 Item(1)과 Item(2)에 지정됩니다.

2. 1개의 그룹화된 개체에서 일부 Child 개체를 지정해서 선택했다면, Child 개체를 ShapeRange에 지정합니다. 아래와 같이 지정하면, Child 개체인 원과 사각형만 Item(1), Item(2)에 지정하고, 삼각형은 ShapeRange에 할당되지 않습니다. 사용자가 Child 개체를 일부러 선택했다는 것은 Child 개체가 작업 대상이란 의미입니다만, 그냥 ShapeRange를 읽어오게 되면 Child 개체가 아닌 그룹화된 개체 1개를 통째로 ShapeRange에 지정하게 됩니다.

3. 그룹화된 개체 안에 여러 개의 개체가 있고, Child 개체 대신 그룹화된 개체 1개를 선택했을 때 그룹 내 Child 개체 전체를 선택하고 싶으면, 사용자가 각각의 개체를 수고스럽게 Shift나 Ctrl 버튼과 조합해 클릭해서 선택하지 않더라도 자동으로 모든 개체가 선택한 것으로 바꿔서 ShapeRange에 지정해주면 조금은 편리할 수 있습니다.

또한, 어떨 때에는 Child 개체로 나눠줄 게 아니라, 그룹화된 개체 1개를 선택한 그대로 반환할 필요도 있겠지요. 아래와 같이 그룹화된 1개 도형을 선택하면, 각각의 Child 개체를 ShapeRange에 할당할지, 그룹 전체를 1개 Shape으로 할당할지는 선택할 수 있도록 합니다.


이상의 조건을 만족할 수 있도록, 사용자가 도형이나 그림 개체를 여러개 선택했을 때, 선택된 개체를 ShapeRange로 지정해서 반환해주는 매크로입니다.

----------------------------------------
Function SelectedShapeRange(Optional iSelChildShape As Boolean = True) As ShapeRange
  On Error GoTo ErrorHandler
  Dim tSel As ShapeRange, i As Long, tSN() As Long
  '선택한 개체가 그룹화된 개체의 Child 개체라면 Child 개체를 ShapeRange에 할당합니다.
  If ActiveWindow.Selection.HasChildShapeRange Then
    Set tSel = ActiveWindow.Selection.ChildShapeRange
  Else
  'Child 개체가 아니라면, 그룹화된 1개 개체인지, 아니면 여러개를 선택했는지 확인하고, 그룹화된 1개 개체라면 옵션에 따라 Child 개체로 나눌 것인지, 그룹 개체를 그대로 할당할지 선택합니다.
    Set tSel = ActiveWindow.Selection.ShapeRange

    If iSelChildShape And tSel.Count = 1 And tSel(1).Type = msoGroup Then
  '만약 1개 그룹이 선택되고, 각각의 Child 개체로 나눠서 ShapeRange로 지정하려면, GroupItem을 ShapeRange로 변환해야합니다. ShapeRange는 배열 지정과 달라서 사용자가 임의로 변경하지 못합니다. 따라서 아래와 같이 Shape의 Index 배열을 만든 후, 다시 Range 매서드를 사용하여 지정해주어야 ShapeRange로 지정할 수 있습니다.
      ReDim tSN(1 To tSel(1).GroupItems.Count)

      For i = 1 To tSel(1).GroupItems.Count: tSN(i) = i: Next
      Set tSel = tSel(1).GroupItems.Range(tSN)
      tSel.Select msoTrue
    End If
  End If
  'ShapeRange를 함수값으로 반환해주고 마칩니다.
  Set SelectedShapeRange = tSel
ErrorHandler:
  Erase tSN
End Function

댓글 없음:

댓글 쓰기

의견이나 질문이 있으신 분은 언제든지 댓글을 달아주세요~

많이 본 글 :