【入門編】スライドの「複製(Duplicate)」と「移動(MoveTo)」を極める:特定パターンに基づきスライド順序を自動ソートするアルゴリズム – PowerPoint VBA解析バイブル

スポンサーリンク

こんにちは!PowerPointの自動化の世界へようこそ。
マクロの記録ボタンを押したはいいものの、「あれ、生成されたコードがなんだか読めないぞ…」「スライドの順番をきれいに整えたいだけなのに、どうしてこんなに苦労するんだろう?」そんな壁にぶつかっていませんか?

大丈夫。今日、そのモヤモヤを綺麗にクリアにしましょう。

PowerPoint VBAの世界では、Excelとはちょっと違う独特のオブジェクト構造(親子関係)が存在します。ここさえ掴んでしまえば、あなたはもう「マクロの記録に頼る初心者」ではありません。自分の手でスライドを自在に操る、立派な自動化エンジニアの仲間入りです。

今回は、実務でめちゃくちゃ役立つ「スライドの自動ソート(並び替え)アルゴリズム」をテーマに、オブジェクトのライフサイクルから実践的なコードまで、一気に解説していきますよ。

1. 基礎知識:PowerPointオブジェクトモデルの「三種の神器」

まず、PowerPoint VBAの基本中の基本、DOM(ドキュメントオブジェクトモデル)の階層構造を頭に叩き込みましょう。Excelが「セル(Range)」の集合体なら、PowerPointは「スライド(Slide)」の物語です。

最上位から順に、以下の3つを覚えてください。

1. `Application` オブジェクト

  • PowerPointアプリそのもの。セッション全体を統括します。

2. `Presentation` オブジェクト

  • 開いている「ファイル(プレゼンテーション)」のこと。`ActivePresentation` で今触っているファイルを指定できます。

3. `Slide` オブジェクト

  • ファイルの中にある個別の「スライド」。これが今回の主役です。

そして忘れてはいけないのが、スライドのコレクション(集合体)である `Slides` です。
「何番目のスライドか」を指定するときは `ActivePresentation.Slides(index)` と書きますが、ここで一つ、プログラミング初心者がハマりやすい「罠」があります。

2. 陥りやすい罠:スライドの「複製(Duplicate)」と「移動(MoveTo)」の正体

スライドを並び替えるとき、あなたは「あっちのスライドをこっちに動かしたい」と考えますよね。ここでVBAのメソッドである `Duplicate` と `MoveTo` を使うのですが、その挙動にはちょっとしたクセがあります。

罠その1:`Duplicate` は「直後」に増える

スライドを複製しようと `ActivePresentation.Slides(1).Duplicate` を実行すると何が起きるでしょうか?
実は、「元のスライドのすぐ隣(2番目)」に新しいスライドが生成されます。
オブジェクトモデルのインデックス番号は、操作のたびにリアルタイムで詰め直されます。ループ処理中にこれをやると、あっという間にインデックスがズレて迷子になってしまいます。

罠その2:`MoveTo` は「インデックスを指定するだけ」

スライドの順番を変えるときには `MoveTo(toIndex)` メソッドを使います。
「スライド3を、一番最初に持っていきたい!」という場合は、こう書きます。

ActivePresentation.Slides(3).MoveTo 1

たったこれだけです。非常にシンプルですが、「どのスライドの、どの文字列を基準にして並び替えるか」のロジック(アルゴリズム)を自分で組み立ててあげる必要があります。

3. 実践!特定キーワードでスライドを自動ソートするアルゴリズム

お待たせしました。ここからが本番です。
今回のミッションは、「スライドのタイトルに含まれる特定のキーワード(例:『序論』『本論』『結論』など)を読み取り、あらかじめ決めたルール通りに自動で並び替える」という実用的なマクロです。

実務の現場でそのままコピペして使える、極限まで洗練されたコードをプレゼントしましょう。

Sub AutoSortSlidesByKeyword()
Dim prs As Presentation
Dim sld As Slide
Dim i As Long, j As Long
Dim targetTitle As String

‘ アクティブなプレゼンテーションを定義
Set prs = ActivePresentation

