【実務・中級編】【初心者】プレゼンテーションの各スライドタイトルを自動取得し、目次用スライドを自動生成してから先頭に挿入して保存するマクロ – PowerPoint VBA解析バイブル

スポンサーリンク

技術者諸君、業務自動化の最前線へようこそ。私は、数多の巨大プロジェクトをコードの力でねじ伏せてきたチーフアーキテクトだ。

「目次を作る」という一見単純な作業。これを手作業で行っているうちは、君はまだ「オペレーター」に過ぎない。スライドの順序が変わるたび、タイトルを書き直すたびに、ドキュメントの整合性は崩壊し、ヒューマンエラーという名のバグが混入する。

今日は、PowerPoint VBAを使い、「ドキュメントの構造を解析し、完璧な目次を自動生成し、堅牢に保存する」という、実務直結の自動化術を伝授する。初心者向けと銘打ってはいるが、中身はプロダクション環境に耐えうる「プロの設計思想」を詰め込んだ。

さあ、思考を同期させろ。

—

1. なぜ「手動の目次」は悪なのか

設計の観点から言えば、手動の目次は「データの二重持ち」に他ならない。スライドタイトルという「真実(Source of Truth)」が各ページにあるのに、それを別の場所に転記して管理するのは、データベースの正規化に反する行為だ。

  • 同期の欠如: 本文を直しても目次が古いまま。これは信頼性の欠如を招く。
  • レイアウトの不統一: 手動コピペはフォントやサイズに微妙な差異を生む。
  • 時間の浪費: 100枚のスライドを目次と照らし合わせる時間は、本来戦略を練るために使われるべきだ。

これから紹介するコードは、これらの問題を根絶する。

—

2. 堅牢な目次生成マクロ:アーキテクチャの解説

このマクロには、以下の3つの「プロのこだわり」を組み込んでいる。

1. 既存目次のクリーンアップ: 実行するたびに新しい目次を作るのではなく、古い目次を特定して削除するロジック。
2. プレースホルダーの安全な取得: タイトルが存在しないスライドでエラーを吐かない「防御的プログラミング」。
3. 動的なファイル名生成: 上書きミスを防ぐため、タイムスタンプを付与した保存処理。

実装コード:MasterTOCGenerator

以下のコードを、PowerPointのVBAエディタ(Alt + F11)に貼り付けてほしい。

Option Explicit

‘—————————————————————————————
‘ Procedure : GenerateTableOfContents
‘ Author : 伝説のチーフアーキテクト
‘ Purpose : スライドタイトルを全取得し、先頭に目次スライドを生成・保存する
‘—————————————————————————————
Public Sub GenerateTableOfContents()
Dim targetPres As Presentation
Set targetPres = ActivePresentation

Dim tocSlide As Slide
Dim sld As Slide
Dim slideTitles As Collection
Set slideTitles = New Collection

Dim i As Long
Dim tocText As String
Dim savePath As String

On Error GoTo ErrorHandler

‘ 1. 全スライドを走査し、タイトルを取得(目次候補以外のスライド)
‘ スライド1枚目から順番にタイトルを吸い上げる
For Each sld In targetPres.Slides
‘ スライドにタイトルプレースホルダーが存在するかチェック
If sld.Shapes.HasTitle Then
Dim titleStr As String
titleStr = sld.Shapes.Title.TextFrame.TextRange.Text

‘ 空白タイトルや、既存の「目次」スライドは除外(無限増殖防止)
If Len(Trim(titleStr)) > 0 And titleStr <> “目次” Then
slideTitles.Add titleStr
End If
End If
Next sld

‘ 2. 既存の「目次」スライドがあれば削除する(べき等性の確保)
‘ ※後ろからループを回すのが、オブジェクト削除の定石だ
For i = targetPres.Slides.Count To 1 Step -1
If targetPres.Slides(i).Shapes.HasTitle Then
If targetPres.Slides(i).Shapes.Title.TextFrame.TextRange.Text = “目次” Then
targetPres.Slides(i).Delete
End If
End If
Next i

