【PowerPoint VBA】スライドを挿入するつどページ総数を更新
- [記事公開]2023.06.09
- VBA
- PowerPoint
Yahoo!知恵袋で答えた中から、PowerPointのイベントを使ったVBAを紹介します。
考えてみると、PowerPointにはExcelのワークシートやThisWorkbookに相当するクラスモジュールは、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を実行すると、Xというクラスモジュールのインスタンスが生成されて、このあとスライドが新たに追加になる都度イベントが発生し、App_PresentationNewSlideで記述した内容が実行されます。つまり、「総スライド挿入」というプログラムが実行される訳です。
このやり方ですと、スライドを削除したときに対応していませんので、数が合わなくなります。そういうときは手動でマクロの実行から「総スライド挿入」を選んで実行させる必要があります。
あるいは、別のイベント(SlideSelectionChangedとか)を入れて対応するのも一つの手だと思うのですが、今回はそこまでは私は書きませんでした(あとは質問者さんが独自に研究してより良い形にしていくだろうと思いましたので)。
今回新たにクラスモジュールを一つ生成しましたが、ActiveXを使えばExcelのSheet1のように、自動でクラスモジュールを挿入することができます。
さすが初心者備忘録さん!customUIでonLoad属性のコールバックを利用するとPowerPointでドキュメントを開いたときからAppicationを使えるようになるので、InitAppを実行するなんてダサいこともしなくて済むようになります。
と言う訳で、なんというか私が記事にするまでもなかったですね^^;すでに初心者備忘録さんがすばらしい記事にしてくださっていますので、PowerPointVBAでイベントを使いたいときはそちらを参照してください。
-
前の記事
無料でできる社会保険労務士相談サービス 2023.06.08
-
次の記事
「ろうむ署に行く」 2023.06.12