こんにちは!日々のスライド作成や資料整理にお追われていませんか?
「気がつけば、100枚超えのスライドがフラットに並んでいて、どこに何があるのか分からない…」
「プレゼンの構成を変えるために、セクションごとにスライドをまとめる作業だけで午前中が潰れてしまった…」
そんな絶望的な状況を、たった一撃で、美しく構造化された状態へと変えてしまう魔法があったら――使いたいと思いませんか?
今回は、マクロの記録から一歩抜け出し、PowerPoint VBAの「本質」をマスターしたいあなたへ贈る極上の知見です。テーマは『Presentation.SectionPropertiesを用いたスライドの自動セクション分割・配属アルゴリズム』。
基礎からしっかりと、でも退屈なリファレンスの引き写しではなく、実務で本当に使える「生きたコード」を一緒に紐解いていきましょう。ここをクリアすれば、あなたのPowerPoint VBAのスキルは確実に中級者の領域へ到達します。さあ、扉を開けましょう!
—
1. なぜ「セクション」と「VBAのオブジェクトモデル」を学ぶのか?
PowerPointの「セクション機能」は、大量のスライドをフォルダーのようにグループ分けして管理できる強力な機能です。しかし、セクションが全く定義されていないバラバラのプレゼンに対して、手動で「右クリック > セクションの追加 > スライドの移動」を繰り返すのは、エンジニアのすることではありません。
ここでPowerPoint VBAの出番です。
VBAを使えば、秒速でスライドのタイトルを読み取り、頭文字(あるいは特定のキーワード)ごとに自動でセクションを切り、適切な場所へスライドを収めることができます。
PowerPointオブジェクトの階層構造(ドミノ倒しのルール)
コードを書く前に、PowerPointの「世界観」を頭に叩き込みましょう。VBAは、親から子へ、子から孫へとドミノを倒すようにオブジェクトを指定していきます。
[Application] (PowerPointアプリ全体)
└─ [Presentations] (開いているプレゼンたち)
└─ [Presentation] (対象のプレゼンファイル)
├─ [Slides] (スライドのコレクション)
│ └─ [Slide] (特定のスライド)
│ └─ [Shapes] (図形やテキストボックスの集まり)
│ └─ [Shape] (タイトルなどの個別の図形)
└─ [SectionProperties] (セクションを管理する特別なプロパティ)
今回の主役は、一番下にいる `SectionProperties` です。こいつを使いこなせるようになると、PowerPointの構造化を完全に出し分けできるようになります。
—
2. 【実務中級】タイトル文字から自動セクション分けするアルゴリズム
それでは、今回のゴールである「セクションが未定義のプレゼンに対し、スライドのタイトルの先頭1文字を基準にセクションを自動生成し、スライドを配属するマクロ」の全コードを公開します。
開発タブのVisual Basic Editorを開き、標準モジュールに以下のコードを貼り付けてください。
実装コード(コピペで即座に動く実用マクロ)
Option Explicit
Sub AutoGroupSlidesByTitle()
‘ =====================================================================
‘ 概要: セクション未定義のプレゼンに対し、スライドタイトルの先頭1文字を
‘ 基準に自動でセクションを新規作成し、スライドを配属するスマート整理術
‘ =====================================================================
Dim pptPres As Presentation
Set pptPres = ActivePresentation
‘ 念のため、現在アクティブなウィンドウが存在するかチェック
If pptPres Is Nothing Then
MsgBox “アクティブなプレゼンテーションがありません。”, vbCritical, “エラー”
Exit Sub
End If
Dim secProps As SectionProperties
Set secProps = pptPres.SectionProperties
‘ 1. すでにセクションが存在している場合、一度すべてクリアするか確認
‘ (安全な運用のために、既存セクションがある場合は処理を中断または初期化します)
If secProps.Count > 0 Then
Dim answer As VbMsgBoxResult
answer = MsgBox(“すでにセクションが存在しています。すべてのセクションを一旦削除して再構築しますか?”, _
vbYesNo + vbExclamation, “セクション再構築の確認”)
If answer = vbYes Then
‘ 末尾から順番にセクションを削除(スライド自体は削除されません)
Dim i As Long
For i = secProps.Count To 1 Step -1
‘ Remove(Index, DeleteSlides) -> Falseにするとスライドは残る
secProps.Remove i, False
Next i
Else
Exit Sub
End If
End If
Dim slideIndex As Long
Dim targetSlide As Slide
Dim slideTitle As String
Dim firstChar As String
Dim currentSectionName As String
Dim newlyCreatedIndex As Long
currentSectionName = “” ‘ 比較用の状態保持変数
‘ 2. 先頭から最後尾のスライドまでループ処理
For slideIndex = 1 To pptPres.Slides.Count
Set targetSlide = pptPres.Slides(slideIndex)
‘ タイトルテキストの取得を試みる(安全策: エラーハンドリング)
slideTitle = “”
On Error Resume Next
If targetSlide.Shapes.HasTitle Then
If targetSlide.Shapes.Title.TextFrame.HasText Then
slideTitle = targetSlide.Shapes.Title.TextFrame.TextRange.Text
End If
End If
On Error GoTo 0
‘ タイトルが空の場合は「未分類」セクション行きとする
If slideTitle = “” Then
firstChar = “未分類”
Else
‘ 先頭の1文字を抽出(必要に応じてトリムや全角半角の統一をすると完璧)
firstChar = Left$(Trim$(slideTitle), 1)
End If
‘ 3. 現在のセクション名と異なる場合、新しいセクションを作成
If firstChar <> currentSectionName Then
currentSectionName = firstChar
‘ セクションを追加する(AddBeforeIndex は「何番目のスライドの直前にセクションを作るか」を指定)
‘ 戻り値として、新しく作成されたセクションのインデックスが返る
newlyCreatedIndex = secProps.AddBeforeIndex(slideIndex)
‘ セクション名を先頭文字に変更
secProps.Name(newlyCreatedIndex) = “【 ” & currentSectionName & ” 】”
End If
‘ ※注意: PowerPoint VBAのセクション管理において、
‘ 新規セクションを追加すると、そのスライドは自動的にそのセクションに属する仕様になっています。
Next slideIndex
MsgBox “スライドの自動セクション整理が完了しました!”, vbInformation, “完了”
End Sub
—
3. コードのキモと、現場で役立つエンジニアの知見
このコードには、ただ動くだけではなく、実務で痛い目を見ないための「プロの知見」がいくつも散りばめられています。
① `Shapes.HasTitle` という「地雷」の回避
PowerPointのスライドレイアウトによっては、「タイトルプレースホルダー」が存在しないものや、削除されているものがあります。
もし、タイトルがないスライドに対して `targetSlide.Shapes.Title` を直接呼び出すと、容赦なく 実行時エラー(オブジェクトがありません) が発生してマクロが強制終了します。
そのため、コード内では以下のように `On Error Resume Next` と `HasTitle` の二重の防御壁を構築しています。
On Error Resume Next
If targetSlide.Shapes.HasTitle Then
If targetSlide.Shapes.Title.TextFrame.HasText Then
slideTitle = targetSlide.Shapes.Title.TextFrame.TextRange.Text
End If
End If
On Error GoTo 0
この「守りのプログラミング」ができるかどうかが、初級者と中級者の分かれ道です。
② `SectionProperties.AddBeforeIndex` のトリッキーな仕様
セクションを操作する際、多くの人が「セクション名リストに足していく」感覚を持ちますが、PowerPointのセクションは「スライドの位置(インデックス番号)」と強く結びついています。
`secProps.AddBeforeIndex(slideIndex)` は、「指定したスライド番号の直前に新しいセクションの切れ目を入れる」という命令です。
これにより、アルファベットや文字の変わり目(`firstChar <> currentSectionName`)が来た瞬間に、そのスライドを先頭にした新しいセクションが自動生成されるというわけです。
—
4. よくあるエラーと「陥りがちな罠」
実際にこのマクロを運用する中で、ユーザーがよくハマるポイントを先回りして解説します。
- Q. 「セクションの最大数を超えました」というエラーが出る
- A. PowerPointには、1つのプレゼンテーション内に作成できるセクションの数に制限はありませんが、スライド枚数以上のセクションを作ることはできません。また、あまりに細かすぎる文字(例えばすべてのスライドの1文字目が違うなど)でグループ化すると、セクションだらけの読みにくいスライドになります。必要に応じて `Left$(…, 2)` にして2文字にしたり、特定のキーワード判定(IF文)にカスタマイズしてください。
- Q. 最初のスライド(表紙など)まで勝手にセクション分けされてしまう
- A. 対策として、ループの開始位置を `2` からにする(`For slideIndex = 2 To pptPres.Slides.Count`)ことで、1枚目の表紙スライドを独立させ、2枚目以降から自動分類のアルゴリズムを走らせるのが実務では一般的です。
—
5. おわりに:ここをクリアすれば、PowerPoint VBAはあなたの武器になる
今回は、`Presentation.SectionProperties` を駆使したスライドの自動セクション整理アルゴリズムを解説しました。
「オブジェクトモデルの階層をたどること」
「エラーが起きうる場所を予測して防御すること」
「手作業の苦痛をロジックでハックすること」
これらは、すべての業務自動化に通じる普遍的なスキルです。ここをクリアしたあなたなら、もうマクロの記録ボタンをポチポチ押すだけのステージにはいません。
ぜひ、ご自身の業務に合わせてこのコードをカスタマイズし、周囲をあっと言わせるような自動化ツールを作り上げてみてください。
それでは、快適なVBAライフを!
