【PowerPoint VBA】スライドを挿入するつどページ総数を更新

Yahoo!知恵袋で答えた中から、PowerPointのイベントを使ったVBAを紹介します。

考えてみると、PowerPointにはExcelのワークシートやThisWorkbookに相当するクラスモジュールは、VBAProjectの中に用意されていないんですね。今さらながら知りました。

ExcelでAlt+F11を押してVBEを開いたところ。VBAProjectのツリーにあらかじめMicrosoft Excel Objectsのフォルダが用意されており、Sheet1やThisWorkbookのクラスモジュールが作成されている。
PowerPointでAlt+F11を押してVBEを開いたところ。VBAProjectのツリーに、何もない。

質問

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14281051139

パワーポイントの総ページ数を自動で変更する方法をがマクロ実行でできると下記よりありサンプルコードを貼付け実行しましたがページ数は変わりません。

下記でなにか手順が抜けているのでしょうか。
https://sys-guard.com/post-14130/

普段はスライドマスターからページ総数のところみ編集しておりますが毎回編集するのが大変だったり、失念します。

また可能であればマクロを実行せずにスライドの追加・削除で自動でページ総数が変更してほしいのですが可能でしょうか。

https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q14281051139

質問者さんが引用しているサイトはこちらです。

上記のサイトはさらにこちら↓のサイトを参考にしているようです。

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

コードを実行する前に、大前提として、

・スライドマスターでスライド番号を挿入している

表示⇒スライドマスター⇒マスターレイアウトで表示される画面。この図のように、スライド番号にチェックが必要。

・スライドでもスライド番号を挿入している

スライドで、挿入⇒テキスト⇒スライド番号の挿入で表示される画面。ここのスライド番号にチェックを入れておく

の2つの操作が必要です。これをやっていなかったら、いくらVBAを実行してもうまくいきません。

「スライドマスターって何?」「スライド番号って何?」という方は、この記事では解説しませんので、ご自身で検索なさってください(不親切ですみません)。

回答

質問者様の最初の質問、なぜうまくいかないのかについては、私は分かりませんでした。私は提示されたサイトのコードを実行してうまくいきましたので。

次の質問である、「マクロを実行せずにスライドの追加・削除で自動でページ総数が変更してほしいのですが可能でしょうか。」については、次のようなコードを考えました。

クラスモジュールを1つ作ります。

Option Explicit
Public WithEvents App As Application    'WithEvents付きでAppを宣言する(App=Application型の変数)


Private Sub App_PresentationNewSlide(ByVal Sld As Slide)
    総スライド挿入  'https://sys-guard.com/post-14130/
                    'で紹介されているコードのまんまです
End Sub

Private Sub Class_Initialize()
    Set App = New Application
End Sub

Private Sub Class_Terminate()
    Set App = Nothing
End Sub

このクラスモジュールの名前をEventClassModuleとします。

イベントApp_PresentationNewSlideの中で呼び出している「総スライド挿入」というプログラムは、質問者さんが引用していたサイトにあったVBAのコードそのままを使っています(なお、そのコードは標準モジュールに記述してあります)。

標準モジュールで、次のように記述します。

Option Explicit
Const DEFAULT_DIVIDER As String = "/"  '仕切り文字
Const SCALEDOWN_RATE As Single = 0.6   'x/Yの Y文字大きさ


Dim X As EventClassModule   'イベント付クラスを呼び出すための変数


Sub 総スライド挿入()
    Dim Sld As Slide
    Dim shp As Shape
    Dim TextRange, charactersRange
    
    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

Public Sub InitApp()
    Set X = New EventClassModule
End Sub

解説

使うときは、まずスライド編集画面でマクロを実行します。

最初にInitAppを実行する

InitAppを実行すると、Xというクラスモジュールのインスタンスが生成されて、このあとスライドが新たに追加になる都度イベントが発生し、App_PresentationNewSlideで記述した内容が実行されます。つまり、「総スライド挿入」というプログラムが実行される訳です。

このやり方ですと、スライドを削除したときに対応していませんので、数が合わなくなります。そういうときは手動でマクロの実行から「総スライド挿入」を選んで実行させる必要があります。

あるいは、別のイベント(SlideSelectionChangedとか)を入れて対応するのも一つの手だと思うのですが、今回はそこまでは私は書きませんでした(あとは質問者さんが独自に研究してより良い形にしていくだろうと思いましたので)。

今回新たにクラスモジュールを一つ生成しましたが、ActiveXを使えばExcelのSheet1のように、自動でクラスモジュールを挿入することができます。

さすが初心者備忘録さん!customUIでonLoad属性のコールバックを利用するとPowerPointでドキュメントを開いたときからAppicationを使えるようになるので、InitAppを実行するなんてダサいこともしなくて済むようになります。

と言う訳で、なんというか私が記事にするまでもなかったですね^^;すでに初心者備忘録さんがすばらしい記事にしてくださっていますので、PowerPointVBAでイベントを使いたいときはそちらを参照してください。