PowerPointには、Wordのようにボタン一つで目次を自動生成する標準機能はありません。しかし、VBA(マクロ)やPythonスクリプトを利用することで、各スライドのタイトルを抽出して目次ページを自動で作成することが可能です。
実行手順
- VBAエディタを開く
- 目次を生成したいPowerPointファイルを開きます。
- キーボードで
Alt
+F11
を押して、VBAエディタを開きます。
- モジュールの挿入
- VBAエディタのメニューバーから「挿入」→「標準モジュール」を選択します。
- コードの貼り付け
- 表示された白い画面(コードウィンドウ)に、後述のVBAコードをそのままコピー&ペーストします。
- マクロの実行
- VBAエディタのメニューバーから「実行」→「Sub/ユーザーフォームの実行」(またはキーボードで
F5
)を押します。
- VBAエディタのメニューバーから「実行」→「Sub/ユーザーフォームの実行」(またはキーボードで
- 完了
- プレゼンテーションの2ページ目に、各スライドのタイトルとページ番号が記載され、クリックするとそのページにジャンプできる目次スライドが自動で作成・更新されます。
Sub CreateTableOfContents()
' === 設定項目 ===
Const TOC_SLIDE_INDEX As Integer = 2 ' 目次を挿入するスライド番号 (2ページ目)
Const TOC_TITLE As String = "目次" ' 目次スライドのタイトル
' ================
Dim ppt As Presentation
Set ppt = ActivePresentation
Dim tocSlide As Slide
Dim targetShape As Shape
Dim s As Slide
Dim i As Integer
' --- 既存の目次スライドがあれば削除 ---
On Error Resume Next ' スライドが存在しない場合のエラーを無視
ppt.Slides("p_toc_slide").Delete
On Error GoTo 0
' --- 新しい目次スライドを挿入 ---
Set tocSlide = ppt.Slides.Add(TOC_SLIDE_INDEX, ppLayoutTitleOnly)
tocSlide.Name = "p_toc_slide" ' 識別用の名前を付ける
tocSlide.Shapes.Title.TextFrame.TextRange.Text = TOC_TITLE
' --- 目次を書き込むテキストボックスを作成 ---
Set targetShape = tocSlide.Shapes.AddTextbox(msoTextOrientationHorizontal, 1 * 72, 1.5 * 72, 14 * 72, 7 * 72)
With targetShape.TextFrame
.MarginBottom = 0
.MarginLeft = 0
.MarginRight = 0
.MarginTop = 0
.WordWrap = msoTrue
With .TextRange.Font
.Name = "メイリオ" ' フォントを指定
.Size = 18 ' フォントサイズを指定
End With
End With
' --- 各スライドのタイトルをループで取得し、目次に追記 ---
For i = 1 To ppt.Slides.Count
Set s = ppt.Slides(i)
' 自分自身(目次スライド)は除外
If s.SlideIndex <> TOC_SLIDE_INDEX Then
' スライドにタイトルが存在する場合のみ処理
If s.Shapes.HasTitle Then
If s.Shapes.Title.TextFrame.HasText Then
Dim titleText As String
titleText = s.Shapes.Title.TextFrame.TextRange.Text
Dim newPara As TextRange
' テキストボックスの末尾に「タイトル タブ ページ番号 改行」を追加
Set newPara = targetShape.TextFrame.TextRange.InsertAfter(titleText & vbTab & s.SlideNumber & vbCrLf)
' ハイパーリンクを設定(追加したテキスト全体ではなく、その段落に設定)
Dim paraToLink As TextRange
Set paraToLink = targetShape.TextFrame.TextRange.Paragraphs(targetShape.TextFrame.TextRange.Paragraphs.Count - 1)
With paraToLink.ActionSettings(ppMouseClick)
.Action = ppActionHyperlink
.Hyperlink.SubAddress = s.SlideID & "," & s.SlideIndex & "," & titleText
End With
End If
End If
End If
Next i
' 最後に余分な改行を削除
If targetShape.TextFrame.TextRange.Characters.Count > 1 Then
targetShape.TextFrame.TextRange.Characters(targetShape.TextFrame.TextRange.Characters.Count, 1).Delete
End If
MsgBox "目次が作成・更新されました。"
End Sub
コメント