【極限の自動化】スライドに「魂(ID)」を刻め。VBAで実現するトレーサブルなプレゼン管理術
「全スライドに管理番号を振ってくれ」。上司からそう言われた時、君ならどうする?手動でテキストボックスをコピペして回るのか? それとも、修正のたびに番号がズレる悪夢に耐えるのか?
世界最高峰の自動化現場において、「手作業」は最大のバグだ。
今回は、プレゼンテーション内の全スライドに対し、プログラムが意図した通りに一意のID(管理番号)を付与し、追跡可能な状態へ昇華させるための極限のVBAアーキテクチャを伝授する。これは単なるコードのコピペではない。君の業務を「管理」から「制御」へと変えるための設計論だ。
—
1. なぜ「その場しのぎ」のコードが破滅を招くのか
初心者が書きがちなのは、`ActiveWindow.Selection` を多用し、画面描画を繰り返すコードだ。それはパフォーマンスを著しく低下させるだけでなく、予期せぬ選択解除によって「一部のスライドだけ番号が飛ぶ」という、最も避けるべきデータ不整合を引き起こす。
我々が目指すべきは、「オブジェクトモデルの直接操作」だ。画面を更新せず、メモリ上で完結させ、最後に一気にコミットする。これが堅牢なVBAコードの鉄則である。
—
2. 実装:堅牢かつ保守性の高い「管理番号付与」エンジン
以下のコードは、スライドのノート領域(プレゼンターしか見ないが、追跡には最適)またはフッター領域に、ファイル名と連番を組み合わせた一意なIDを刻印するものだ。
Option Explicit
‘ ———————————————————
‘ 目的: 全スライドに固有のIDを付与し、別名保存する
‘ 設計方針: 画面更新を抑制し、オブジェクトを直接操作する
‘ ———————————————————
Public Sub AssignSlideIDsAndSave()
Dim pptApp As Application: Set pptApp = Application
Dim pres As Presentation: Set pres = pptApp.ActivePresentation
Dim sld As Slide
Dim uniqueID As String
Dim fileName As String
‘ ファイル名から拡張子を除去してプレフィックスを作成
fileName = Left(pres.Name, InStrRev(pres.Name, “.”) – 1)
‘ パフォーマンス向上のため、画面更新を停止
Application.ScreenUpdating = False
On Error GoTo ErrorHandler
For Each sld In pres.Slides
‘ ID生成ロジック: [ファイル名]_[スライド番号]
uniqueID = fileName & “_S-” & Format(sld.SlideIndex, “000”)
‘ スライドのノート領域にIDを書き込む(視覚的なノイズを避けるため)
If sld.NotesPage.Shapes.HasTitle Then
sld.NotesPage.Shapes.Title.TextFrame.TextRange.InsertAfter vbCrLf & “ID: ” & uniqueID
Else
‘ タイトルがない場合はノートの最初のテキストボックスを探索
sld.NotesPage.Shapes.AddTextbox(msoTextOrientationHorizontal, 0, 0, 100, 20).TextFrame.TextRange.Text = “ID: ” & uniqueID
End If
Next sld
‘ 別名保存(バックアップを兼ねる)
pres.SaveCopyAs pres.Path & “\” & fileName & “_Tracked.pptx”
MsgBox “全スライドのID付与と保存が完了しました。”, vbInformation
Exit Sub
ErrorHandler:
MsgBox “エラー発生: ” & Err.Description, vbCritical
Application.ScreenUpdating = True
End Sub
—
3. 現場で生き残るための「3つの極意」
① 「ノート」を戦場にする
なぜスライド本体ではなく「ノート」に書くのか? それは、プレゼン資料の美観を損ねず、かつメタデータとして確実に残るからだ。もし顧客に見せたくない場合は、非表示の隠しシェイプとして管理することも可能だが、まずはノート領域を「システム領域」と定義する習慣をつけよ。
② データベース(Excel/SQL)との連携を見越す
このコードはスライドにIDを刻むだけだが、ここから先は「どのスライドに何が書かれているか」をExcelに抽出するモジュールを連結させるべきだ。`sld.Shapes`をループし、テキストをすべて抽出してIDと紐付ければ、君はプレゼン資料の「検索エンジン」を作ることさえできる。
③ エラーハンドリングは「逃げ」ではなく「防御」
`On Error GoTo ErrorHandler` を入れないコードは、未完成のゴミだ。特にPowerPointは、マスターページや特殊なレイアウトが混在すると容易にオブジェクトアクセスでエラーを吐く。エラーを握りつぶすのではなく、例外が発生した際にどこで止まったかをログに吐き出せるようになれば、君は一人前のエンジニアだ。
—
最後に:自動化の先にあるもの
このスクリプトは、君を「資料作成の奴隷」から「プレゼンテーションの設計者」へと昇格させるための第一歩に過ぎない。
大切なのは、「一度自動化したものは、二度と手動で触らない」という強い意志だ。このコードをベースに、君の現場のルール(例えば「社外秘」という透かしを入れる、更新日時を埋め込む等)を肉付けしてほしい。
システムが君のために働く環境を、君自身の手で構築せよ。それが、エンジニアとしての唯一の正解だ。
