こんにちは!PowerPoint VBAの世界へようこそ。
今日は、マクロの記録ボタンを押すだけでは決して辿り着けない、PowerPointの裏側――「実行中のスライドショーを完全に掌握する技術」についてお話しします。
「プレゼンの途中で、ユーザーの回答に応じて見せるスライドを動的に変えたい」
「暴走したスライドショーを、VBAからスマートに強制終了させたい」
そんな現場の切実な要望に応えてくれるのが、今回主役となる `SlideShowWindow`(スライドショーウィンドウ)オブジェクト です。
ここをクリアすれば、あなたのPowerPointは単なる「紙芝居の投影装置」から「インタラクティブなアプリケーション」へと生まれ変わります。
初心者の方にもスッと腹落ちするように、オブジェクトモデルの本質から丁寧にお伝えしていきますね。ここをクリアすれば、PowerPoint VBAの基本はバッチリですよ!
—
1. PowerPointオブジェクトモデルの「階層構造」を掴もう
まず、VBAを書く上で最も重要な心構えをお伝えします。それは「今、自分はどこを操作しているのか」という現在地を常に把握することです。
PowerPointのオブジェクトは、以下のようなピラミッド構造になっています。
Application (PowerPointアプリ全体)
┗ Presentations (開いているプレゼンテーションの集合)
┗ Presentation (特定のファイル)
┣ Slides (スライドの集合)
┃ ┗ Slide (個別のスライド)
┗ SlideShowWindows (現在実行中のスライドショー画面の集合)
┗ SlideShowWindow (特定の実行中ウィンドウ)
┗ View (表示状態や現在のスライドの管理)
普段私たちが編集画面で触っているのは `Presentation` や `Slide` ですが、「スライドショーを実行した瞬間」、世界は `SlideShowWindows` という別次元の空間に移ります。ここを混同すると、「スライドをジャンプさせたいのにエラーが出る!」という罠にハマるのです。
—
2. 実践! `SlideShowWindow` でスライドショーをハックする
それでは、実際にコードを書いてみましょう。
今回は、以下の2つのミッションをクリアするマクロを作成します。
1. 安全装置(強制終了): 現在実行中のスライドショーがあれば、美しく安全に終了させる。
2. 動的ジャンプ: 実行中のスライドショーを維持したまま、特定のページ(例: 5ページ目)へ瞬間移動させる。
究極の制御スクリプト
以下のコードを、標準モジュールに貼り付けてみてください。
Option Explicit
‘ =========================================================================
‘ 処理名: 実行中のスライドショーを指定スライドへ強制ジャンプさせる
‘ 概要 : SlideShowWindowをハックし、裏で実行中のビューを直接書き換える
‘ =========================================================================
Public Sub JumpToSpecificSlide()
Dim targetSlideNum As Long
targetSlideNum = 5 ‘ ここにジャンプしたいスライド番号を指定
‘ 1. 現在、スライドショーが実行されているかチェックする
If ActivePresentation.SlideShowSettings.Run.State = ppShowStateRunning Then
‘ すでに走っている場合の処理へ
End If
‘ もっとスマートな判定:現在アクティブなスライドショーウィンドウが存在するか?
If SlideShowWindows.Count = 0 Then
MsgBox “現在実行中のスライドショーはありません。「F5」キー等で事前に実行してください。”, vbExclamation, “警告”
Exit Sub
End If
On Error GoTo ErrorHandler
‘ 2. 実行中のスライドショーウィンドウ(のViewオブジェクト)を特定して操作する
‘ ★ここが今回のキモです!
Dim targetView As SlideShowView
Set targetView = SlideShowWindows(1).View
‘ 3. 指定したスライドへダイレクトにジャンプ
targetView.GotoSlide targetSlideNum
‘ 4. ついでにウィンドウを確実に前面にアクティブ化する
SlideShowWindows(1).Activate
Exit Sub
ErrorHandler:
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
‘ =========================================================================
‘ 処理名: 実行中のスライドショーを完全強制終了する
‘ 概要 : 暴走したプレゼンや、プログラムから強制的にノーマルの編集画面に戻す
‘ =========================================================================
Public Sub ForceTerminateSlideShow()
‘ スライドショーウィンドウが1つ以上あるか確認
If SlideShowWindows.Count > 0 Then
‘ 最初のスライドショーウィンドウを終了する
SlideShowWindows(1).View.Exit
MsgBox “スライドショーを強制終了しました。”, vbInformation, “完了”
Else
MsgBox “終了すべきスライドショーは実行されていません。”, vbInformation, “通知”
End If
End Sub
—
3. コードの急所:なぜこの書き方なのか?
初心者の方がよくやってしまう間違いと、プロのエンジニアがこの書き方を選ぶ理由を解説します。
罠①: `ActivePresentation.Slides(5).Select` を使ってしまう
編集画面ではこれで動きますが、スライドショー実行中には通用しません。 スライドショーは「別の窓(ウィンドウ)」の世界で動いているからです。
そのため、`SlideShowWindows(1).View.GotoSlide` という専用のルートを通る必要があります。
罠②: `SlideShowWindows.Count` による存在チェックを怠る
もしスライドショーが実行されていない状態で `SlideShowWindows(1)` を呼び出すと、容赦なく 「実行時エラー 9: インデックスが有効範囲にありません」 が発生し、マクロが強制終了します。
現場で使えるコードにするためには、必ず `If SlideShowWindows.Count > 0 Then` で安全確認(ガード節)を挟むのが鉄則です。
—
4. 応用編:条件分岐による「スマート・ナビゲーション」
この `SlideShowWindow` と `View` オブジェクトを使いこなせるようになると、例えば以下のような高度なシステムが作れます。
‘ スライドショー中にユーザーの選択(InputBoxなど)に応じて分岐
Public Sub SmartNavigation()
If SlideShowWindows.Count = 0 Then Exit Sub
Dim userChoice As String
userChoice = InputBox(“どこに移動しますか?” & vbCrLf & “1: 概要へ” & vbCrLf & “2: 詳細データへ”, “ナビゲーション”)
Dim ssv As SlideShowView
Set ssv = SlideShowWindows(1).View
Select Case userChoice
Case “1”
ssv.GotoSlide 2 ‘ 概要スライド
Case “2”
ssv.GotoSlide 10 ‘ 詳細データスライド
Case Else
‘ キャンセルされた場合は何もしない
End Select
End Sub
画面遷移のコントロールをVBAに委譲することで、プレゼンのシナリオを固定化せず、聴衆の反応に合わせた縦横無尽なプレゼンテーションが可能になります。
—
まとめ
今回は、`SlideShowWindow` オブジェクトをハックして、実行中のスライドショーを自由自在にコントロールする方法を解説しました。
- スライドショー中は、通常の編集画面とは別の世界(`SlideShowWindows`)で動いている。
- 画面の操作やジャンプは `SlideShowWindows(1).View` を経由する。
- 実行中かどうかのカウントチェック(ガード節)を忘れない。
ここさえ押さえておけば、PowerPoint VBAの表現力は一気に何倍にも広がります。ぜひご自身の環境でも試して、そのキビキビとした動作を体感してみてください。
あなたのオートメーションライフが、より一層素晴らしいものになりますように。それではまた!
