こんにちは。業務自動化の世界へようこそ。
「マクロの記録」ボタンを押すだけの日常から卒業したいと考えたあなたへ。PowerPoint VBAは、単なる「自動化ツール」ではなく、プレゼンテーションという「オブジェクトの海」を自在に操るための羅針盤です。
今回は、現場で必ず直面する「巨大なプレゼン資料を、章(セクション)ごとに切り分けてPDF化したい」という課題を攻略します。手作業でコピペを繰り返すのは今日で最後にしましょう。
—
なぜ「セクション」を意識するのか?
PowerPointには「セクション」という、スライドを束ねる階層構造が存在します。
初心者はスライド番号で管理しようとしますが、資料の順序が入れ替われば番号は崩壊します。「セクション」という論理的な名前をキーにすることこそ、堅牢な自動化への第一歩です。
今回のミッション
1. 全セクションの数を確認する。
2. 各セクションの開始スライドから、次のセクションの直前までを抽出する。
3. 一時的なプレゼンテーション(メモリ上)を作成し、そこにコピーしてPDFとして書き出す。
—
現場で使える「セクション分割PDFエクスポート」コード
このコードは、現在開いているプレゼンテーションの各セクションを、指定したフォルダへ自動的にPDFとして出力します。
Sub ExportSectionsToPDF()
Dim pptApp As Object
Dim targetPres As Presentation
Dim tempPres As Presentation
Dim i As Long, secIndex As Long
Dim exportPath As String
‘ 出力先はデスクトップの「PDF_Export」フォルダ
exportPath = Environ(“USERPROFILE”) & “\Desktop\PDF_Export\”
If Dir(exportPath, vbDirectory) = “” Then MkDir exportPath
Set targetPres = ActivePresentation
‘ セクションをループ(1から順に)
For secIndex = 1 To targetPres.SectionProperties.Count
Dim secName As String
Dim startSlideIndex As Long
Dim slidesCount As Long
secName = targetPres.SectionProperties.Name(secIndex)
startSlideIndex = targetPres.SectionProperties.FirstSlide(secIndex)
‘ セクション内のスライド数を計算
If secIndex < targetPres.SectionProperties.Count Then
slidesCount = targetPres.SectionProperties.FirstSlide(secIndex + 1) - startSlideIndex
Else
slidesCount = targetPres.Slides.Count - startSlideIndex + 1
End If
' --- ここが肝:一時的なプレゼンテーションの作成 ---
' メモリを汚さないよう、必要なスライドだけを別ファイルへコピーする
Set tempPres = Presentations.Add(WithWindow:=msoFalse)
targetPres.Slides.Range(Array(startSlideIndex, slidesCount)).Duplicate.MoveTo toPos:=1
' ※実際にはループでスライドをコピーする方が安全です
For i = 0 To slidesCount - 1
targetPres.Slides(startSlideIndex + i).Copy
tempPres.Slides.Paste
Next i
' PDFとして書き出し
tempPres.SaveAs2 exportPath & Format(secIndex, "00") & "_" & secName & ".pdf", ppSaveAsPDF
' 終了処理:メモリから破棄
tempPres.Close
Next secIndex
MsgBox "全セクションのPDF書き出しが完了しました!", vbInformation
End Sub
---
解説:このコードの「知的なポイント」
1. `WithWindow:=msoFalse` の魔法
`Presentations.Add(WithWindow:=msoFalse)` に注目してください。これを指定することで、画面上にウィンドウを開かずにバックグラウンドで処理させることができます。これにより、処理速度が劇的に向上し、ユーザーが誤って操作するリスクを排除します。
2. オブジェクトのライフサイクル管理
`tempPres.Close` を忘れずに行うことが重要です。VBAでは「開いたものは必ず閉じる」。これを徹底しないと、メモリリークを起こし、PCが重くなる原因になります。
3. 名前付けのルール(ナンバリング)
`Format(secIndex, “00”)` を使っています。これにより、出力ファイルが `1_章.pdf, 2_章.pdf…` と並び、フォルダ内で綺麗にソートされます。些細なことですが、受け取った相手への配慮がプロの仕事です。
—
陥りやすいエラーと回避策
- セクションがない場合:
`targetPres.SectionProperties.Count` が0だとエラーになります。冒頭に `If targetPres.SectionProperties.Count = 0 Then Exit Sub` と入れるだけで、無駄なエラーを回避できます。
- ファイル名に使えない文字:
セクション名に `/` や `:` が入っていると保存時にエラーになります。`Replace(secName, “/”, “_”)` のように、ファイル名として不適切な文字を置換する処理を挟むのがエンジニアの流儀です。
—
次のステップへ
ここまでマスターしたあなたなら、次は「特定のセクションだけを抽出したい」「PDFだけでなく画像でも書き出したい」といった派生形もすぐに作れるはずです。
PowerPoint VBAの世界は、オブジェクト指向の基本を学ぶのに最適です。今回のコードをベースに、自分だけの「最強の自動化ツール」を育ててみてください。
何か詰まったら、いつでも戻ってきてください。私たちは常に、コードの先で待っています。
