こんにちは!パワポ職人の皆さん、日々のプレゼン資料作りでお疲れ様です。
「あー、このスライド、社内用のカンペ(ノート)書いたままだから、外部向けに発表するときは消さなきゃ…」
「えっ、全50ページの中から非公開スライドを一枚ずつ手作業で探して削除するの?勘弁してよ…」
そんな絶望的なルーティンワークに直面したことはありませんか?
マクロの記録ボタンを押しただけでは太刀打ちできない、こうした「現場の泥臭い自動化」こそ、PowerPoint VBA(Visual Basic for Applications)の真骨頂です。
今回は、スピーカーノート(発表者メモ)に仕込んだ「特定の制御タグ」を検知し、不要なスライドをごっそり削ぎ落とした「完全クリーンな公開用プレゼンテーション」を自動生成する、実戦投入レベルのマクロを授けましょう。
ここをクリアすれば、あなたのVBAスキルは「初心者」から「現場を動かす自動化エンジニア」へと一気にステップアップします。さあ、一緒に扉を開けましょう!
—
なぜ「スピーカーノート判定」なのか?
PowerPointの自動化において、スライドの「見た目(シェイプやテキストボックス)」を判定しようとすると、レイアウト崩れやフォントの違いに足元をすくわれます。
しかし、「スピーカーノート(Notes)」に着目するのは実にスマートです。ユーザーは画面を汚さずにメタ情報(制御命令)を仕込むことができ、VBAからも極めて安全にアクセスできます。
今回は、ノートの先頭などに `[PRIVATE]` や `[非公開]` といった制御タグが記述されているスライドを自動検知し、そのページをバッサリと除外して別名で保存するワークフローを構築します。
—
押さえておくべきPowerPoint VBAの基本構造
コードを書く前に、PowerPointのオブジェクト階層の「重み」を少しだけ理解しておきましょう。Excelと違って、PowerPointは「視覚的な並び(インデックス)」と「オブジェクトの生死」が密接に関わっています。
- `ActivePresentation`: 今開いている大元(マスター)のファイル。
- `Presentations.Add`: 新しくまっさらなプレゼンテーションを生み出す呪文。
- `Slide.NotesPage`: スライドの裏側に隠された「ノート」の領域。実はここも立派なシェイプの集合体です。
—
実戦コード:クリーンアップ・パフォーマー
以下のコードを、VBAエディタ(`Alt + F11`)の標準モジュールに貼り付けてください。実務でそのまま使えるよう、エラーハンドリングと丁寧なコメントを仕込んでいます。
Option Explicit
Sub GenerateCleanPresentation()
‘ ==========================================
‘ スピーカーノートのタグを検知し、クリーンな資料を新規作成するマクロ
‘ ==========================================
Dim srcPres As Presentation
Dim newPres As Presentation
Dim srcSlide As Slide
Dim notesText As String
Dim targetTag As String
Dim slideCount As Long
Dim excludedCount As Long
‘ — 1. 設定エリア —
targetTag = “[PRIVATE]” ‘ 除外対象とする制御タグ
Set srcPres = ActivePresentation
‘ 元ファイルが未保存または空の場合はガード
If srcPres.Path = “” Then
MsgBox “一度プレゼンテーションを保存してから実行してください。”, vbExclamation, “警告”
Exit Sub
End If
excludedCount = 0
On Error GoTo ErrorHandler
‘ — 2. 新規プレゼンテーションの作成 —
‘ 元のファイルサイズ(画面比率:16:9や4:3など)をそのまま引き継いで新規作成します
Set newPres = Presentations.Add(srcPres.PageSetup.SlideWidth, srcPres.PageSetup.SlideHeight)
‘ — 3. スライドの全走査とフィルタリング —
For Each srcSlide In srcPres.Slides
‘ スピーカーノートの文字列を取得する(少しコツがいる部分です)
notesText = GetNotesText(srcSlide)
‘ 制御タグが含まれているかチェック
If InStr(1, notesText, targetTag, vbTextCompare) > 0 {
‘ タグが含まれている場合は、新規ファイルへのコピー(追加)をスキップ
excludedCount = excludedCount + 1
} Else {
‘ タグがない健全なスライドのみ、新規プレゼンテーションの末尾に複製する
srcSlide.Copy
newPres.Slides.Paste
‘ 選択状態をクリアしてメモリ負荷を軽減
Application.Windows(1).Selection.Unselect
End If
Next srcSlide
‘ — 4. 結果の保存とフィードバック —
If newPres.Slides.Count > 0 {
Dim savePath As String
savePath = srcPres.Path & “\【公開用】” & Format(Now, “yyyymmdd_hhnnss”) & “.pptx”
newPres.SaveAs savePath
MsgBox “クリーンアップが完了しました!” & vbCrLf & _
“除外されたスライド数: ” & excludedCount & “枚” & vbCrLf & _
“保存先: ” & savePath, vbInformation, “処理成功”
Else
MsgBox “条件に合致するスライドがすべて除外されたため、保存を中止しました。”, vbCritical, “エラー”
newPres.Close
End If
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “システムエラー”
If Not newPres Is Nothing Then newPres.Close False
End Sub
‘ ==========================================
‘ ヘルパー関数:スライドからスピーカーノートのテキストを安全に抽出する
‘ ==========================================
Private Function GetNotesText(targetSlide As Slide) As String
Dim shp As Shape
Dim notesString As String
notesString = “”
‘ ノートページ上のテキストボックスを走査してテキストを結合
On Error Resume Next
For Each shp In targetSlide.NotesPage.Shapes
If shp.HasTextFrame Then
If shp.TextFrame.HasText Then
notesString = notesString & shp.TextFrame.TextRange.Text
End If
End If
Next shp
On Error GoTo 0
GetNotesText = notesString
End Function
—
コードのポイント・知っておくべき技術的極意
1. 画面比率の継承 (`Presentations.Add`)
ただ新しくファイルを作るだけだと、デフォルトの4:3で作成されてしまい、最近主流の16:9のワイド画面が台無しになってしまいます。`srcPres.PageSetup.SlideWidth` を渡すことで、元のデザイン比率を完璧に維持したままクリーン版を生み出します。
2. ノートテキストの取得難所 (`NotesPage`)
PowerPointのノートは「隠しシェイプ」の集合体です。そのため、単純に `srcSlide.Notes` のようなプロパティは存在しません。ヘルパー関数 `GetNotesText` 内で `NotesPage.Shapes` をループし、テキストフレームを持つシェイプの文字列を回収するのが、最も確実でエラーに強い王道のアプローチです。
3. クリップボードを経由したスマートな複製
`srcSlide.Copy` と `newPres.Slides.Paste` の組み合わせにより、アニメーションやグラフィックの位置ズレを一切起こさず、ピクセル単位で完璧な複製を実現しています。
—
陥りやすいエラーと回避のコツ
- エラー:「ファイルが保存されていません」
- 原因: まだ一度も保存していない「新規プレゼンテーション(プレゼンテーション1など)」の状態でマクロを実行すると、保存先のパス(`srcPres.Path`)が取得できずにエラーになります。
- 対策: 必ず一度 `Ctrl + S` などで名前を付けて保存してから実行する習慣をつけましょう。
- 注意点:巨大な画像を含むファイルでの動作
- スライド数が100を超えるような超巨大ファイルでこれを実行すると、クリップボードの連続使用(Copy & Paste)によってメモリが一時的に圧迫されます。もし処理が重いと感じた場合は、処理の合間に `DoEvents` を挟むとOSへの負荷を逃がすことができます。
—
まとめ
いかがでしたでしょうか?
スピーカーノートに特定のタグを仕込むだけで、外部向けのクリーンなプレゼン資料が一瞬で組み上がる——この自動化の快感を一度知ってしまえば、もう二度と手作業でスライドを削除する生活には戻れなくなるはずです。
「面倒な作業はすべてマクロに押し付け、人間はクリエイティブな提案に集中する」。
これこそが、私たちエンジニアが目指すべきワークスタイルの極みです。
あなたのプレゼン業務が、このコードによって劇的に効率化されることを願っています。それでは、次回の極限知見でお会いしましょう!
