관련: 지식인
파워포인트 슬라이드 페이지번호를 넣을 때 "현재페이지 / 총페이지"로 하는 경우입니다.
1. VBA로 슬라이드마다 '현재페이지 / 총 페이지' 형식으로 페이지번호를 필요할 때마다 넣는 방법
Alt-F11 누르고 메뉴에서 삽입> 모듈 추가한 다음
아래 코드를 넣고 F5키나 일반 슬라이드편집화면에서는 Alt-F8로 매크로를 실행합니다.
아래 매크로는 특히 원하는 페이지부터 1페이지로 시작할 수 있습니다.
.Text = (sld.SlideIndex - PageStart + 1) & " / " & (sld.Parent.Slides.Count - PageStart + 1)
이 부분을 수정하면 원하는 형태로 슬라이드 번호 삽입이 가능합니다.
'시작 페이지 지정
Dim PageStart As Integer
Sub ArrangeSlideNumber()
Dim usr As String
Dim pres As Presentation
Dim sld As Slide
Dim shp As Shape, shpNo As Shape
Dim i As Long
Dim l!, t!, w!, h!
Dim Found As Boolean
Set pres = ActivePresentation
'시작 슬라이드 번호 설정
'ActivePresentation.PageSetup.FirstSlideNumber = 1
usr = InputBox("시작 슬라이드 번호를 입력하세요.(3슬라이드가 1페이지이면 3을 입력):", , 1)
If IsNumeric(usr) Then
PageStart = CLng(usr)
If PageStart < 1 Or PageStart > pres.Slides.Count Then _
MsgBox "슬라이드 범위를 벗어납니다.": Exit Sub
Else
MsgBox "숫자로 입력하세요.": Exit Sub
End If
For Each sld In ActivePresentation.Slides
Found = False
For i = sld.Shapes.Count To 1 Step -1
If sld.Shapes(i).Type = msoPlaceholder Then
If sld.Shapes(i).PlaceholderFormat.Type = ppPlaceholderSlideNumber Then
If sld.SlideIndex < PageStart Then
sld.Shapes(i).Delete
Else
Found = True
AddPageNumber sld.Shapes(i)
End If
End If
End If
Next i
'페이지 번호가 없으면 삽입
If Not Found And sld.SlideIndex >= PageStart Then
Set shpNo = Nothing
With sld.CustomLayout.Shapes.Placeholders
For i = 1 To .Count
If .Item(i).Type = msoPlaceholder Then
If .Item(i).PlaceholderFormat.Type = ppPlaceholderSlideNumber Then
Set shpNo = .Item(i)
Exit For
End If
End If
Next i
End With
'레이아웃에 페이지 번호가 있으면
If Not shpNo Is Nothing Then
l = shpNo.Left
t = shpNo.Top
w = shpNo.Width
h = shpNo.Height
Set shp = sld.Shapes.AddPlaceholder(ppPlaceholderSlideNumber, l, t, w, h)
AddPageNumber shp
End If
End If
Next sld
End Sub
Function AddPageNumber(oShp As Shape)
Dim sld As Slide
Set sld = oShp.Parent
With oShp.TextFrame.TextRange
'.InsertSlideNumber
'.Text = sld.SlideIndex - PageStart + 1 '실제 슬라이드 번호 - 2
.Text = (sld.SlideIndex - PageStart + 1) & " / " & (sld.Parent.Slides.Count - PageStart + 1)
'.Font.Size = 20
'.Font.Name = "Arial"
'.Font.Color.RGB = rgbBlack
End With
End Function
2. 만약 숨겨진 슬라이드를 제외하고 보이는 모든 슬라이드에만 페이지번호를 삽입하려면 아래와 같은 코드로 가능합니다.
'숨겨진 슬라이드 제외하고 모든 슬라이드에 페이지 번호 추가
Sub AddPageNumberExceptHidden()
Dim pres As Presentation
Dim sld As Slide, shp As Shape, shpNo As Shape
Dim p& 'long
Set pres = ActivePresentation
'pres.Designs(1).SlideMaster.HeadersFooters.SlideNumber.Visible = msoTrue
'each slide
p = 1
For Each sld In pres.Slides
'숨겨지지 않은 슬라이드에 한해 페이지 번호 적용
If Not sld.SlideShowTransition.Hidden Then
Set shp = getPageNo(sld)
If shp Is Nothing Then
Set shpNo = getPageNo(sld.CustomLayout)
If Not shpNo Is Nothing Then
With shpNo
Set shp = sld.Shapes.AddPlaceholder(ppPlaceholderSlideNumber, _
.Left, .Top, .Width, .Height)
End With
End If
End If
If Not shp Is Nothing Then
With shp.TextFrame.TextRange
'.InsertSlideNumber '기본 페이지번호
'.Text = sld.sectionIndex & " - " & f '구역번호 - 페이지번호
'.Text = "- " & p & " -" ' 페이지 번호
.Text = getSlideIdx(sld) & " / " & getSlideCnt
'.Font.Name = "Calibri"
'.Font.Size = 12
'.Font.Color = RGB(137, 137, 137)
'.ParagraphFormat.Alignment = ppAlignRight
p = p + 1
End With
End If
End If
Next sld
End Sub
Function getSlideIdx(oSld As Slide)
Dim oPres As Presentation
Dim sld As Slide
Set oPres = oSld.Parent
For Each sld In oPres.Slides
If sld.SlideIndex <= oSld.SlideIndex Then
If Not sld.SlideShowTransition.Hidden Then
getSlideIdx = getSlideIdx + 1
End If
End If
Next sld
End Function
Function getSlideCnt()
Dim sld As Slide
For Each sld In ActivePresentation.Slides
If Not sld.SlideShowTransition.Hidden Then
getSlideCnt = getSlideCnt + 1
End If
Next sld
End Function
'페이지 번호개체 찾기
Function getPageNo(oSld As Variant) As Shape
Dim oShp As Shape
'Debug.Print oSld.Shapes.Placeholders.Count
For Each oShp In oSld.Shapes
If oShp.Type = msoPlaceholder Then
If oShp.PlaceholderFormat.Type = ppPlaceholderSlideNumber Then
Set getPageNo = oShp
Exit For
End If
End If
Next oShp
End Function
3. 간혹 새롭게 페이지번호 형식을 슬라이드 마스터 레이아웃에서 수정해도 반영이 되지 않는 것은
삽입>슬라이드 번호에서 '슬라이드 번호'에 체크를 해제하고 모두 적용한 뒤에
다시 슬라이드 번호에 체크하고 모두 반영해야 적용이 되기 때문입니다.
DeletePageNumber 는 이 과정 대신에 페이지번호를 삭제해줍니다.
추후에 편집에 따라 페이지가 추가되거나 삭제되면 총페이지수가 실시간으로 연동되지 않습니다.
4. 페이지를 추가할 때마다 자동으로 페이지 번호가 변동되게 하려면 VBA로 이벤트를 감시하여 슬라이드 수에 변화가 생길 때마다 '총페이지'를 업데이트 하는 것입니다. 확장자를 .pptm으로 저장해야하고 아래처럼 약간의 코드를 추가해야 합니다.
아래처럼 클래스를 추가하고
Public WithEvents App As PowerPoint.Application
Sub Class_Initialize()
Set App = PowerPoint.Application
End Sub
Sub App_SlideSelectionChanged(ByVal oSldRng As SlideRange)
Call ArrangeSlideNumber
End Sub
모듈 초기화에 아래 내용을 넣고
Dim HostObj As Class1
Sub onLoad()
Set HostObj = New Class1
End Sub
아래 내용을 CustomUI.xml에 추가하여 리본메뉴가 초기화 될 때 onLoad를 실행하게 해서
SlideSelectionChanged 이벤트 클래스가 초기화되로록 합니다.
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui"
onLoad="onLoad" ></customUI>
페이지를 추가/삭제할 때 아래 모듈의 함수로 자동으로 실시간으로 페이지번호가 업데이트 됩니다.
'시작 페이지 지정
Const userStart As Long = 1 '사용자입력할 때는 이 값을 0으로 설정
Dim PageStart As Long
Dim HostObj As Class1
Sub onLoad()
Set HostObj = New Class1
End Sub
Sub ArrangeSlideNumber()
Dim usr As String
Dim pres As Presentation
Dim sld As Slide
Dim shp As Shape, shpNo As Shape
Dim i As Long
Dim l!, t!, w!, h!
Dim Found As Boolean
Set pres = ActivePresentation
'시작 슬라이드 번호 설정
'ActivePresentation.PageSetup.FirstSlideNumber = 1
If userStart > 0 Then
PageStart = userStart
Else
usr = InputBox("시작 슬라이드 번호를 입력하세요.(3슬라이드가 1페이지이면 3을 입력):", , 1)
If IsNumeric(usr) Then
PageStart = CLng(usr)
If PageStart < 1 Or PageStart > pres.Slides.Count Then _
MsgBox "슬라이드 범위를 벗어납니다.": Exit Sub
Else
MsgBox "숫자로 입력하세요.": Exit Sub
End If
End If
For Each sld In ActivePresentation.Slides
Found = False
For i = sld.Shapes.Count To 1 Step -1
If sld.Shapes(i).Type = msoPlaceholder Then
If sld.Shapes(i).PlaceholderFormat.Type = ppPlaceholderSlideNumber Then
If sld.SlideIndex < PageStart Then
sld.Shapes(i).Delete
Else
Found = True
AddPageNumber sld.Shapes(i)
End If
End If
End If
Next i
'페이지 번호가 없으면 삽입
If Not Found And sld.SlideIndex >= PageStart Then
Set shpNo = Nothing
With sld.CustomLayout.Shapes.Placeholders
For i = 1 To .Count
If .Item(i).Type = msoPlaceholder Then
If .Item(i).PlaceholderFormat.Type = ppPlaceholderSlideNumber Then
Set shpNo = .Item(i)
Exit For
End If
End If
Next i
End With
'레이아웃에 페이지 번호가 있으면
If Not shpNo Is Nothing Then
l = shpNo.Left
t = shpNo.Top
w = shpNo.Width
h = shpNo.Height
Set shp = sld.Shapes.AddPlaceholder(ppPlaceholderSlideNumber, l, t, w, h)
AddPageNumber shp
End If
End If
Next sld
End Sub
Function AddPageNumber(oShp As Shape)
Dim sld As Slide
Set sld = oShp.Parent
With oShp.TextFrame.TextRange
'.InsertSlideNumber
'.Text = sld.SlideIndex - PageStart + 1 '실제 슬라이드 번호 - 2
.Text = (sld.SlideIndex - PageStart + 1) & " / " & (sld.Parent.Slides.Count - PageStart + 1)
'.Font.Size = 20
'.Font.Name = "Arial"
'.Font.Color.RGB = rgbBlack
End With
End Function
실행화면 캡쳐:
테스트는 첨부파일을 다운 받고 나서 파일 속성에서 '차단해제' 체크하고 적용하시고
파일이 열릴 때 매크로를 반드시 허용해야 합니다.
'PPT+VBA' 카테고리의 다른 글
미리캔버스 슬라이드마스터 크기, 글꼴, 글머리기호 복구하기 (0) | 2022.06.03 |
---|---|
ppt파일 목차 자동으로 만들기 (0) | 2022.05.23 |
슬라이드 크기 변경할 때 자동으로 개체 가로:세로 비율 적용하기 (0) | 2022.05.18 |
표(테이블)안의 셀 텍스트에 윤곽선 서식 적용하기 (2) | 2022.05.15 |
Euc-kr 및 UTF-8 텍스트 URLEncode (0) | 2022.05.09 |
실시간 네이버 환율 및 유가 JSON 파싱 예제 (0) | 2022.05.03 |
파워포인트로 회의록 작성해서 엑셀에 저장하기 (0) | 2022.04.21 |
슬라이드쇼 2개를 연동해서 실행 (0) | 2022.04.20 |
최근댓글