관련: 지식인
1. 순수하게 도형기능을 이용한다면 큰 원 테두리에 원을 위와 아래에 2개를 추가하고
이 두 개의 원을 7~8번 복제해서 회전시키는 방법이 좋습니다.
아래 링크 첫번째 방법입니다.
원의 개수가 홀수라면 작은 원 뒤에 임시로 큰 원을 하나 그리고 작은 원과 큰 원을 그룹으로 묶은 다음 회전시키는 방법을 이용해야겠습니다.
2. VBA를 이용하여 자동으로 원을 원하는 개수만큼 그려줄 수 있습니다. 첨부파일의 Auto1 매크로입니다.
원의 개수가 짝수인 경우입니다.
DrawCircles [원의 개수], [간격] 을 변경하면 원하는 개수와 간격으로 자동으로 만들어줍니다.
더보기
Const PI = 3.14159265358979
Const Margin As Single = 50 '원의 바깥 여백
'Const M As Single = 10 '작은 원의 바깥 여백
'Const iMax = 60 '작은 원 개수
Sub Auto2()
drawCircles 12, 10
End Sub
Function drawCircles(iMax As Integer, M As Single)
Dim Pres As Presentation
Dim sld As Slide
Dim Shp0 As Shape, Shp1 As Shape, Shp2 As Shape
Dim l!, t!, w!, rb!, rs!, SH!, SW!
'Dim iMax As Integer
Dim i As Integer
Dim arrShp() As String
Set Pres = ActivePresentation
Set sld = ActiveWindow.Selection.SlideRange(1)
If iMax Mod 2 <> 0 Then MsgBox "원의개수는 짝수여야 합니다.": Exit Function
'iMax = 60 '// 작은 원 개수
ReDim arrShp(iMax / 2)
With Pres.PageSetup: SH = .SlideHeight: SW = .SlideWidth: End With
rb = SH / 2 - Margin '큰 원의 반지름
'배경 큰 원( 참고용 )
l = SW / 2 - rb
t = Margin
w = rb * 2
Set Shp0 = sld.Shapes.AddShape(msoShapeOval, l, t, w, w)
Shp0.Name = "BigOval" & 0
Shp0.Fill.Visible = msoFalse
'Shp0.Fill.ForeColor.RGB = rgbOrange
'Shp0.Fill.Transparency = 0.95
'12시방향 작은 원
rs = Tan((360 / (iMax * 2)) * (PI / 180)) * rb '작은 원의 반지름
l = SW / 2 - rs
t = SH / 2 - rb - rs
w = rs * 2
Set Shp1 = sld.Shapes.AddShape(msoShapeOval, l + M, t + M, w - M * 2, w - M * 2)
Shp1.Name = "Oval" & iMax
Shp1.Fill.ForeColor.RGB = rgbSteelBlue
Shp1.Line.Visible = msoFalse
'6시방향 작은 원
l = SW / 2 - rs
t = SH / 2 + rb - rs
w = rs * 2
Set Shp2 = sld.Shapes.AddShape(msoShapeOval, l + M, t + M, w - M * 2, w - M * 2)
Shp2.Name = "Oval" & iMax / 2
Shp2.Fill.ForeColor.RGB = rgbSteelBlue
Shp2.Line.Visible = msoFalse
sld.Shapes.Range(Array(Shp1.Name, Shp2.Name)).Group.Name = "OvalSet0"
arrShp(0) = "OvalSet0"
'12시와 6시 작은원을 그룹으로 만들어 복사 후 회전
For i = 1 To Int(iMax / 2) - 1
With sld.Shapes("OvalSet0")
l = .Left
t = .Top
With .Duplicate(1)
.Left = l
.Top = t
.Rotation = 360 / iMax * (i)
.Name = "OvalSet" & i
.GroupItems(1).Name = "Oval" & i
.GroupItems(2).Name = "Oval" & (iMax / 2) + i
arrShp(i) = .Name
End With
End With
Next i
sld.Shapes.Range(arrShp).Ungroup
'정렬
For i = i To iMax
sld.Shapes("Oval" & i).ZOrder msoSendToFront
Next i
End Function
3. 위 코드에서 홀수개수의 원도 만들 수 있게 수정한 버전입니다.
큰 원 도형을 만들어서 작은 원과 그룹으로 만든 뒤에 회전시키는 방법을 사용합니다.
작게 만들면 그룹으로 만들어서 회전시킬 때 정 가운데를 벗어나기 때문에 회전반경보다 큰 원을 만들어야 합니다.
Auto3 서브루틴에서 DrawCircles1 [원의 개수], [ 간격]을 수정하고 실행하면 됩니다.
더보기
Const PI = 3.14159265358979
Const Margin As Single = 50 '원의 바깥 여백
'Const M As Single = 10 '작은 원의 바깥 여백
'Const iMax = 60 '작은 원 개수
Sub Auto3()
drawCircles1 14, 2
End Sub
Function drawCircles1(iMax As Integer, M As Single)
Dim Pres As Presentation
Dim sld As Slide
Dim Shp0 As Shape, Shp1 As Shape, Shp2 As Shape
Dim l!, t!, w!, rb!, rs!, SH!, SW!
'Dim iMax As Integer
Dim i As Integer
Dim arrShp() As String
Set Pres = ActivePresentation
Set sld = ActiveWindow.Selection.SlideRange(1)
'iMax = 60 '// 작은 원 개수
ReDim arrShp(iMax)
With Pres.PageSetup: SH = .SlideHeight: SW = .SlideWidth: End With
rb = SH / 2 - Margin '큰 원의 반지름
'배경 큰 원( 참고용 )
l = SW / 2 - rb
t = Margin
w = rb * 2
Set Shp0 = sld.Shapes.AddShape(msoShapeOval, l, t, w, w)
Shp0.Name = "BigOval" & 0
Shp0.Fill.Visible = msoFalse
'12시방향 작은 원
rs = Tan((360 / iMax / 2) * (PI / 180)) * rb '작은 원의 반지름
rs = rs * (rb - rs) / rb
l = SW / 2 - rs
t = SH / 2 - rb
w = rs * 2
Set Shp1 = sld.Shapes.AddShape(msoShapeOval, l + M, t + M, w - M * 2, w - M * 2)
Shp1.Name = "Oval" & iMax
Shp1.Fill.ForeColor.RGB = rgbMediumVioletRed
Shp1.Line.Visible = msoFalse
sld.Shapes.Range(Array(Shp0.Name, Shp1.Name)).Group.Name = "OvalSet0"
arrShp(0) = "OvalSet0"
'그룹도형을 복사 후 회전
For i = 1 To iMax - 1
With sld.Shapes("OvalSet0")
l = .Left
t = .Top
With .Duplicate(1)
.Left = l
.Top = t
.Rotation = 360 / iMax * (i)
.Name = "OvalSet" & i
.GroupItems(2).Name = "Oval" & i
.GroupItems(1).Delete
'.GroupItems(2).Name = "Oval" & iMax + i
'arrShp(i) = .Name
End With
arrShp(i) = "Oval" & i
End With
Next i
sld.Shapes.Range(arrShp).Ungroup
'정렬
For i = 1 To iMax
sld.Shapes("Oval" & i).ZOrder msoSendToFront
Next i
End Function
4. 스마트 아트로 만들고 그룹을 해제한 다음 필요 없는 부분을 삭제하는 것이 손쉬운 방법이긴 합니다.
샘플 파일 첨부합니다.
'PPT+VBA' 카테고리의 다른 글
PPT 합치기 (1) | 2022.10.31 |
---|---|
VBA로 메모 일괄 처리하기 (2) | 2022.09.28 |
발표자 보기에서 여러 개의 슬라이드 미리 보기 (2) | 2022.09.12 |
개체 간격 자동으로 배치하기 (0) | 2022.09.07 |
VBA로 이동경로 애니메이션 추가 (0) | 2022.08.30 |
연결된 차트의 시트변경시 연결 자동 복구 (0) | 2022.08.20 |
PPT의 표(테이블)를 엑셀시트에 일괄 복사 (0) | 2022.08.13 |
도형병합(교차)를 이용한 두 도형의 충돌체크 (0) | 2022.08.12 |
최근댓글