글목록

2022년 3월 4일

PowerPoint 매크로 - 2개 이상 도형을 인접하도록 일괄 배열하기

Powerpoint에 삽입된 도형이나 그림을 마우스로 끌다보면, 다른 도형의 위치 관계를 참고할 수 있도록  빨간색 점선으로 보여줍니다. 그러나, 한 도형을 다른 도형에 정확하게 붙여서 배열하고 싶을 때에는 마우스로 끌어놓기로는 잘 맞지 않는 경우가 많습니다.

정밀한 그림을 그려야한다면 별도의 소프트웨어를 사용해야하겠지만, 간단한 그림이라고 대충배열하는 것은 맘에 들지 않는 경우가 많습니다.

아래와 같이 파란색의 1번 도형을 기준으로 대각선 모서리, 좌/우측 모서리, 중앙 등.. 원하는 위치에 맞게 배열이 되도록 매크로를 만들어두면 여러 개의 그림이나 도형을 배열할 때 편리할 수 있습니다.

여기에서 소개해드리는 함수는 각 모서리를 기준으로 배열하도록 했지만, Offset 값을 입력받도록 한다면 배열을 조금 더 다양하게 처리할 수 있습니다.

다만, 위와 같이 25개 위치에 배열하기 위한 Sub 프로시저를 25개를 만드는 것은 귀찮은 일이 될 수 있기 때문에 userform을 이용하거나, 입력문을 이용할 수도 있습니다.

'---------------------------------------------
Function Align2Shapes(iSh1 As Shape, iSh2 As Shape, iAlignX As Long, iAlignY As Long, Optional iOffsetX As Single = 0, Optional iOffsetY As Single = 0)
  Dim tPos(1 To 2) As typePicPos

  '입력받은 2개의 도형의 위치 정보를 확인합니다. 다만, 도형이 회전되어있는 경우, Left, Top 정보로부터 도형의 실제 좌/상 위치를 알 수 없기 때문에 미리 만들어둔 회전된 도형의 위치 정보를 읽어오는 함수를 이용합니다.
  tPos(1) = GetPositionOfRotatedShape(iSh1)
  tPos(2) = GetPositionOfRotatedShape(iSh2)

  '2번째 도형의 위치를 배열하려는 위치에 맞게 계산해줍니다. 1~5번 위치 정보는 위의 그림을 참조하시면 됩니다.
  With tPos(2)
    Select Case iAlignX
      Case 1
        .Left = tPos(1).Left - .Width
      Case 2
        .Left = tPos(1).Left
      Case 3
        .Left = tPos(1).Left + (tPos(1).Width - .Width) / 2
      Case 4
        .Left = tPos(1).Left + (tPos(1).Width - .Width)
      Case 5
        .Left = tPos(1).Left + tPos(1).Width
    End Select
    Select Case iAlignY
      Case 1
        .Top = tPos(1).Top - .Height
      Case 2
        .Top = tPos(1).Top
      Case 3
        .Top = tPos(1).Top + (tPos(1).Height - .Height) / 2
      Case 4
        .Top = tPos(1).Top + (tPos(1).Height - .Height)
      Case 5
        .Top = tPos(1).Top + tPos(1).Height
    End Select
  '2번째 도형의 중심부 위치를 다시 계산해줍니다.
    .CX = .Left + .Width / 2 + iOffsetX
    .CY = .Top + .Height / 2 + iOffsetY
  End With
  '중심 좌표로부터 도형의 실제 위치를 변경해줍니다.
  With iSh2
    .Left = tPos(2).CX - .Width / 2
    .Top = tPos(2).CY - .Height / 2
  End With
  Erase tPos
End Function
'---------------------------------------------
Sub 도형_위치맞춤()
  '사용자가 배열할 여러 개의 도형을 선택한 상태에서 매크로를 실행합니다. 여기에서는 Offset을 입력받는 기능은 생략했습니다. 필요하신 분은 추가하시면 됩니다.
  '배열할 가로, 세로 위치를 입력받아 도형을 배열하도록 합니다.
  '2개 이상 여러 개의 그림을 선택했다면, 1번을 기준으로 2번 도형을 배열하고, 다시 2번 도형을 기준으로 3번 도형을 배열합니다. 예를 들어, 가로 방향으로 5, 세로 방향으로 3을 선택했다면 1번 오른쪽 중앙에 2번 그림을, 다시 2번의 오른쪽 중앙에 3번 그림이 배열되므로, 여러개 도형을 한꺼번에 1열로 배열하는 기능이 구현됩니다.
  Dim tSR As ShapeRange, tAlignX As Long, tAlignY As Long, tStr As String
  Set tSR = SelectedShapeRange(True)
  If tSR.Count < 2 Then MsgBox "2개 이상의 도형을 선택하세요.", vbInformation, "선택 오류": Exit Sub
  
  tStr = InputBox("가로 방향으로 배열할 위치를 지정하세요.", "가로 위치", 3)
  tAlignX = Val(tStr)
  If tAlignX < 1 Or tAlignX > 5 Then Exit Sub
  
  tStr = InputBox("세로 방향으로 배열할 위치를 지정하세요.", "세로 위치", 3)
  tAlignY = Val(tStr)
  If tAlignY < 1 Or tAlignY > 5 Then Exit Sub
  
  For i = 2 To tSR.Count
    Align2Shapes tSR(i - 1), tSR(i), tAlignX, tAlignY
  Next
End Sub

많이 본 글 :