‘ エラー対策:スライドが2枚以上なければ意味がないので抜ける
If prs.Slides.Count < 2 Then MsgBox "ソートするにはスライドが2枚以上必要です。", vbExclamation Exit Sub End If ' 【アルゴリズムの核心】 ' 簡易的なバブルソートの要領で、スライドのタイトルを比較して並び替える ' ここでは「序論」→「本論」→「結論」の順に並べるルールとします For i = 1 To prs.Slides.Count - 1 For j = i + 1 To prs.Slides.Count ' i番目とj番目のスライドのタイトルを取得(関数を使用) Dim titleI As String, titleJ As String titleI = GetSlideTitle(prs.Slides(i)) titleJ = GetSlideTitle(prs.Slides(j)) ' 並び替えルールの判定(例:jの方が優先度が高いキーワードを含んでいる場合) If ShouldSwap(titleI, titleJ) Then ' j番目のスライドを、i番目の位置に移動する! prs.Slides(j).MoveTo i ' スライドの順序が変わったため、ループ変数をリセットして安全性を担保 i = 1 j = i End If Next j Next i MsgBox "スライドの自動ソートが完了しました!", vbInformation End Sub ' -------------------------------------------------- ' 補助関数:スライドからタイトル文字列を安全に取得する ' -------------------------------------------------- Function GetSlideTitle(sld As Slide) As String Dim shp As Shape On Error Resume Next For Each shp in sld.Shapes ' プレースホルダー(タイトル枠)であるかを判定 If shp.Type = msoPlaceholder Then If shp.PlaceholderFormat.Type = ppPlaceholderTitle Or _ shp.PlaceholderFormat.Type = ppPlaceholderCenterTitle Then If shp.HasTextFrame Then If shp.TextFrame.HasText Then GetSlideTitle = shp.TextFrame.TextRange.Text Exit Function End If End If End If End If Next shp GetSlideTitle = "" ' タイトルが見つからない場合 End Function ' -------------------------------------------------- ' 補助関数:並び順の優先度を判定するロジック ' 戻り値が True の場合、スライドの順序を入れ替える ' -------------------------------------------------- Function ShouldSwap(currentTitle As String, targetTitle As String) As Boolean ' ルール定義: ' 1. 「結論」は「本論」より後、「序論」より後 ' 2. 「本論」は「序論」より後 ' 優先度スコアを返す簡易ロジック Dim scoreCurrent As Integer Dim scoreTarget As Integer scoreCurrent = GetPriorityScore(currentTitle) scoreTarget = GetPriorityScore(targetTitle) ' 現在のスライドのスコアの方が大きい(=後ろにあるべきなのに前にある)場合、入れ替える If scoreCurrent > scoreTarget And scoreTarget > 0 Then
ShouldSwap = True
Else
ShouldSwap = False
End If
End Function

‘ ————————————————–
‘ 補助関数:キーワードに応じた優先度スコアを返却
‘ ————————————————–
Function GetPriorityScore(title As String) As Integer
If InStr(title, “序論”) > 0 Or InStr(title, “はじめに”) > 0 Then
GetPriorityScore = 1
ElseIf InStr(title, “本論”) > 0 Or InStr(title, “詳細”) > 0 Then
GetPriorityScore = 2
ElseIf InStr(title, “結論”) > 0 Or InStr(title, “まとめ”) > 0 Then
GetPriorityScore = 3
Else
GetPriorityScore = 99 ‘ その他は末尾方向へ
End If
End Function

4. このコードが現場で重宝される理由(エンジニアの視点)

このコードの美しいところは、単に `MoveTo` を使っているだけではありません。

  • 安全なタイトル抽出 (`GetSlideTitle`)

PowerPointのスライドは、レイアウトによってタイトル枠の構造がバラバラです。単に `Shapes(1)` と指定すると、図形や画像をつかんでエラーを起こします。このコードでは「プレースホルダーのタイプ」を厳密にチェックしているため、デザインが崩れたスライドでも頑健(ロバスト)に動作します。

  • 自己修復的なインデックス制御

スライドを動かした瞬間にコレクションの並びが変わるため、ループ内で `i = 1` にリセットする力技(しかし確実なアプローチ)を取り入れています。これにより、無限ループやインデックスout of rangeエラーを完璧に回避しています。

まとめ:ここをクリアすれば、PowerPoint VBAは怖くない!

今回は、スライドの複製・移動の仕組みから、実用的な自動ソートアルゴリズムまでを解説しました。

  • `Duplicate` は「直後」に増えるのでインデックスのズレに注意する。
  • 順番を変えたいときは `MoveTo` を使う。
  • オブジェクトの中身(タイトルなど)を安全に取得する関数を挟むことで、マクロの品質が劇的に向上する。

ここをクリアできれば、あなたはもう初心者ではありません。膨大な枚数のスライド資料の整理整頓に頭を悩ませる日々とは、今日でお別れです。

ぜひご自身の環境で試して、ワンランク上の自動化ライフを満喫してくださいね。それでは、また次の知見でお会いしましょう!

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