‘ 3. 先頭に新しい目次スライドを挿入
‘ Layoutは 2 (ppLayoutText) を指定することが多いが、環境に合わせて調整せよ
Set tocSlide = targetPres.Slides.Add(1, ppLayoutText)
tocSlide.Shapes.Title.TextFrame.TextRange.Text = “目次”

‘ 4. 目次テキストの構築
‘ 大量の文字列結合はパフォーマンスに影響するが、目次程度ならシンプルに記述
For i = 1 To slideTitles.Count
tocText = tocText & i & “. ” & slideTitles(i) & vbCrLf
Next i

‘ 5. 目次スライドの本文(Body)に流し込む
‘ 第2シェイプが通常はテキストボックスだが、インデックス指定は本来リスクがある
‘ ここでは実務的に最も一般的な ppLayoutText の構造を採用
With tocSlide.Shapes(2).TextFrame.TextRange
.Text = tocText
.Font.Size = 18 ‘ 視認性を考慮したサイズ調整
End With

‘ 6. 別名で保存(失敗を恐れず、常にバックアップを残す設計)
savePath = targetPres.Path & “\” & _
Left(targetPres.Name, InStrRev(targetPres.Name, “.”) – 1) & _
“_目次付_” & Format(Now, “yyyymmdd_hhnn”) & “.pptx”

targetPres.SaveAs savePath

MsgBox “目次スライドの生成と保存が完了しました。” & vbCrLf & “保存先: ” & savePath, vbInformation

Exit Sub

ErrorHandler:
MsgBox “致命的エラーが発生した。コードを確認せよ。” & vbCrLf & _
“Error: ” & Err.Description, vbCritical
End Sub

—

3. アーキテクトが教える「コードの急所」

このスクリプトをただコピペして満足してはいけない。なぜこの書き方をしているのか、その意図を汲み取れ。

① スライド削除の「逆順ループ」

`For i = targetPres.Slides.Count To 1 Step -1`
これはコレクション操作の鉄則だ。1から順に消すと、消した瞬間に全体のインデックスがズレ、次のスライドをスキップしてしまう。「消すなら後ろから」。これはVBAに限らず、あらゆる言語のリスト操作に共通する作法だ。

② `HasTitle` プロパティの活用

初心者は `sld.Shapes.Title` をいきなり参照して、タイトルがないスライドで実行時エラーを出す。プロは必ず「そこにタイトルが存在するか?」を先に問う。この一行が、深夜の緊急呼び出しを防ぐ。

③ 保存戦略(Immutabilityの模倣)

元のファイルを上書きするのは、自動化において最も危険な行為だ。万が一マクロがバグった際、元のデータを破壊してしまうからだ。タイムスタンプを付与して別名保存する手法は、シンプルだが最も強力なデータ保護策である。

—

4. さらなる高みへ:外部連携と拡張性

君がもし、さらに高度な自動化を目指すなら、以下の拡張を検討せよ。

  • PDF一括変換: `targetPres.ExportAsFixedFormat` を使えば、目次生成からPDF出力までワンクリックで完結する。
  • データベース連携: タイトル一覧をExcelやSQL Serverに書き出し、進捗管理表と同期させる。
  • デザインの自動適用: スライドマスターの特定のレイアウトを `CustomLayout` プロパティで指定し、会社のロゴ入り目次を瞬時に生成する。

結論

業務効率化とは、単に楽をすることではない。「人間がやらなくていいことを、機械に任せ、人間はより創造的な仕事に集中する状態」を作ることだ。

今回提供したマクロは、その第一歩に過ぎない。オブジェクトのライフサイクルを意識し、エラーを予見し、保守性の高いコードを書く。その積み重ねが、君を「ただのプログラマー」から「アーキテクト」へと押し上げる。

このコードをベースに、君の現場に合わせた最強のツールへと昇華させてほしい。健闘を祈る。

タイトルとURLをコピーしました