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
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)
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번째 도형의 중심부 위치를 다시 계산해줍니다.
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
.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
With iSh2
.Left = tPos(2).CX - .Width / 2
.Top = tPos(2).CY - .Height / 2
End With
Erase tPos
End Function
'---------------------------------------------
Sub 도형_위치맞춤()
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
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
댓글 없음:
댓글 쓰기
의견이나 질문이 있으신 분은 언제든지 댓글을 달아주세요~