バージョン2003までのPowerPointには目次作成機能がありました。
しかし何故か2007で、目次作成機能は削除されてしまいました。
目次作成を頻繁に行うのなら、やはりマクロで自動作成するほうが便利でしょう。
アクティブスライドの前に目次スライドを作成するマクロ
スライドが1枚選択された状態で以下のマクロを実行すると、そのスライドの前に新規スライドが挿入され、目次が自動的に作成されます。
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枚選択しておいてから実行してください。"
アクティブスライド以降のスライドの、タイトルプレースホルダーに入力されている文字列と、スライド番号が目次項目になります。
サンプルマクロで行っている処理
拙著『いちばんやさしい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マクロ