PowerPoint 2010 기준입니다.
슬라이드1에서 슬라이드2로 Shape 을 복사하는데
일반 Shape와 마찬가지로 Group인 Shape도 복사 .Copy 붙이기 .Paste는 잘 됩니다만
슬라이드1에서 원래 가지고 있던 그룹개체의 부모 Parent/자식 Child 속성이 사라지는 현상을 알게되었습니다.
다른 버전에서도 이런지는 확인을 못했지만 이 현상을 회피하는 방법을 소개하고자 합니다.
일단, 첨부한 CopyGroup.pptm 을 실행해봅시다.
일단 지시하는대로 옵션1과 옵션 2를 클릭해봅시다.
옵션1과 옵션2는 동그라미와 텍스트박스가 합쳐진 그룹입니다.
각각 Option1 과 Option2 라는 이름을 부여했고
내부적으로 클릭하면 'ParentGroup'을 이용해 부모그룹의 이름을 검사해서
끝자리가 1이면 옵션 1을, 2이면 옵션2의 동그라미를 색칠을 하도록 했습니다.
실제로 동그라미나 글씨를 선택하면 동그라미에 색칠이 되면서 선택이 잘 될겁니다.
이제 우측 빨간 버튼을 눌러 단순히 슬라이드 2에 이 옵션창을 복사해봅시다.
주요 코드는 아래와 같습니다.
' 모든 개체 중 이름이 "Option"으로 시작하고 이미 존재하지 않으면 슬라이드2에 복사/붙이기For Each shp In sld1.ShapesIf Left(shp.Name, 6) = "Option" And ExistShape(shp.Name, 2) = False Thenshp.Copysld2.Shapes.PasteEnd IfNext shp
보시다시피 복사는 잘 되었습니다만
클릭해보면 아무 반응이 없습니다.
내부적으로 에러가 나고 있습니다.
클릭한 Shape의 ParentGroup 의 이름이 필요한데
복사하면서 Parent 부모가 누군지 정보를 잃어버린 결과입니다.
다음 우측의파란색 버튼을 눌러 약간의 트릭을 써봅시다.
이번에는 첫슬라이드 처럼 잘 작동을 합니다.
설명에 나와있듯이
개체를 복사한 다음에 그룹개체이면
그룹을 임시로 풀었다가 다시 묶어주는 작업을 거쳤습니다.
물론 이름도 이전 이름을 다시 부여해줘야 겠지요.
그룹이 방금 막 지정되었기 때문에 ParentGroup 정보가 살아있어서
슬라이드 1에서 처럼 ParentGroup의 이름을 찾아 끝자리 숫자를 판단해서
동그라미에 색칠이 되어서 옵션의 선택이 잘 됩니다.
이제 우측 녹색 버튼을 눌러 마지막 슬라이드에서 소스를 리뷰해보겠습니다.
빨간 글씨가 가장 핵심입니다.
개체를 Copy 해서 Paste 로 붙이기 한 후에
만일 개체가 그룹 Type 이면
Ungroup 즉, 개체를 풀어주고 다시
Regroup 으로 묶은 다음
Name 즉, 이름은 기존 이름으로 재지정하면
이전 그룹과 똑같은 Parent/Child 속성을 지닌 그룹이 되는 것입니다.
(단, 여기서는 Group 이 한번만 묶여있을 때를 가정했는데
Group이 여러번 겹쳐 있다면 부모의 부모까지 계속 그 과정을 모두 반복해줘야겠습니다.)
아래는 복사하는 서브 루틴의 전체 소스입니다.
Sub CopyShape2()Dim sld1 As Slide, sld2 As SlideDim shp As ShapeSet sld1 = ActivePresentation.Slides(1) ' 1번 슬라이드에서Set sld2 = ActivePresentation.Slides(3) ' 3번 슬라이드로 복사 예정' 모든 개체 중 이름이 "Option"으로 시작하는 개체를 복사하되 그룹인 경우 그룹으로 재지정For Each shp In sld1.ShapesIf Left(shp.Name, 6) = "Option" And ExistShape(shp.Name, 3) = False Thenshp.CopyWith sld2.Shapes.Paste' 만약 그룹 개체이면 Parent/Child 성질을 잃어버리기때문에 이를 방지하고자' 복사된 그룹을 풀었다가 다시 묶어주고 이전 이름을 다시 부여.If shp.Type = msoGroup Then .Ungroup.Regroup.Name = shp.NameEnd WithEnd IfNext shpActivePresentation.SlideShowWindow.View.Next ' 다음 슬라이드로 이동End Sub
(여기서 ExistShape("개체이름", 슬라이드번호) function은
대상 슬라이드에 이미 "개체이름"의 개체가 있는 지를 검사해주는 기능 Function 입니다.)
다른 파워포인트 버전에서는 어떤지 피드백 해주시면 고맙겠습니다.
분명한 것은 최소한 2010에서는
그룹개체을 Copy 외 Paste로 복사하면
Shapes("복사한그룹개체").ParentGroup 을 이용해도 부모개체를 찾을 수가 없었습니다.
또한, 그룹이 분명하지만 만일 Shapes(2).GroupItems(1).Child 이렇게 .Child를 써도 msoFalse 라고 리턴이 될 겁니다.
그룹 개체를 복사할 때는 이를 유의해야겠습니다.
복사할 때는 위처럼 그룹을 풀었다가 다시 묶어주고 이름을 재부여하는 것으로 이러한 현상을 피할 수 있었습니다.
첨부한 pptm 파일을 Alt-F11 로 눌러 소스를 참고하세요.
http://cafe.naver.com/gameppt/124213
'VBA Tipz' 카테고리의 다른 글
파워포인트 VBA로 도트 하트 그리기 (0) | 2022.03.17 |
---|---|
파워포인트 VBA 어디서 배워요? (0) | 2022.03.17 |
파워포인트 VBA 어떻게 시작할까요? (0) | 2022.03.17 |
64비트 호환 API 선언 모음 (0) | 2019.10.29 |
Collection: 배열을 넘어서는 컬렉션 Type 소개 (0) | 2017.01.12 |
for each의 경고 (0) | 2017.01.12 |
VBA 중복되지 않는 랜덤값(숫자) 구하기 (5) | 2016.11.22 |
power point에서 고칠 수 없는 오류가 발생했습니다. 프레젠테이션을 저장하고 power point를 종료한 후 다시 시작하십시오. (3) | 2016.05.19 |
최근댓글