PowerPoint 2010 기준입니다.

슬라이드1에서 슬라이드2로 Shape 을 복사하는데 
일반 Shape와 마찬가지로 Group인 Shape도 복사 .Copy 붙이기 .Paste는 잘 됩니다만

슬라이드1에서 원래 가지고 있던 그룹개체의 부모 Parent/자식 Child 속성이 사라지는 현상을 알게되었습니다.
다른 버전에서도 이런지는 확인을 못했지만 이 현상을 회피하는 방법을 소개하고자 합니다.

일단, 첨부한 CopyGroup.pptm 을 실행해봅시다.

CopyGroup.pptm


일단 지시하는대로 옵션1과 옵션 2를 클릭해봅시다.
옵션1과 옵션2는 동그라미와 텍스트박스가 합쳐진 그룹입니다. 
각각 Option1 과 Option2 라는 이름을 부여했고 
내부적으로 클릭하면 'ParentGroup'을 이용해 부모그룹의 이름을 검사해서 
끝자리가 1이면 옵션 1을, 2이면 옵션2의 동그라미를 색칠을 하도록 했습니다.
실제로 동그라미나 글씨를 선택하면 동그라미에 색칠이 되면서 선택이 잘 될겁니다.

이제 우측 빨간 버튼을 눌러 단순히 슬라이드 2에 이 옵션창을 복사해봅시다.
주요 코드는 아래와 같습니다.

' 모든 개체 중 이름이 "Option"으로 시작하고 이미 존재하지 않으면 슬라이드2에 복사/붙이기
    For Each shp In sld1.Shapes
        If Left(shp.Name, 6) = "Option" And ExistShape(shp.Name, 2) = False Then
            shp.Copy
            sld2.Shapes.Paste
        End If
    Next 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 Slide
    Dim shp As Shape

    Set sld1 = ActivePresentation.Slides(1)    ' 1번 슬라이드에서
    Set sld2 = ActivePresentation.Slides(3)    ' 3번 슬라이드로 복사 예정
    
    ' 모든 개체 중 이름이 "Option"으로 시작하는 개체를 복사하되 그룹인 경우 그룹으로 재지정
    For Each shp In sld1.Shapes
        If Left(shp.Name, 6) = "Option" And ExistShape(shp.Name, 3) = False Then
            shp.Copy
            With sld2.Shapes.Paste
                ' 만약 그룹 개체이면 Parent/Child 성질을 잃어버리기때문에 이를 방지하고자
                ' 복사된 그룹을 풀었다가 다시 묶어주고 이전 이름을 다시 부여.
                If shp.Type = msoGroup Then .Ungroup.Regroup.Name = shp.Name
            End With
        End If
    Next shp
    ActivePresentation.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