배움터  
  HOME > 배움터 > Daily Tip
Daily Tip

제품:   PowerPoint 버전:   공통
검색어:   ActiveSlide
제목:   파워포인트 VBA에서 ActiveSlide가 없어 당하는 황당함
     
 

New Page 2
  STEP> 따라하기


※ 아래 Daily Tip은 곽승주님이 제공해주신 내용입니다

파워포인트는 엑셀 다음으로 많이 사용하는 오피스 프로그램입니다. 그런데 파워포인트의 VBA에 대해서는 엑셀만큼 다루거나 관심을 가진 분은 그리 많지 않은 듯 합니다. 구글로 검색해보면 엑셀관련 VBA가 가장 많은 듯하고 그 다음은 액세스, 워드(해외에서는 워드를 많이 사용하니까) 그리고 파워포인트와 프런트페이지가 다음 순서입니다.

'파워포인트가 더 이상 애드인이 필요 없을 정도로 너무 완벽하여 VBA에 대한 필요성을 느끼지 못하나 보다!' 라고 생각하진 않습니다. 아무래도 VBA에 대한 편식떄문이겠죠.

오늘은 파워포인트에서 현재 모니터를 통해 보고 있는 슬라이드를 참조하는 것에 대한 이야기를 할까 합니다.

개체의 관점에서 보면 재미있게도 엑셀과 파워포인트는 비슷한 레벨의 개체를 가지고 있습니다. 둘 다 Application이라는 최상위 개체를 가지고 있습니다. 이것은 해당 응용프로그램을 가리키는 개체입니다.

그 하위개체로 엑셀은 Workbook 관련 개체(Workbooks, ThisWorkbook, ActiveWorkbook,...)가 있습니다. 엑셀의 워크북에 해당하는 파워포인트 개체로는 Presentation개체가 있습니다.

다시 그 하위개체로 엑셀은 Sheet 관련 개체를 가지고 있죠. Worksheets, Sheets, ActiveSheet 등등. 그와 대응하여 파워포인트는 Slide 관련 개체를 가지고 있습니다.

그런데 엑셀의 Sheet 관련개체 중 현재의 시트를 가리키는 ActiveSheet에 해당하는 개체가 파워포인트에는 없습니다. 즉 ActiveSlide 같은 개체가 있을 것 같은데, 이것이 없습니다.

따라서 현재 슬라이드를 참조하여 뭔가 작업을 하려니 막막해집니다. 소도 비빌 언덕이 있어야 비비죠? 참조를 하려면 Slides라는 컬렉션 개체를 이용해야 합니다.

컬렉션 개체에서 특정 구성요소를 액세스하기 위해서는 Index 또는 이름을 주어야 합니다. 몇 번째 슬라이드 또는 무슨 무슨 슬라이드 등등.

개체가 없으니 만들어서 써야겠죠. 다음은 현재 슬라이드를 돌려주는 ActiveSlide()라는 함수입니다.

'// 현재 슬라이드 참조함수
Function ActiveSlide() As Slide
On Error GoTo ErrHandler
Set ActiveSlide = ActivePresentation.Slides _
(ActiveWindow.View.Slide.Name)
Exit Function

ErrHandler:
Set ActiveSlide = Nothing
End Function

위의 함수에서 눈 여겨 볼 부분은 ActivePresentation.Slides(ActiveWindow.View.Slide.Name)입니다. 현재 슬라이드를 찾으려면 당연히 현재의 프리젠테이션을 먼저 찾아야 합니다. 다행히 ActivePresentation이라는 개체가 있군요.

그리고 그 밑에는 여러 장의 슬라이드가 있을 테니 'Slides'라는 컬렉션 개체가 있습니다. 컬렉션에서 이름이나 인덱스번호를 주어 하나의 개체를 얻어오는 데, 여기에서는 슬라이드의 이름을 사용하여 개체를 얻어옵니다.

슬라이드의 이름은 ActiveWindow.View.Slide.Name를 통해 얻어옵니다. 현재 윈도우에서 슬라이드 이름을 다행히 제공해줍니다.결국 현재프리젠테이션의 슬라이드 컬렉션에 슬라이드 이름을 주어 현재 슬라이드 개체를 받아 오게 됩니다.

그러면 이를 응용하여 하나 더 생각해보도록 하겠습니다. 만일 슬라이드 내 Shape를 조작해야 한다면 선택한 Shape개체를 얻어와야 합니다. 이것 역시 비숫한 논리로 구현합니다.

위의 ActiveSlide()함수와 같은 방식으로 얻어 온 현재 슬라이드에서 Shapes컬렉션으로 접근하고 선택한 Shape의 이름의 지정합니다. 선택한 Shape의 이름은 ActiveWindow.Selection.ShapeRange.Name 입니다.

다음은 ActiveShape()라는 함수입니다.

// 현재 Shape 참조함수
Function ActiveShape() As Shape
On Error GoTo ErrHandler
Set ActiveShape = ActivePresentation.Slides( _
ActiveWindow.View.Slide.Name).Shapes _
(ActiveWindow.Selection.ShapeRange.Name)
Exit Function

ErrHandler:
Set ActiveShape = Nothing
End Function

'다시 한번 느끼는 점이지만 VBA는 VB보다 열악한 프로그래밍 환경을 지원합니다. 그러나 이를 탓하기보다는 극복하기 위한 나름의 재미가 있습니다. 제한된 환경에서 그 성능을 최대한 끌어 올리는 재미 말이죠.