June 13, 2016

パワーポイントの総スライド数を思い通りに表示する様々な方法



パワーポイントには総スライド数(総ページ数)を表示する機能がデフォルトでは備わっていません。Google先生にたずねると、大きく分けて次の2つの方法があることがわかります。

  • スライドマスタに手動で入力する
  • VBAを用いて自動挿入する

ただ、既存のVBAでは表現の細かいところに手が届かなかったので、僕なりにいくつかのパターンを用意してみました。総スライド数を表示するまとめページになればと思います。

なお、VBAの動作確認は、2010と2016でしか行っていません。また、マクロの使い方はこの記事を参考にしてください。

スライドマスタ/レイアウトに手動で入力する

自分でスライド数を数え、スライドマスタ、またはレイアウトに直接記載する方法です。一般的に広く知られている方法ですが、いくつかのパターンがあります。

そもそもスライド番号が表示されていない方は、[挿入][スライド番号]とたどり、スライド番号を表示する設定を適用してください。

スライド番号のプレースホルダを直接編集する

01_page_placeholder

「レイアウト」上にあるページ番号のプレースホルダを手動で編集します。プレースホルダについては次の記事を参考にしてください。

[表示]リボンから[スライドマスタ]を開き、総スライド番号を挿入したいレイアウトを探します

02_page_placeholder

スライド番号のプレースホルダに総スライド数を直接入力します。すると、スライド上でも総スライド数が表示された状態になります。

この方法は単純でわかりやすいのですが、表示したいすべての「レイアウト」のスライド番号プレースホルダに対して総数を入力する必要があります。「レイアウト」が少ない場合には有効ですが、「レイアウト」が多い場合はとても面倒です……

スライドを追加したり、あるいは消去したりしたときには当然スライドの総数が変わります。このときは忘れずに手動入力した数値を更新するようにしてください。

スライドマスタに総数表示用のテキストボックスを追加する

スライドマスタは、全「レイアウト」共通の設定をするための機能ですので、これを利用して上のデメリットを解消してみます。

03_slidemaster

「レイアウト」ではなく、上の図のようにスライドマスタをアクティブにします。

04_slidemaster

[挿入]からテキストボックスを追加し、スライド番号のそばに配置します。

05_slidemaster

このテキストボックスに対して総スライド数を入力すれば、すべての「レイアウト」に対して総ページ数を出力することが可能です(上の例ではわかりやすくするため色を付けて大きくしています)。

