이번 미션은 위와 같이 1슬라이드에 프레젠테이션 목차가 있을 때
슬라이드가 추가되거나 삭제될 때 목차슬라이드의 페이지 정보가 자동으로 업데이트되게 만드는 것이 목표입니다.
아래한/글의 경우 도구 > 제목차례 표시를 하고
'차례 만들기' 기능 > '차례 코드로 모으기'를 이용해서 목차 차례를 자동으로 만들 수 있습니다.
MS Word 에서도 위와 비슷한 기능을 지원합니다.
제목 스타일을 지정하고 참조 - 목차 - 사용자 지정 목차 를 선택해서 차례를 만들 수 있습니다.
나중에 아래한/글에서는 차례 새로고침을 누르거나 워드의 경우 필드 업데이트 > 페이지 번호 업데이트를 눌러주면 자동으로 페이지 번호가 수정됩니다.
아쉽지만 파워포인트에서는 제목 차례/ 목차 페이지 번호 업데이트와 같은 기능을 지원하지 않습니다.
파워포인트에서는 VBA를 이용해서 따로 업데이트시켜줘야 합니다.
클래스를 이용해서 슬라이드가 추가되는 이벤트를 감시하다가
페이지수가 변경되면(슬라이드 선택이 바뀌면)
지정해둔 도형 위치의 숫자를 고치는 식으로 만들어야 합니다.
테스트를 위해 첨부파일을 다운받아 파일 속성에서 차단해제 체크/확인한 후
파일을 열 때 매크로를 허용합니다.
그러면 슬라이드를 추가하거나 삭제할 때 1페이지의 목차의 페이지 숫자가 자동으로 변경됩니다.
여기서는 각 구역을 목차, 서론, 본론1, 본론2, 결론으로 나누어 두고 구역내의 페이지 정보로부터 목차의 숫자를 업데이트 시킵니다.
![](https://blog.kakaocdn.net/dn/bGIKqc/btsL07zxQhU/TC2AnNqISN89e3EmjhCybK/img.png)
파워포인트에서는 각 목차의 영역을 구역으로 구분할 수 있으므로 구역(Section) 정보를 이용하도록 했습니다.
서론 구역은 2슬라이드부터 10개의 슬라이드를 가지고 있고
본론1 구역은 12슬라이드부터 10개의 슬라이드가 들어 있습니다. 이 페이지 정보를 목차에 업데이트시킵니다.
내부적인 VBA작동 방식을 알아보겠습니다.
작동방식은 지난 번 자동 페이지 업데이트와 유사합니다.
삽입 > Class 를 하나 삽입하고 아래와 같은 코드를 넣습니다.
클래스가 초기화되면 즉, VBA가 최초 실행되면
App변수에 파워포인트 프로그램을 지정합니다.
그래서 파워포인트 프로그램에서 슬라이드 선택 변동 이벤트가 발생할 때
ArrangeIndex를 실행하도록 합니다.
Pptm파일은 Zip파일 구조인데
그 안에 아래 내용을 CustomUI.xml라는 파일로 내부에 추가하여
(Custom UI Editor 같은 프로그램을 이용)
리본메뉴가 초기화 될 때 onLoad를 실행하게 해서
SlideSelectionChanged 이벤트 클래스가 초기화되로록 합니다.
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="onLoad" ></customUI>
그리고 Module 에는 아래와 같은 코드가 들어 있습니다.
onLoad 에서 Class1의 형태로 HostObj라는 클래스를 하나 지정합니다.
클래스가 초기화되어 Class1의 이벤트가 작동하여 슬라이드 선택 이벤트에 반응하게 됩니다.
ArrangeIndex에서 비로소 1슬라이드의 모든 도형을 순환해서
도형의 이름과 구역의 이름과 같으면
해당 구역의 시작페이지와 페이지 수를 수정해주록 합니다.
SectionProperties 라는 속성값을 주로 이용합니다.
SectionProperties.Name(i), SectionProperties.FirstSlide(1) 나 SectionProperties.SlideCount(1) 과 같이 사용하므로 데이터 형식은 Collection개체의 형태로 보입니다.
3슬라이드를 추가하거나 삭제할 때 목차의 숫자가 바뀌는 실제 화면:
Class1의 코드:
Public WithEvents App As PowerPoint.Application
Sub Class_Initialize()
Set App = PowerPoint.Application
End Sub
'Sub App_PresentationNewSlide(ByVal oSld As Slide)
'
' Call ArrangeSlideNumber
'
'End Sub
Sub App_SlideSelectionChanged(ByVal oSldRng As SlideRange)
Call ArrangeIndex
'Call ArrangeSlideNumber
End Sub
'Sub App_WindowSelectionChange(ByVal oSel As Selection)
'
' Call ArrangeSlideNumber
'
'End Sub
Module 의 코드:
Option Explicit
'목차 페이지 지정
Const IndexPage As Long = 1
'시작 페이지 지정
Const userStart As Long = 1 '사용자입력할 때는 이 값을 0으로 설정
Dim PageStart As Long
Dim HostObj As Class1
Sub onLoad()
Set HostObj = New Class1
End Sub
Sub ArrangeIndex()
Dim prs As Presentation
Dim sld As Slide, shp As Shape
Dim sec As SectionProperties, i As Integer
Set prs = ActivePresentation
Set sec = prs.SectionProperties
Set sld = prs.Slides(IndexPage)
For Each shp In sld.Shapes
'모든 구역 순환, 구역이름과 일치하는 도형에 시작~ 끝 페이지 입력
For i = 1 To sec.Count
If shp.Name Like sec.Name(i) Then
shp.TextFrame.TextRange = sec.FirstSlide(i) & _
" ~ " & sec.FirstSlide(i) + sec.SlidesCount(i) - 1
End If
Next i
Next shp
End Sub
참고로 Module3에는 페이지 번호를 삽입하는 지난 번 코드가 그대로 남아 있습니다.
슬라이드 하단의 페이지 번호도 자동으로 변경되게 할 수도 있습니다.
샘플 파일:
관련: 지식인
'PPT+VBA' 카테고리의 다른 글
텍스트를 여러 장의 자막 슬라이드로 일괄 생성 (0) | 2025.02.05 |
---|---|
파워포인트 모든 도형 모양 종류 및 예약어 목록 (0) | 2025.01.31 |
파워포인트 표의 기존 서식을 유지하면서 엑셀 표 붙여넣기 (0) | 2025.01.11 |
VBA없이 실시간 업데이트 되는 시계 삽입 (0) | 2024.12.25 |
새해 맞이 남은 시간 카운터(타이머)(+남은 시간 계산시 주의할 점) (0) | 2024.12.14 |
[BombGame]클릭했을 때 회전하면서 사라지는 퀴즈게임 자동으로 생성하기 (0) | 2024.11.25 |
빙고판 생성 (및 애니메이션 추가) (1) | 2024.11.20 |
파일 열 때 마지막 편집 슬라이드 위치로 이동하기 (1) | 2024.11.02 |
최근댓글