VBA Macro/VBA PowerPoint

[파워포인트 VBA] 도형(Shape) 개체 다루기

루아흐뉴마 2019. 8. 12. 22:15
반응형

 

파워포인트 VBA에서 도형 개체 다루기

 
  • 이번 포스팅은 파워포인트 VBA를 통해 도형 개체를 다루는 방법이다.
  • 파워포인트에서 다루어지는 대부분의 개체는 도형 개체(Shape Object)이다.
  • 도형 개체에는 그림, 선, 표, 텍스트상자, 차트 등 수없이 많다.
  • 도형 개체가 매우 다양하기 때문에 여기서는 표(Table Object)를 중심으로 설명한다.
  • 이하의 설명은 표 이외의 모든 도형 개체에 적용될 수 있는 내용이다.
  • 여기서 다루는 예제는 기본적으로 마이크로소프트 MSDN의 개체모델을 참고하였다.
  • 파워포인트 개체모델 링크(새창)
  • 해당 링크에서 원하는 Object를 찾으려면 좌측의 Filter by Title에서 Object를 검색하거나
  • 직접 스크롤해서 Object를 찾으면 된다.



  • 테이블 개체(Table Object)는 행과 열로 이루어진 표를 말한다.
  • 구체적으로는 아래 그림과 같은 표를 가리킨다.

 

VBA에서 Table Object 선택하기

 
  • VBA에서 Table Object를 다루기 위해서는 해당 개체를 반환하는 코드가 있어야 한다.
  • Table Object를 반환하는 방법은 몇 가지가 있는데,
  • 아래의 MSDN에서 소개하는 코드의 경우 슬라이드 안에 있는 모든 개체를 순환하면서
  • 그 개체가 Table Object인지 아닌지 확인하는 방식이다.


With ActivePresentation.Slides(1).Shapes '첫 번째(1번) 슬라이드의 모든 개체 중에서,
  For i = 1 To .Count '각 개체를 순환하면서 
    If .Item(i).HasTable Then '개체가 Table인 경우
      .Item(i).ActionSettings(ppMouseClick).Action = ppActionNextSlide '테이블을 클릭했을 때 다음 슬라이드로 넘어가는 액션 설정
    End If
  Next
End With

  • 언뜻 보기에 위 코드는 상당히 깔끔하고 편리한 코드이지만 Table Object를 활용하는 데 있어서 제약이 있다.
  • 위 코드에서는 Table Object를 변수화하지 않았기 때문에 Table Object가 가지고 있는 메서드(Method)나 속성(Property)을 사용할 수 없다.
  • .ActionSettings 속성을 사용할 수 있는 이유는 모든 Shape 개체는 그 속성을 가지고 있기 때문이다.
  • 아래 그림에서 보듯이, item(i).c까지 타이핑 했을 때
  • Table Object가 가지고 있는 Cell 메서드가 없다.
  • 즉, 아직 Table Object가 아닌 것이다. (그냥 Table을 가지고 있는 Shape 개체일 뿐)



  • 물론, 아래 코드와 같이 .Table속성을 줘서 Table Object의 메서드와 속성을 사용할 수는 있다.
  • 다만, 슬라이드를 직접 설정해주어야 하고(ActivePresentation.Slides(1) 부분),
  • 슬라이드 내의 모든 개체를 순환하면서 검사해야 하고,
  • 모든 테이블에 대해서 동일한 작업을 해야 한다는 점이 거슬린다.


Dim i As Long
With ActivePresentation.Slides(1).Shapes '첫 번째(1번) 슬라이드의 모든 개체 중에서,
  For i = 1 To .Count '각 개체를 순환하면서
    If .Item(i).HasTable Then '개체가 Table인 경우
      .Item(i).Table.Cell(1, 1).Shape.TextFrame.TextRange.Text = "Hello World!" '표의 1행 1열에 Hello World! 출력 
	End If
  Next
End With 


매크로 실행 결과

 

 

 



Table Object를 변수로 설정하기

 
  • 앞서 제기된 문제 중 하나를 해결하기 위해 아래 코드와 같이 oTbl 변수를 Table 형식으로 생성한 다음,
  • Table Object를 포함하고 있는 Shape 개체를 oTbl 변수로 설정할 수 있다.
  • 이렇게 하면 oTbl 개체는 Table 형식으로 초기화되어 Table Object의 메서드와 속성을 활용할 수 있게 된다.


Dim oTbl As Table 'oTbl을 테이블 형식의 변수로 설정
Dim i As Long
With ActivePresentation.Slides(1).Shapes
  For i = 1 To .Count
    If .Item(i).HasTable Then '개체가 테이블인 경우
      Set oTbl = .Item(i).Table '해당 개체를 oTbl 변수로 설정
    End If
  Next
End With
oTbl.Cell(1, 1).Shape.TextFrame.TextRange.Text = "Hello World!" '표의 1행 1열에 Hello World! 타이핑


매크로 실행 결과

 

 


선택한 Table Object만 다루기

 
  • 앞선 변수화 문제는 해결하였지만, 여전히 다음과 같은 문제가 있다.
  • 위 코드는 슬라이드 내의 모든 개체를 돌면서 모든 Table Object에 대해 액션을 설정한다.
  • 슬라이드 내에 Table Object가 하나밖에 없다면 괜찮겠지만, 여러 개라면 문제가 될 것이다.
  • 즉, 내가 원하는 Table Object를 마음대로 다룰 수 없다는 의미이다.
  • 내가 원하는 Table Object를 다루기 위해서는 Selection을 Table 개체로 반환하는 코드가 필요하다.
  • 아래 코드와 같이 코드가 다소 길어졌지만, 선택한 Table Object를 자유자재로 다룰 수 있게 되었다.
  • 여기서 가장 핵심적인 코드는 ActiveWindow.Selection.ShapeRange(1)이다.
  • 이 코드는 파워포인트에서 선택한 개체를 반환하는 코드이다.


Option Explicit Sub tblSelection()
Dim oTbl As Table 'oTbl을 테이블 형식의 변수로 설정
Dim oShp As Shape 'oShp를 쉐이프 형식의 변수로 설정
Dim i As Long
On Error Resume Next '오류가 발생해도 무시
Set oShp = ActiveWindow.Selection.ShapeRange(1) '선택한 개체를 oShp로 설정
											    '만약 개체를 선택하지 않았다면 오류 발생(오류코드: -2147188160)
If Err.Number = -2147188160 Then '아무것도 선택하지 않았으면,
  MsgBox ("개체를 선택하세요")
  Exit Sub '매크로 종료
End If
On Error GoTo 0 '오류발생 기능 On

If oShp.Type = msoTable Then '선택한 개체가 테이블이면
  Set oTbl = oShp.Table 'oTbl을 테이블 형식의 oShp 변수로 입력
Else '선택한 개체가 테이블이 아니면
  MsgBox ("표를 선택하세요.") '메시지박스 로드
  Exit Sub '매크로 종료
End If

oTbl.Cell(1, 1).Shape.TextFrame.TextRange.Text = "선택한 표입니다." '표의 1행 1열에 텍스트 출력
End Sub 


매크로 실행 결과

 



 Copyright (2019) Ruahneuma. All Rights Reserved.

 

반응형