こうすれば全「レイアウト」に対して総数を入力する必要がなくなり、変更時も一か所だけ修正すれば済みます。ただし、この方法にもいくつかデメリットがあります。

  • すべての「レイアウト」に無条件で追加される
  • センタリングや左揃えに対応できない(スライド番号は桁数が変わるので、基本右揃え限定)
  • “page: 10 of 25″のような出力には対応できない(この場合はスライド番号プレースホルダを直接page: <#> of 25とする)
  • スライドによってページ番号の位置や色を変えたりできない

スライドマスタに記載するということは、ある特定のスライドだけ表示したくない、という部分的な対処に融通が利かなくなります。これに対応するには、新たなスライドマスタを作成する以外方法がありません。

スライド番号を表示したり、非表示にしたりという需要がない場合はこの手法が使えます。

VBAでサクッと自動挿入する

VBAを利用すれば、手動管理という非効率から解放され、マクロを実行するだけで総スライド数を挿入することが可能です。

ただし、自分の思った通りに出力するには、多少なりともコードを編集しなければなりません。ここではなるべくそのステップを踏まなくてもよいよう、いくつかのパターンを用意してみました。

/<総数>で表示するVBAマクロ

Vba01

スラッシュで区切って総スライド数を出力します。適当なマクロを作って、下のコードをCopy&Pasteしてください。

Const DEFAULT_DIVIDER As String = "/"

Sub InsertTotalNumberOfSlides()
    Dim sld As Slide
    Dim shp As Shape
        
    For Each sld In ActivePresentation.Slides
        sld.DisplayMasterShapes = True
      
        For Each shp In sld.Shapes
            If Left(shp.Name, 12) = "Slide Number" Then
                shp.TextFrame.TextRange.Text = sld.SlideNumber & DEFAULT_DIVIDER & ActivePresentation.Slides.Count
            End If
        Next
    Next
End Sub

ディバイダを変えたい場合は、1行目を変更します。

Const DEFAULT_DIVIDER As String = " of "

とすると 12 of 50 となります。

スライドを追加したり、あるいは消去したりしたときには、必ずマクロをもう一度実行してください。

“Slide: 12 of 50 pages”などのようにカスタマイズできるマクロ

Vba02

マクロを実行したときに

  • スライド番号の前に置く文字
  • 区切り記号
  • 総スライド数の後に置く文字

をダイアログで入力することで思い通りに出力することができます。

Const DEFAULT_DIVIDER As String = " of "
Const DEFAULT_PREFIX As String = "Slide: "
Const DEFAULT_POSTFIX As String = " pages"

Sub InsertTotalNumberOfSlides()
    Dim sld As Slide
    Dim shp As Shape
    Dim divider As String
    Dim prefix As String
    Dim postfix As String
        
    divider = InputBox("Enter divider, like /, -, or ""of"", etc. Blank or only space is not allowed.", "Customize Divider", DEFAULT_DIVIDER)
    If divider = "" Or divider = " " Then
        MsgBox ("Blank or space is not allowed as divider")
        Exit Sub
    End If
    
    prefix = InputBox("Enter prefix, like ""Slide"" or ""Page"". This is not mandatory.", "Customize Prefix", DEFAULT_PREFIX)
    postfix = InputBox("Enter postfix, like ""slides"" or ""pages"". This is not mandatory.", "Customize PostFix", DEFAULT_POSTFIX)
    
    For Each sld In ActivePresentation.Slides
        sld.DisplayMasterShapes = True
      
        For Each shp In sld.Shapes
            If Left(shp.Name, 12) = "Slide Number" Then
                Set TextRange = shp.TextFrame.TextRange
                TextRange.Text = prefix & sld.SlideNumber & divider & ActivePresentation.Slides.Count & postfix
            End If
        Next
    Next
End Sub

実行すると次のようなダイアログが順番に出現します。

Vba02_dialog

余白をとりたい場合は、文字の前後にスペースを入れることで調整してください。

総スライド番号を少し小さめに表示するマクロ

Vba03

総スライド番号を控えめに表示し、現在のスライド番号を見やすくしたマクロです。

Const DEFAULT_DIVIDER As String = "/"
Const SCALEDOWN_RATE As Single = 0.7

Sub InsertTotalNumberOfSlides()
    Dim sld As Slide
    Dim shp As Shape
        
    For Each sld In ActivePresentation.Slides
        sld.DisplayMasterShapes = True
      
        For Each shp In sld.Shapes
            If Left(shp.Name, 12) = "Slide Number" Then
                Set TextRange = shp.TextFrame.TextRange
                TextRange.Text = sld.SlideNumber & DEFAULT_DIVIDER & ActivePresentation.Slides.Count
                
                Set charactersRange = TextRange.Characters(InStr(TextRange, DEFAULT_DIVIDER), TextRange.Characters.Count)
                charactersRange.Font.Bold = False
                charactersRange.Font.Size = TextRange.Font.Size * SCALEDOWN_RATE
            End If
        Next
    Next
End Sub

総スライド番号と区切り記号は、もとのスライド番号の70%の大きさで表示されます。0.7という数値を変えることで大きさを調整することができます。

全部入りコード

上の3つのマクロを統合し、実行するSubプロシージャによって出力を変えるようにしたのが下のコードです。実行するSubを選ぶだけで出力をいろいろ試せるので、たぶん便利だと思います(動作確認はしてますが、Debugあんまりしてないので、バグってたら教えてください)。

Const DEFAULT_DIVIDER As String = "/"
Const DEFAULT_PREFIX As String = "Slide: "
Const DEFAULT_POSTFIX As String = " pages"
Const SCALEDOWN_RATE As Single = 0.7

Sub InsertTotalNumber_Slash()
    InsertTotalNumberOfSlides False, False
End Sub

Sub InsertTotalNumber_Custom()
    InsertTotalNumberOfSlides True, False
End Sub

Sub InsertTotalNumber_Custom_Small()
    InsertTotalNumberOfSlides True, True
End Sub

Sub InsertTotalNumber_Slash_Small()
    InsertTotalNumberOfSlides False, True
End Sub

Function InsertTotalNumberOfSlides(bCustom As Boolean, bSmall As Boolean)
    Dim sld As Slide
    Dim shp As Shape
    Dim divider As String
    Dim prefix As String
    Dim postfix As String
        
    divider = DEFAULT_DIVIDER
    prefix = DEFAULT_PREFIX
    postfix = DEFAULT_POSTFIX
        
    If bCustom Then
        divider = InputBox("Enter divider, like /, -, or ""of"", etc. Blank or only space is not allowed.", "Customize Divider", DEFAULT_DIVIDER)
        If divider = "" Or divider = " " Then
            MsgBox ("Blank or space is not allowed as divider")
            Exit Function
        End If
        
        prefix = InputBox("Enter prefix, like ""Slide"" or ""Page"". This is not mandatory.", "Customize Prefix", DEFAULT_PREFIX)
        postfix = InputBox("Enter postfix, like ""slides"" or ""pages"". This is not mandatory.", "Customize PostFix", DEFAULT_POSTFIX)
    End If
    
    For Each sld In ActivePresentation.Slides
        sld.DisplayMasterShapes = True
      
        For Each shp In sld.Shapes
            If Left(shp.Name, 12) = "Slide Number" Then
                Set TextRange = shp.TextFrame.TextRange
                TextRange.Text = prefix & sld.SlideNumber & divider & ActivePresentation.Slides.Count & postfix
                
                If bSmall Then
                    Set charactersRange = TextRange.Characters(InStr(TextRange, divider), TextRange.Characters.Count)
                    charactersRange.Font.Bold = False
                    charactersRange.Font.Size = TextRange.Font.Size * SCALEDOWN_RATE
                End If
            End If
        Next
    Next
End Function

もとに戻すときは

VBAで挿入した総スライド数などをもとに戻すには、[挿入][スライド番号]からスライド番号のチェックを外して適用することで、いったんすべて削除します。

再び同じ手順でスライド番号を挿入すれば、デフォルトの状態に戻すことができます。

おわりに

普段は手動でも事足りると思いますが、スライド総数は変化しやすいので、更新が意外に面倒です。

僕はレイアウトをたくさん作成するので、いちいち手動で更新しているとどこかで忘れてしまう恐れがあります。VBAは一回つくっておけばコピペして実行するだけなので、僕の場合は基本VBAを利用するようにしています。