SSブログ

PPT スライド番号付き目次を自動作成するPowerPointマクロ [PPT]

PPT スライド番号付き目次を自動作成するPowerPointマクロ

アクティブスライドの前に目次スライドを作成するマクロ

スライドが1枚選択された状態で以下のマクロを実行すると、そのスライドの前に新規スライドが挿入され、目次が自動的に作成されます。

"PPT-2021-5-8 291-1"
PPT-2021-5-8 290-1.jpg
アクティブスライド以降のスライドの、タイトルプレースホルダーに入力されている文字列と、スライド番号が目次項目になります。

サンプルマクロで行っている処理

拙著『いちばんやさしいPowerPoint VBAの教本』のLesson 54で、タイトルをイミディエイトウィンドウに出力するPowerPointマクロを作成しています。

上記のマクロは、その発展形と言えます。

目次用スライドの挿入

まずアクティブなスライドの前に、目次用のスライドの挿入を行います。

目次用スライドの挿入時等に利用するために、アクティブスライドのSlideIndexを取得して、変数active_idxに格納します。

  Dim active_idx As Long

  active_idx = ActiveWindow.Selection.SlideRange.SlideIndex

ここで使っている「ActiveWindow.Selection.SlideRange」は、拙著P.123のワンポイントで簡単にご紹介しているアクティブなスライドを表すSlideRangeオブジェクトを取得するコードです。

SlideRangeオブジェクトはSlidesコレクションとSlideオブジェクトの特徴を併せ持つオブジェクトで、Slideオブジェクトと同様に何枚目のスライドかを表す数値を取得するSlideIndexプロパティを持っています(拙著Lesson 26参照)。

"PPT-2021-5-8 291-2"
PPT-2021-5-8 290-2.jpg
Lesson 29で解説しているSlides.Addメソッドで、アクティブスライドの前に目次作成用のスライドを挿入して、

  With ActivePresentation.Slides

   Dim target_slide As Slide

   Set target_slide = .Add(Index:=active_idx, Layout:=ppLayoutText)




Lesson 53でお伝えしているShapes.Titleプロパティ等を利用して、タイトルを「目次」と設定しています。

   target_slide.Shapes.Title.TextFrame.TextRange.Text = "目次"

目次項目にする文字列の作成

目次用のスライドを挿入したら、アクティブスライド直後から最後のスライドまでFor~Nextループを回して、

  Dim i As Long

  For i = active_idx + 1 To .Count

   Dim txt As String

   With .Item(i)

タイトルプレースホルダーの文字列を変数txtに格納します。タイトルプレースホルダーがないときや、タイトルプレースホルダー内に文字列がない場合には「(タイトルなし)」を代入しています。

    If .Shapes.HasTitle Then

     txt = .Shapes.Title.TextFrame.TextRange.Text

     If Trim(txt) = "" Then

      txt = "(タイトルなし)"

     End If

    Else

     txt = "(タイトルなし)"

    End If

変数txtに格納したタイトルプレースホルダー等の文字列と、スライド番号をタブ文字(vbTab)を挟んで連結し、末尾には改段落するためのvbNewLineを連結します。

    txt = txt & vbTab & .SlideNumber & vbNewLine

タイトルプレースホルダー等の文字列とスライド番号の間に、タブ文字を入れることで、PowerPoint上のルーラーを使ってスライド番号を揃えやすくしています。

目次項目の作成

変数txtが準備できたら、Lesson 46では紹介するに留めているTextRange.InsertAfterメソッドで目次項目を作成しています。

    target_slide.Shapes.Placeholders(2).TextFrame _

      .TextRange.InsertAfter NewText:=txt

TextRange.InsertAfterメソッドの引数は1つしかないので名前付き引数にする必要はないと言えばないのですが、

"PPT-2021-5-8 291-3"
PPT-2021-5-8 290-2.jpg
長いオブジェクトを取得するコードに、標準引数が以下のようにポツンとかかれていると、

    target_slide.Shapes.Placeholders(2).TextFrame _

      .TextRange.InsertAfter txt

どうもバランスが悪く感じるので、ここでは名前付き引数で指定しています。

こういうときにもVBAが、戻り値を使う/使わないに関わらずプロパティやメソッドでも引数を必ずカッコで括るルールだったら良かったのに、と私は感じます。

エラー処理について

スライドが選択されていないときには実行時エラーが発生してしまうので、

  On Error GoTo ErrHandl

  ErrHandl:

   MsgBox "スライドを1枚選択しておいてから実行してください。"

とエラートラップを行っています。
nice!(0)  コメント(0) 
共通テーマ:日記・雑感

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。