Home » パワーポイントマクロ・PowerPoint VBAの使い方 » プレースホルダー » スライド番号付き目次を自動作成するPowerPointマクロ

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

動作検証バージョン:64bit Windows 10 Pro + 32bit PowerPoint(バージョン2002 ビルド12527.20278 Microsoft Store)

バージョン2003までのPowerPointには目次作成機能がありました。

しかし何故か2007で、目次作成機能は削除されてしまいました。

目次作成を頻繁に行うのなら、やはりマクロで自動作成するほうが便利でしょう。

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

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

Sub アクティブスライドの前に目次スライドを作成する()
On Error GoTo ErrHandl

 Dim active_idx As Long
 active_idx = ActiveWindow.Selection.SlideRange.SlideIndex

 With ActivePresentation.Slides
  Dim target_slide As Slide
  Set target_slide = .Add(Index:=active_idx, Layout:=ppLayoutText)
  target_slide.Shapes.Title.TextFrame.TextRange.Text = "目次"

  Dim i As Long
  For i = active_idx + 1 To .Count ' アクティブスライド以降のみを目次に
   Dim txt As String
   With .Item(i)
    If .Shapes.HasTitle Then
     txt = .Shapes.Title.TextFrame.TextRange.Text
     If Trim(txt) = "" Then
      txt = "(タイトルなし)"
     End If
    Else
     txt = "(タイトルなし)"
    End If
    txt = txt & vbTab & .SlideNumber & vbNewLine

    target_slide.Shapes.Placeholders(2).TextFrame _
      .TextRange.InsertAfter NewText:=txt

   End With ' .Item(i)
  Next i

 End With ' ActivePresentation.Slides

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

End Sub

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

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

拙著『いちばんやさしい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参照)。

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つしかないので名前付き引数にする必要はないと言えばないのですが、

長いオブジェクトを取得するコードに、標準引数が以下のようにポツンとかかれていると、
    target_slide.Shapes.Placeholders(2).TextFrame _
      .TextRange.InsertAfter txt
どうもバランスが悪く感じるので、ここでは名前付き引数で指定しています。

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

エラー処理について

スライドが選択されていないときには実行時エラーが発生してしまうので、
  On Error GoTo ErrHandl
  ErrHandl:
   MsgBox "スライドを1枚選択しておいてから実行してください。"
とエラートラップを行っています。

※この記事は、2007年03月26日にオリジナルを公開し、2020年04月06日に全面的に書き直しました。

最終更新日時:2020-04-06 10:17

[スポンサードリンク]

Home » パワーポイントマクロ・PowerPoint VBAの使い方 » プレースホルダー » スライド番号付き目次を自動作成するPowerPointマクロ

「プレースホルダー」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.