관련: 지식인

 

 

 

파워포인트 슬라이드 페이지번호를 넣을 때 "현재페이지 / 총페이지"로 하는 경우입니다.

 

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

 

실행화면 캡쳐:

 

 

 

테스트는 첨부파일을 다운 받고 나서 파일 속성에서 '차단해제' 체크하고 적용하시고

파일이 열릴 때 매크로를 반드시 허용해야 합니다.

 

PageNumber_Auto1.pptm
0.11MB